fifo??什么是fifo呢??
正如它的英文名字first in first out,先进先出.....
优缺点:
他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
为什么使用fifo呢??这个问题貌似困扰了我好久了......(这两个例子网上copy,感觉不错)
FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为16位 100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速率为1056Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。
另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。
FIFO的一些重要参数:
fifo是fpga内嵌有的,有几个参数需要设置:megawizard中可以设置.....
FIFO的宽度:及时你输出的字节的宽度....这个megawizard可以设置的....
FIFO的深度:深度??貌似很难理解....可以理解为你定义的fifo存储器中有多少字节(这个字节就是你上面定义的);
那么fifo的总字节=FIFO的宽度*FIFO的深度;
满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。
空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。
读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。
写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。
读指针:指向下一个读出地址。读完后自动加1。
写指针:指向下一个要写入的地址的,写完自动加1。
读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。
fifo的分类:
可以将FIFO分为同步FIFO和异步FIFO
同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生读写操作。
异步FIFO是指读写时钟不一致,读写时钟是互相独立的。
FIFO设计的难点(貌似这个挺重要的)
FIFO设计的难点在于怎样判断FIFO的空/满状态??
这是每个使用fifo应当注意,这个应该很好理解了,即是满的时候不可以再写了,空的的时候不可以再读了...
还有算法,这里就省略了...
加一点时序分析吧;
其中wrreq 和 rdreq 都是高有效即是wrreq =1是则写入,rdreq=1时读出,
神呀,如果两个都为高呢??这个我是理解为全双工的,可以读,也可以写.....没错了,经过验证也是这样的....
还有empty是空的时候为高的................
|