感谢ripple的回复和建议!终于看到有人回复了,心里特别的高兴,我以为我写的东西都是垃圾。另外ripple的建议确实很好,尤其是半满半空,读写指针时序关系等。当时写这个的初衷主要是为了描述一个同步FIFO的模型,所以考虑的还不是特别的全面,尤其对于半空半满这个当时根本就没有考虑。关于“正逻辑”,尤其复位信号,因为DFF一般都提供一步复位接口,所以我喜欢低电平的复位信号,至于内部接口用正逻辑,尤其是读写控制信号,当时也只是根据自己的习惯就用了“负逻辑”。Ripple的这些建议如果以后有机会再增加和更改。
我主要使用Quartus II 6.0对代码进行了综合和布局布线,使用Modelsim6.0进行功能和时序仿真,布局布线选用的器件是Cyclone II 系列的EP<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2C5T144C8,没有添加任何约束。下面给出有关综合布局布线以及时序分析的RTL和报告。
图1 RTL顶层图
图1 RTL顶层图,可以对照我刚开始画的原理框图(见<同步FIFO之VHDL描述1>)
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
图2 Fitter报告概要
从图2的Fitter报告概要中可以看出,所用FIFO所用RAM为FPGA内部的RAM资源
图3 时序分析概要报告
布局布线时没有进行任何时序约束,从图3可以看出,这种同步FIFO的VHDL描述可以在EP2C5T144C8运行在150MHz(不知道这样看对不对)。
最后再次感谢ripple!
欢迎大家访问skycanny的笔记(副站)。
用户1268090 2007-2-12 11:20
很高兴能及时看到你的回复.通过你的讲解,对FIFO的认识加深了.
下面再向你请教一个问题啊
众所周知,同步FIFO较异步FIFO更为简单,那么,我的问题是:异步FIFO的主要作用是不是就是跨越时钟域的同步问题,也就是说,在以同步FIFO模块为核心,我只要解决了写模块和读模块的时钟同步问题,就容易写出异步的FIFO模块,
打个比方把,将写请求同步到读时钟域,然后用读时钟来控制同步FIFO......
用户60452 2007-2-9 19:14
BTW
关于同时对FIFO的读写可参加《同步FIFO之VHDL描述5(大结局) 》的图5
用户60452 2007-2-9 19:11
tingwhere ,你好,很高兴来我的副站!
试着回答一下你的几个问题:
1.dualram是简单的双口RAM,在同一时刻可以进行读写操作而互相不影响,因此将来在异步FIFO中直接可以调用。用两个的原因就是双口RAM有写端口和读端口,分别对应两个时钟,是为了双口RAM可以应用在异步的地方。
2.不管是异步FIFO还是同步FIFO,在FIFO非空或非满的情况下读写地址是不相同的,因此需要两个地址,对应到双口RAM也就是addra和addrb。读写同时操作的时候没有优先级,互相不影响,只要FIFO非空,就可以读出来数据,只要FIFO非慢就可以写入数据。
3.关于半满的问题,你的想法是对的,不过要考虑读写指针的循环和先后关系。
用户1268090 2007-2-9 16:45
从主站追看到副站来,拜读了skycanny同步FIFO的RTL框图.有两个问题要问一下,因为我是用verilog的,可能问的问题有些已经在程序上反映出来了,还麻烦您指点迷津.
1.dualram有两个clk,clka和clkb,是不是意味着在未来异步的FIFO中,直接用这个dualram就可以用了.然后,既然FIFO是同步的,何必要设两个clk?只用一个即可啊
2.同样的问题,addra和addrb其实就是读写地址吧,而对于同步FIFO而言读写针对的应该是同一地址而言,如addr,而且要考虑的是读写同时操作的时候是读优先还是写优先的问题.
3,也和riple的问题有关,如果您用了读写地址,那么半满的判决就应该是写地址-读地址>=深度/2,就您的程序而言,就是addra-addrb,不知道我考虑的是否正确?
用户60452 2007-2-8 21:50
做除法?困怕有点空难,尤其用CPLD,用FPGA至少应该还能完成,但是速度恐怕比较慢,耗费资源也很多
ash_riple_768180695 2007-2-6 09:15
ash_riple_768180695 2007-2-6 09:11
不谢,不谢。如此大张旗鼓地感谢我,真是受宠若惊。
无人喝彩着实令人失望,可能原创是需要耐得住寂寞的。
大家互相支持一下吧,读你的日志确实有收获。