- dcfifo常用于跨时钟域数据传输,有两种工作模式,normal mode/ showahead mode,本文主要通过仿真对比这两种模式的区别。
1.showahead mode
参数设定
intended_device_family = "Cyclone 10 LP",
lpm_numwords = 128, //FIFO深度在位宽为写位宽32bit时为128,响应的以读位宽16bit来看深度为256
lpm_showahead = "ON", //模式设置
lpm_type = "dcfifo_mixed_widths",
lpm_width = 32, //输入数据宽度
lpm_widthu = 7, //写时钟下的FIFO深度位宽
lpm_widthu_r = 8, //读时钟下的FIFO深度位宽,比写要多1bit,深度是其2倍
lpm_width_r = 16, //输出数据宽度
overflow_checking = "ON",
rdsync_delaypipe = 6, //写指针过度到读时钟域下需要6级流水来同步,会延迟判断FIFO是否空 ,但偏保守
read_aclr_synch = "ON", //开启异步复位读时钟同步
underflow_checking = "ON",
use_eab = "ON",
write_aclr_synch = "ON", //开启异步复位写时钟同步
wrsync_delaypipe = 6; //读指针过度到读时钟域下需要6级流水同步,会延迟判断FIFO是否满,但偏保守
- 在showahead模式下,即使没有读请求信号,FIFO也会先输出一个数据,在本例子中,输入为32为,输出为16位,FIFO首先输出32位中的低16位后输出高16位。如图qout端口一直挂199,等到真正的读命令来了才属于高16位的数201。但是后续每次读完之后并没有提前将下一个数据挂出,和普通FIFO无异。
2.normal mode
- 参数设置上和上面的唯一区别就是OFF了lpm_showahead 。
- 在正常模式下,一开始是没有挂数据的(输出0),只有在读命令来了之后才输出数据。相比上面的showahead模式,正常模式始终比其慢半拍(慢在最开始没有提前挂出低16位)。正常模式最后输出是197,超前模式最后输出是194。
3.超前模式应用场景
超前模式下,可以直接读取fifo最前面的数据而不必先发出读请求再读,当然为了持续读后续数据还是要发出读请求。
正常模式下,必须严格地先发读请求,再读取数据。为了持续读后续数据也是要持续发出读请求。