【转】觉得好! 异步FIFO及verilog原码_1 异步FIFO及verilog原码 这几天看了Clifford E. Cummings的两篇大作《Simulation and Synthesis Techniques for Asynchronous FIFO Design》and 《Simulation and Synthesis Techniques for Asynchronous FIFO Design with Asynchronous Pointer Comparisons》颇有感想,真可谓经典之作,不可错过。 1.什么是 FIFO? FIFO 是英文 First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加 1 完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。 2.什么情况下用 FIFO? FIFO 一般用于不同时钟域之间的数据传输,比如 FIFO 的一端是 AD 数据采集,另一端是计算机的PCI 总线,假设其 AD 采集的速率为 16 位 100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,而 PCI 总线的速度为 33MHz,总线宽度 32bit,其最大传输速率为1056Mbps,在两个不同的时钟域间就可以采用 FIFO 来作为数据缓冲。 另外对于不同宽度的数据接口也可以用 FIFO,例如单片机位 8 位数据输出,而 DSP 可能是16 位数据输入,在单片机与 DSP 连接时就可以使用 FIFO 来达到数据匹配的目的。 3.FIFO 的一些重要参数 FIFO 的宽度:也就是英文资料里常看到的THE WIDTH,它只的是FIFO 一次读写操作的数据位,就像MCU 有8 位和16 位,ARM 32 位等等,FIFO 的宽度在单片成品IC 中是固定的,也有可选择的,如果用FPGA 自己实现一个FIFO,其数据位,也就是宽度是可以自己定义的。 FIFO 的深度:THE DEEPTH,它指的是FIFO 可以存储多少个N 位的数据(如果宽度为 N)。如一个8 位的FIFO,若深度为 8,它可以存储 8 个8 位的数据,深度为 12 ,就可以存储12 个8 位的数据,FIFO 的深度可大可小,个人认为 FIFO 深度的计算并无一个固定的公式。在FIFO 实际工作中,其数据的满/空标志可以控制数据的继续写入或读出。在一个具体的应用中也不可能由一些参数算数精确的所需 FIFO 深度为多少,这在写速度大于读速度的理想状态下是可行的,但在实际中用到的FIFO 深度往往要大于计算值。一般来说根据电路的具体情况,在兼顾系统性能和FIFO 成本的情况下估算一个大概的宽度和深度就...