Line 143... |
Line 143... |
reg r_cmd_sent;
|
reg r_cmd_sent;
|
reg [31:0] fifo_a_reg, fifo_b_reg;
|
reg [31:0] fifo_a_reg, fifo_b_reg;
|
//
|
//
|
reg q_busy;
|
reg q_busy;
|
//
|
//
|
reg [7:0] fifo_a_mem[((1<<(LGFIFOLN+2))-1):0];
|
reg [7:0] fifo_a_mem_0[0:((1<<LGFIFOLN)-1)],
|
reg [7:0] fifo_b_mem[((1<<(LGFIFOLN+2))-1):0];
|
fifo_a_mem_1[0:((1<<LGFIFOLN)-1)],
|
|
fifo_a_mem_2[0:((1<<LGFIFOLN)-1)],
|
|
fifo_a_mem_3[0:((1<<LGFIFOLN)-1)],
|
|
fifo_b_mem_0[0:((1<<LGFIFOLN)-1)],
|
|
fifo_b_mem_1[0:((1<<LGFIFOLN)-1)],
|
|
fifo_b_mem_2[0:((1<<LGFIFOLN)-1)],
|
|
fifo_b_mem_3[0:((1<<LGFIFOLN)-1)];
|
reg [(LGFIFOLN-1):0] fifo_wb_addr;
|
reg [(LGFIFOLN-1):0] fifo_wb_addr;
|
reg [(LGFIFOLN+1):0] rd_fifo_sd_addr;
|
reg [(LGFIFOLN+1):0] rd_fifo_sd_addr;
|
reg [(LGFIFOLN+1):0] wr_fifo_sd_addr;
|
reg [(LGFIFOLN+1):0] wr_fifo_sd_addr;
|
//
|
//
|
reg [(LGFIFOLN+1):0] ll_fifo_addr;
|
reg [(LGFIFOLN+1):0] ll_fifo_addr;
|
Line 523... |
Line 529... |
// Prepare reading of the FIFO for the WB bus read
|
// Prepare reading of the FIFO for the WB bus read
|
// Memory read #1
|
// Memory read #1
|
always @(posedge i_clk)
|
always @(posedge i_clk)
|
begin
|
begin
|
fifo_a_reg <= {
|
fifo_a_reg <= {
|
fifo_a_mem[{ fifo_wb_addr, 2'b00 }],
|
fifo_a_mem_0[ fifo_wb_addr ],
|
fifo_a_mem[{ fifo_wb_addr, 2'b01 }],
|
fifo_a_mem_1[ fifo_wb_addr ],
|
fifo_a_mem[{ fifo_wb_addr, 2'b10 }],
|
fifo_a_mem_2[ fifo_wb_addr ],
|
fifo_a_mem[{ fifo_wb_addr, 2'b11 }] };
|
fifo_a_mem_3[ fifo_wb_addr ] };
|
fifo_b_reg <= {
|
fifo_b_reg <= {
|
fifo_b_mem[{ fifo_wb_addr, 2'b00 }],
|
fifo_b_mem_0[ fifo_wb_addr ],
|
fifo_b_mem[{ fifo_wb_addr, 2'b01 }],
|
fifo_b_mem_1[ fifo_wb_addr ],
|
fifo_b_mem[{ fifo_wb_addr, 2'b10 }],
|
fifo_b_mem_2[ fifo_wb_addr ],
|
fifo_b_mem[{ fifo_wb_addr, 2'b11 }] };
|
fifo_b_mem_3[ fifo_wb_addr ] };
|
end
|
end
|
|
|
// Okay, now ... writing our FIFO ...
|
// Okay, now ... writing our FIFO ...
|
reg pre_fifo_addr_inc_rd;
|
reg pre_fifo_addr_inc_rd;
|
reg pre_fifo_addr_inc_wr;
|
reg pre_fifo_addr_inc_wr;
|
Line 588... |
Line 594... |
pre_fifo_crc_a<= (ll_fifo_wr)&&(ll_out_stb)&&(ll_fifo_wr_state == 2'b01);
|
pre_fifo_crc_a<= (ll_fifo_wr)&&(ll_out_stb)&&(ll_fifo_wr_state == 2'b01);
|
pre_fifo_crc_b<= (ll_fifo_wr)&&(ll_out_stb)&&(ll_fifo_wr_state == 2'b10);
|
pre_fifo_crc_b<= (ll_fifo_wr)&&(ll_out_stb)&&(ll_fifo_wr_state == 2'b10);
|
clear_fifo_crc <= (cmd_stb)&&(i_wb_data[15]);
|
clear_fifo_crc <= (cmd_stb)&&(i_wb_data[15]);
|
end
|
end
|
|
|
|
reg fifo_a_wr, fifo_b_wr;
|
|
reg [3:0] fifo_a_wr_mask, fifo_b_wr_mask;
|
|
reg [(LGFIFOLN-1):0] fifo_a_wr_addr, fifo_b_wr_addr;
|
|
reg [31:0] fifo_a_wr_data, fifo_b_wr_data;
|
|
|
initial fifo_crc_err = 1'b0;
|
initial fifo_crc_err = 1'b0;
|
always @(posedge i_clk)
|
always @(posedge i_clk)
|
begin // One and only memory write allowed
|
begin // One and only memory write allowed
|
|
fifo_a_wr <= 1'b0;
|
|
fifo_a_wr_data <= { ll_out_dat, ll_out_dat, ll_out_dat, ll_out_dat };
|
if ((write_stb)&&(i_wb_addr[1:0]==2'b10))
|
if ((write_stb)&&(i_wb_addr[1:0]==2'b10))
|
{fifo_a_mem[{ fifo_wb_addr, 2'b00 }],
|
begin
|
fifo_a_mem[{ fifo_wb_addr, 2'b01 }],
|
fifo_a_wr <= 1'b1;
|
fifo_a_mem[{ fifo_wb_addr, 2'b10 }],
|
fifo_a_wr_mask <= 4'b1111;
|
fifo_a_mem[{ fifo_wb_addr, 2'b11 }] }
|
fifo_a_wr_addr <= fifo_wb_addr;
|
<= i_wb_data;
|
fifo_a_wr_data <= i_wb_data;
|
else if (pre_fifo_a_wr)
|
end else if (pre_fifo_a_wr)
|
fifo_a_mem[{ ll_fifo_addr }] <= ll_out_dat;
|
begin
|
|
fifo_a_wr <= 1'b1;
|
|
fifo_a_wr_addr <= ll_fifo_addr[(LGFIFOLN+1):2];
|
|
case(ll_fifo_addr[1:0])
|
|
2'b00: fifo_a_wr_mask <= 4'b0001;
|
|
2'b01: fifo_a_wr_mask <= 4'b0010;
|
|
2'b10: fifo_a_wr_mask <= 4'b0100;
|
|
2'b11: fifo_a_wr_mask <= 4'b1000;
|
|
endcase
|
|
end
|
|
|
|
if ((fifo_a_wr)&&(fifo_a_wr_mask[0]))
|
|
fifo_a_mem_0[fifo_a_wr_addr] <= fifo_a_wr_data[7:0];
|
|
if ((fifo_a_wr)&&(fifo_a_wr_mask[1]))
|
|
fifo_a_mem_1[fifo_a_wr_addr] <= fifo_a_wr_data[15:8];
|
|
if ((fifo_a_wr)&&(fifo_a_wr_mask[2]))
|
|
fifo_a_mem_2[fifo_a_wr_addr] <= fifo_a_wr_data[23:16];
|
|
if ((fifo_a_wr)&&(fifo_a_wr_mask[3]))
|
|
fifo_a_mem_3[fifo_a_wr_addr] <= fifo_a_wr_data[31:24];
|
|
|
|
fifo_b_wr <= 1'b0;
|
|
fifo_b_wr_data <= { ll_out_dat, ll_out_dat, ll_out_dat, ll_out_dat };
|
if ((write_stb)&&(i_wb_addr[1:0]==2'b11))
|
if ((write_stb)&&(i_wb_addr[1:0]==2'b11))
|
{fifo_b_mem[{fifo_wb_addr, 2'b00 }],
|
begin
|
fifo_b_mem[{ fifo_wb_addr, 2'b01 }],
|
fifo_b_wr <= 1'b1;
|
fifo_b_mem[{ fifo_wb_addr, 2'b10 }],
|
fifo_b_wr_mask <= 4'b1111;
|
fifo_b_mem[{ fifo_wb_addr, 2'b11 }] }
|
fifo_b_wr_addr <= fifo_wb_addr;
|
<= i_wb_data;
|
fifo_b_wr_data <= i_wb_data;
|
else if (pre_fifo_b_wr)
|
end else if (pre_fifo_b_wr)
|
fifo_b_mem[{ ll_fifo_addr }] <= ll_out_dat;
|
begin
|
|
fifo_b_wr <= 1'b1;
|
|
fifo_b_wr_addr <= ll_fifo_addr[(LGFIFOLN+1):2];
|
|
case(ll_fifo_addr[1:0])
|
|
2'b00: fifo_b_wr_mask <= 4'b0001;
|
|
2'b01: fifo_b_wr_mask <= 4'b0010;
|
|
2'b10: fifo_b_wr_mask <= 4'b0100;
|
|
2'b11: fifo_b_wr_mask <= 4'b1000;
|
|
endcase
|
|
end
|
|
|
|
if ((fifo_b_wr)&&(fifo_b_wr_mask[0]))
|
|
fifo_b_mem_0[fifo_b_wr_addr] <= fifo_b_wr_data[7:0];
|
|
if ((fifo_b_wr)&&(fifo_b_wr_mask[1]))
|
|
fifo_b_mem_1[fifo_b_wr_addr] <= fifo_b_wr_data[15:8];
|
|
if ((fifo_b_wr)&&(fifo_b_wr_mask[2]))
|
|
fifo_b_mem_2[fifo_b_wr_addr] <= fifo_b_wr_data[23:16];
|
|
if ((fifo_b_wr)&&(fifo_b_wr_mask[3]))
|
|
fifo_b_mem_3[fifo_b_wr_addr] <= fifo_b_wr_data[31:24];
|
|
|
if (~r_cmd_busy)
|
if (~r_cmd_busy)
|
ll_fifo_wr_complete <= 1'b0;
|
ll_fifo_wr_complete <= 1'b0;
|
|
|
if (~r_cmd_busy)
|
if (~r_cmd_busy)
|
Line 632... |
Line 683... |
fifo_crc_err <= 1'b0;
|
fifo_crc_err <= 1'b0;
|
end
|
end
|
|
|
always @(posedge i_clk)
|
always @(posedge i_clk)
|
begin // Second memory read, this time for the FIFO
|
begin // Second memory read, this time for the FIFO
|
fifo_a_byte <= fifo_a_mem[ ll_fifo_addr ];
|
case(ll_fifo_addr[1:0])
|
fifo_b_byte <= fifo_b_mem[ ll_fifo_addr ];
|
2'b00: begin
|
|
fifo_a_byte<=fifo_a_mem_0[ll_fifo_addr[(LGFIFOLN+1):2]];
|
|
fifo_b_byte<=fifo_b_mem_0[ll_fifo_addr[(LGFIFOLN+1):2]];
|
|
end
|
|
2'b01: begin
|
|
fifo_a_byte<=fifo_a_mem_1[ll_fifo_addr[(LGFIFOLN+1):2]];
|
|
fifo_b_byte<=fifo_b_mem_1[ll_fifo_addr[(LGFIFOLN+1):2]];
|
|
end
|
|
2'b10: begin
|
|
fifo_a_byte<=fifo_a_mem_2[ll_fifo_addr[(LGFIFOLN+1):2]];
|
|
fifo_b_byte<=fifo_b_mem_2[ll_fifo_addr[(LGFIFOLN+1):2]];
|
|
end
|
|
2'b11: begin
|
|
fifo_a_byte<=fifo_a_mem_3[ll_fifo_addr[(LGFIFOLN+1):2]];
|
|
fifo_b_byte<=fifo_b_mem_3[ll_fifo_addr[(LGFIFOLN+1):2]];
|
|
end
|
|
endcase
|
end
|
end
|
|
|
reg [(LGFIFOLN-1):0] r_blklimit;
|
reg [(LGFIFOLN-1):0] r_blklimit;
|
wire [(LGFIFOLN+1):0] w_blklimit;
|
wire [(LGFIFOLN+1):0] w_blklimit;
|
always @(posedge i_clk)
|
always @(posedge i_clk)
|