Line 52... |
Line 52... |
reg [AWIDTH-1:0] rd_ptr;
|
reg [AWIDTH-1:0] rd_ptr;
|
|
|
reg block_read;
|
reg block_read;
|
reg block_write;
|
reg block_write;
|
|
|
wire [AWIDTH-1:0] wr;
|
|
wire [AWIDTH-1:0] rd;
|
|
|
|
reg [AWIDTH-1:0] credit_counter;
|
reg [AWIDTH-1:0] credit_counter;
|
|
|
//Write pointer
|
//Write pointer
|
always@(posedge clock or negedge reset)
|
always@(posedge clock or negedge reset)
|
begin
|
begin
|
if (!reset)
|
if (!reset)
|
begin
|
begin
|
wr_ptr <= {(AWIDTH){1'b0}};
|
wr_ptr <= {(AWIDTH){1'b0}};
|
|
mem[0] <= {(DWIDTH){1'b0}};
|
|
mem[1] <= {(DWIDTH){1'b0}};
|
|
mem[2] <= {(DWIDTH){1'b0}};
|
|
mem[3] <= {(DWIDTH){1'b0}};
|
|
mem[4] <= {(DWIDTH){1'b0}};
|
|
mem[5] <= {(DWIDTH){1'b0}};
|
|
mem[6] <= {(DWIDTH){1'b0}};
|
|
mem[7] <= {(DWIDTH){1'b0}};
|
|
mem[8] <= {(DWIDTH){1'b0}};
|
|
mem[9] <= {(DWIDTH){1'b0}};
|
|
mem[10] <= {(DWIDTH){1'b0}};
|
|
|
|
mem[11] <= {(DWIDTH){1'b0}};
|
|
mem[12] <= {(DWIDTH){1'b0}};
|
|
mem[13] <= {(DWIDTH){1'b0}};
|
|
mem[14] <= {(DWIDTH){1'b0}};
|
|
mem[15] <= {(DWIDTH){1'b0}};
|
|
mem[16] <= {(DWIDTH){1'b0}};
|
|
mem[17] <= {(DWIDTH){1'b0}};
|
|
mem[18] <= {(DWIDTH){1'b0}};
|
|
mem[19] <= {(DWIDTH){1'b0}};
|
|
mem[20] <= {(DWIDTH){1'b0}};
|
|
mem[21] <= {(DWIDTH){1'b0}};
|
|
|
|
mem[22] <= {(DWIDTH){1'b0}};
|
|
mem[23] <= {(DWIDTH){1'b0}};
|
|
mem[24] <= {(DWIDTH){1'b0}};
|
|
mem[25] <= {(DWIDTH){1'b0}};
|
|
mem[26] <= {(DWIDTH){1'b0}};
|
|
mem[27] <= {(DWIDTH){1'b0}};
|
|
mem[28] <= {(DWIDTH){1'b0}};
|
|
mem[29] <= {(DWIDTH){1'b0}};
|
|
mem[30] <= {(DWIDTH){1'b0}};
|
|
mem[31] <= {(DWIDTH){1'b0}};
|
|
mem[32] <= {(DWIDTH){1'b0}};
|
|
|
|
|
|
mem[33] <= {(DWIDTH){1'b0}};
|
|
mem[34] <= {(DWIDTH){1'b0}};
|
|
mem[35] <= {(DWIDTH){1'b0}};
|
|
mem[36] <= {(DWIDTH){1'b0}};
|
|
mem[37] <= {(DWIDTH){1'b0}};
|
|
mem[38] <= {(DWIDTH){1'b0}};
|
|
mem[39] <= {(DWIDTH){1'b0}};
|
|
mem[40] <= {(DWIDTH){1'b0}};
|
|
mem[41] <= {(DWIDTH){1'b0}};
|
|
mem[42] <= {(DWIDTH){1'b0}};
|
|
mem[43] <= {(DWIDTH){1'b0}};
|
|
|
|
mem[44] <= {(DWIDTH){1'b0}};
|
|
mem[45] <= {(DWIDTH){1'b0}};
|
|
mem[46] <= {(DWIDTH){1'b0}};
|
|
mem[47] <= {(DWIDTH){1'b0}};
|
|
mem[48] <= {(DWIDTH){1'b0}};
|
|
mem[49] <= {(DWIDTH){1'b0}};
|
|
mem[50] <= {(DWIDTH){1'b0}};
|
|
mem[51] <= {(DWIDTH){1'b0}};
|
|
mem[52] <= {(DWIDTH){1'b0}};
|
|
mem[53] <= {(DWIDTH){1'b0}};
|
|
mem[54] <= {(DWIDTH){1'b0}};
|
|
|
|
mem[55] <= {(DWIDTH){1'b0}};
|
|
mem[56] <= {(DWIDTH){1'b0}};
|
|
mem[57] <= {(DWIDTH){1'b0}};
|
|
mem[58] <= {(DWIDTH){1'b0}};
|
|
mem[59] <= {(DWIDTH){1'b0}};
|
|
mem[60] <= {(DWIDTH){1'b0}};
|
|
mem[61] <= {(DWIDTH){1'b0}};
|
|
mem[62] <= {(DWIDTH){1'b0}};
|
|
mem[63] <= {(DWIDTH){1'b0}};
|
block_write <= 1'b0;
|
block_write <= 1'b0;
|
overflow_credit_error<=1'b0;
|
overflow_credit_error<=1'b0;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
if(block_write)
|
if(block_write)
|
begin
|
begin
|
if(!wr_en)
|
if(!wr_en)
|
|
begin
|
block_write <= 1'b0;
|
block_write <= 1'b0;
|
|
wr_ptr <= wr_ptr + 6'd1;
|
|
end
|
|
//mem[wr_ptr-6'd1]<=data_in;
|
end
|
end
|
else if (wr_en && !f_full)
|
else if (wr_en && !f_full)
|
begin
|
begin
|
block_write <= 1'b1;
|
block_write <= 1'b1;
|
mem[wr_ptr]<=data_in;
|
mem[wr_ptr]<=data_in;
|
wr_ptr <= wr;
|
|
end
|
end
|
|
|
if(wr_en && credit_counter > 6'd55)
|
if(wr_en && credit_counter > 6'd55)
|
begin
|
begin
|
|
|
Line 102... |
Line 173... |
credit_counter <= 6'd55;
|
credit_counter <= 6'd55;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
|
|
if (wr_en && !f_full && !block_write)
|
if((wr_en && !f_full && !block_write) && (rd_en && !f_empty && !block_read))
|
begin
|
|
if(rd_en && !f_empty && !block_read)
|
|
begin
|
begin
|
counter <= counter;
|
if(rd_ptr == 6'd8 || rd_ptr == 6'd16 || rd_ptr == 6'd24 || rd_ptr == 6'd32 || rd_ptr == 6'd40 || rd_ptr == 6'd48 || rd_ptr == 6'd56 || rd_ptr == 6'd63)
|
end
|
credit_counter <= credit_counter - 6'd1 + 6'd8;
|
else
|
else
|
begin
|
credit_counter <= credit_counter - 6'd1;
|
counter <= counter + 6'd1;
|
|
end
|
end
|
|
else if (wr_en && !f_full && !block_write)
|
|
begin
|
credit_counter <= credit_counter - 6'd1;
|
credit_counter <= credit_counter - 6'd1;
|
|
|
end
|
end
|
else if(rd_en && !f_empty && !block_read)
|
else if(rd_en && !f_empty && !block_read)
|
begin
|
begin
|
if(rd_ptr == 6'd8 || rd_ptr == 6'd16 || rd_ptr == 6'd24 || rd_ptr == 6'd32 || rd_ptr == 6'd40 || rd_ptr == 6'd48 || rd_ptr == 6'd56 || rd_ptr == 6'd63)
|
if(rd_ptr == 6'd8 || rd_ptr == 6'd16 || rd_ptr == 6'd24 || rd_ptr == 6'd32 || rd_ptr == 6'd40 || rd_ptr == 6'd48 || rd_ptr == 6'd56 || rd_ptr == 6'd63)
|
|
begin
|
credit_counter <= credit_counter + 6'd8;
|
credit_counter <= credit_counter + 6'd8;
|
|
end
|
|
end
|
|
else
|
|
credit_counter <= credit_counter;
|
|
|
|
if((wr_en && !f_full && !block_write) && (rd_en && !f_empty && !block_read))
|
|
begin
|
|
counter <= counter;
|
|
end
|
|
else if (wr_en && !f_full && !block_write)
|
|
begin
|
|
counter <= counter + 6'd1;
|
|
end
|
|
else if(rd_en && !f_empty && !block_read)
|
|
begin
|
counter <= counter - 6'd1;
|
counter <= counter - 6'd1;
|
end
|
end
|
|
else
|
|
begin
|
|
counter <= counter;
|
|
end
|
|
|
if(counter == 6'd63)
|
if(counter == 6'd63)
|
begin
|
begin
|
f_full <= 1'b1;
|
f_full <= 1'b1;
|
end
|
end
|
Line 144... |
Line 228... |
end
|
end
|
else
|
else
|
begin
|
begin
|
f_empty <= 1'b0;
|
f_empty <= 1'b0;
|
end
|
end
|
|
|
end
|
end
|
end
|
end
|
|
|
//Read pointer
|
//Read pointer
|
always@(posedge clock or negedge reset)
|
always@(posedge clock or negedge reset)
|
Line 170... |
Line 253... |
else
|
else
|
begin
|
begin
|
open_slot_fct<= 1'b0;
|
open_slot_fct<= 1'b0;
|
end
|
end
|
|
|
if(block_read == 1)
|
if(block_read)
|
begin
|
begin
|
if(!rd_en)
|
if(!rd_en)
|
|
begin
|
block_read<= 1'b0;
|
block_read<= 1'b0;
|
|
end
|
data_out <= mem[rd_ptr];
|
|
end
|
end
|
else
|
else
|
if(rd_en && !f_empty)
|
if(rd_en && !f_empty)
|
begin
|
begin
|
rd_ptr <= rd;
|
|
block_read<= 1'b1;
|
block_read<= 1'b1;
|
|
rd_ptr <= rd_ptr+ 6'd1;
|
end
|
end
|
else
|
|
begin
|
|
data_out <= mem[rd_ptr];
|
data_out <= mem[rd_ptr];
|
end
|
|
end
|
end
|
end
|
end
|
|
|
//assign f_empty = ((wr_ptr - rd_ptr) == 6'd0)?1'b1:1'b0;
|
//assign f_empty = ((wr_ptr - rd_ptr) == 6'd0)?1'b1:1'b0;
|
assign wr = (wr_en && !f_full)?wr_ptr + 6'd1:wr_ptr + 6'd0;
|
//assign wr = (wr_en && !f_full)?wr_ptr + 6'd1:wr_ptr + 6'd0;
|
assign rd = (rd_en && !f_empty)?rd_ptr+ 6'd1:rd_ptr + 6'd0;
|
//assign rd = (rd_en && !f_empty)?rd_ptr+ 6'd1:rd_ptr + 6'd0;
|
|
|
endmodule
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|