关于FIFO设计求助 (Verilog)
时间:10-02
整理:3721RD
点击:
小弟是个新手,看了http://info.ec.hc360.com/2009/09/240954138409-3.shtml
及http://www.cicmag.com/Ebook/0709/05.pdf几位前辈的文章,想自己设计异步FIFO,但是双端口RAM小弟不太清楚如何设计,而且在时间模拟的时候如我把空满信号回受到读写端地址产生器中会仿真不出来,不知道是不是结构和想法上有错误,请问各位高手们有没有设计过的异步FIFO可以参考一下的,小弟感激不尽
以下是小弟的源碼
module rwpr(wclk,rclk,wrst,rrst,full,empty,wradd,radd);
input wclk,rclk,full,empty,rrst,wrst;
output reg [4:0]wradd,radd;
always@(posedge[/email] wclk or posedge wrst)//讀地址產生程序
begin
if(wrst)
begin
wradd<=0;
end
else
begin
if(full == 1)//時序模擬實無法接收來自空滿產生程序的訊號
wradd <= wradd;
else
wradd <= wradd+1'b1;
end
end
always@(posedge[/email] rclk or posedge rrst)//寫地址產生程序
begin
if(rrst)
begin
radd<=0;
end
else
begin
if(empty == 1)//時序模擬實無法接收來自空滿產生程序的訊號
radd <= radd;
else
radd <= radd+1'b1;
end
end
endmodule
//空滿標誌產生及讀寫使能信號
module fifo_ctrl(wclk,rclk,wradd,radd,full,empty,en_wr,en_rd);
input wclk,rclk;
input [4:0]wradd,radd;
output reg full=0,empty=1'b1,en_wr=0,en_rd=0;
always@(wradd[/email] or radd)
begin
if((wradd[3:0]==radd[3:0]) && (wradd[4]!= radd[4]))
begin
full=1;
en_wr=0;
en_rd=1;
end
else if (radd==wradd)
begin
empty=1;
en_rd=0;
en_wr=1;
end
else
begin
empty=0;
full=0;
en_rd=1;
en_wr=1;
end
end
endmodule
代码贴出来给大家看看,不要害羞吗,哈哈
另外关于双端口RAM一定要搞清楚的,可以看Xilinx的用户手册,不是很难的说。
我也是新手啊,,,,
不知道这个对你有没有帮助 http://d-waves.blogspot.com/2010/03/fifo.html
异步FIFO地址比较时,应该用格雷码进行同步吧,异步时钟域很危险的。毛刺亚稳态
我觉得异步FIFO最重要的就是两个clock之间的同步问题。
可以用格雷码比较地址产生full、empty信号,如果速度当求不高的话可以简单一点,直接用DFF同步两个clock之间的信号
学习来了
学习中。
thank you
sung上有两片文章关于此的,写的很详细,可以找来看看!
