always @ (posedge clk ornegedge rst_n) begin if(~rst_n) begin fifo_full <= 'b0; endelseif(fifo_read_req && fifo_write_req) begin fifo_full <= fifo_full; endelseif(fifo_read_req) begin fifo_full <= 'b0; endelseif(almost_full && fifo_write_req) begin fifo_full <= 'b1; end end
fifo_read_req && fifo_write_req当读写同时进行时,满信号状态不会改变
almost_full && fifo_write_req当写请求有效且只剩一个空位时,满信号置位
fifo_read_req只要读过一次,不可能满
写地址与数据生成
1 2 3 4 5 6 7 8 9
always @ (posedge clk ornegedge rst_n) begin if(~rst_n) begin ram_write_data <= 'b0; ram_write_addr <= 'b0; endelsebegin ram_write_data <= fifo_write_data; ram_write_addr <= write_point; end end
读指针/地址控制
1 2 3 4 5 6 7 8 9
always @ (posedge clk ornegedge rst_n) begin if(~rst_n) begin read_point <= 'b0; ram_read_addr <= 'b0; endelseif(!fifo_empty && fifo_read_req) begin read_point <= read_point + 1'b1; ram_read_addr <= read_point; end end
!fifo_empty && fifo_read_req当fifo非空时,读fifo
fifo空信号生成
1 2 3 4 5 6 7 8 9 10 11
always @ (posedge clk ornegedge rst_n) begin if(~rst_n) begin fifo_empty <= 1'b1; endelseif(fifo_read_req && fifo_write_req) begin fifo_empty <= fifo_empty; endelseif(fifo_write_req) begin fifo_empty <= 1'b0; endelseif(almost_empty && fifo_read_req) begin fifo_empty <= 1'b1; end end