FIFO
FIFO:
中文意思:先进先出【类似于堆栈】
作用:
在FPGA中,一般用于不同时域之间的数据传递,比如FIFO的一端是AD采集,另一端是计算机PCI总线,假设AD的采集速度一般都是几百Kb/s,PCI总线的速度为200Mb/s,在这俩个的时域中传递数据时就可以采用FIFO来作为数据缓冲。同时FIFO还可以作为不同数据宽度之间的传递FIFO也是可以胜任的,比如UART收到的数据传递给USB。UART收到的数据是8位的数据,USB传递的16数据,如果之间传递,他们是不同的时域,传输的速度也是不一样的,为了解决这个我们可以使用FIFO,
将读写时钟配置为rd_clk、wr_clk;
读写数据宽度 配置写8位数据,读16位数据;
同时我们根据需求还可以选择对应标志位,使能位有效时间等。
分类:
FIFO的类型及FIFO说明:
根据数据出现在输出总线上的时间不同分为不同的种类。
普通FIFO:每次在使能位有效的情况下,读时钟和写时钟的上升沿来时,将数据读出 来,一个时钟一个数据。
预取FIFO:写时同普通FIFO一样,读时数据提前输出到总线上,比普通FIFO早一个时钟。
FIFO的生成:
同其他的IP生成是一样的,我们选择对应的IP核后,会有对应的配置向导,根据向导选择对应的参数。
简单的步骤就省略掉了。
我们命名好了FIFO的名字后,就来到以下的界面,接下来我们要进行一些相应的配置。
1关于interface的选择,【百度的,】native是做soc工程
Next后,需选择时钟和存储类型。
1,时钟:一般根据FIFO的作用,读写时钟是不同步。
2,存储类型:有block RAM 和 distibute RAM两种。
【百度】由此区别表明,当FIFO较大时应选择block RAM,当FIFO较小时,选择distribute RAM.另外一个很重要的就是block RAM支持读写不同宽度,而distribute不支持。在这里为了更全面的了解FIFO,选择block RAM以拥有非对称方向速率的特性。
FIFO读写模式:
标准模式和预取模式。通常我们选择标准模式,至于预取FIFO的作用目前还没有遇到。
我们选择位宽和深度后,地址自动就生成了。
data port parameters 中的actual write depth和actual read depth
我们设置完时钟和数据后,就该添加控制信号了
控制信号越多操作越复杂,同时对FIFO的控制更加精准了
1、标志位,半空和半满
2、……
复位信号和可编程信号的配置。虽然在block RAM和distribute RAM中,启用rst端口,且配置成同步复位,即整个FIFO共用一个复位信号,而不是读写不同的复位。至于编程信号,看选项就很容易理解了。配置如图,FIFO中数据达到200时,programmable full有效,数据为10时,programmable empty有效。
之后是写计数和读计数,都使之有效,由于写深度是256,读深度是512.因此写计数器的宽度定义为8,读计数器的狂度定义为9.其实不一定计数器一定要比深度大,当计数器计数最大值小于数据深度时,例如数据深度为512,而计数器大小为256,则每两个数据计数器计数一次。
最后可以看到我们配置的FIFO信息如下(注意几个关键信息),最后生成IP就好了。
【有效电平】
Rst 高电平有效
复位后(2,3)个周期内是无法进行写操作的;
Wr_en 在拉高的上升沿时,数据立即生效
Rd_en 在读上升沿并没有进行读数据,而是在下一个上升沿时进行读操作
关于计数,如果计数值设置的不够大时一开始就会失效,成为高阻状态。
读写计数是大概不准.
上升沿是时钟上升沿 不是wr_en 和rd_en的上升沿, 【信号触发后clk的上升沿生效】
空满标志有效电平是?高有效
仿真结果图