FIFO 即先进先出队列,FIFO 一般作为不同时钟域的缓冲器。
FIFO 根据读和写的时钟是否为同一时钟分为同步 FIFO 和异步 FIFO 。异步 FIFO 相比同步 FIFO 来说,设计更加复杂一点。
设计 FIFO 的时候一般需要考虑的有两点:
FIFO 的大小就是指双端口 ram 的大小,这个可以根据需要来设置。
FIFO 空满状态的判断通常有两种方法
module fifo
(
clk, rst, wr_en, rd_en, data_in, data_out, empty, full
);
input clk, rst;
input wr_en, rd_en;
input [7:0] data_in;
output [7:0] data_out;
output empty,full;
wire empty, full;
reg [7:0] data_out;
reg [7:0] ram[15:0]; //双端口ram
reg [3:0] wr_ptr, rd_ptr; //写和读指针
reg [3:0] counter; //用来判断空满
always @(posedge clk)
begin
if (!rst)
begin
counter=0;
data_out=0;
wr_ptr=0;
rd_ptr=0;
end
else
begin
case({wr_en, rd_en})
2’b00: counter=counter;
2’b01:
begin
data_out=ram[rd_ptr]; //先进先出,因此读的话依旧按照次序来
counter=counter-1;
rd_ptr=(rd_ptr==15) ?0: rd_ptr+1;
end
2’b10:
begin
ram[wr_ptr]=data_in; //写操作
counter=counter+1;
wr_ptr=(wr_ptr==15) ?0: wr_ptr+1;
end
2’b11
begin
ram[wr_ptr]=data_in; //读写同时进行,此时counter不增加
data_out=ram[rd_ptr];
wr_ptr=(wr_ptr==15) ?0:wr_ptr+1;
rd_ptr=(rd_ptr==15) ?0: rd_ptr+1;
end
endcase
end
end
assign empty=(counter==0)?1:0;
assign full=(counter==15) ?1:0;
endmodule
本文来源于:https://blog.csdn.net/IamSarah/article/details/76022015?ops_request_misc=&request_id=&biz_id=&utm_source=distribute.pc_search_result.none-task