IntelFPGA_DCFIFO_IP

  • 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是否满,但偏保守

IntelFPGA_DCFIFO_IP_第1张图片
IntelFPGA_DCFIFO_IP_第2张图片

  • 在showahead模式下,即使没有读请求信号,FIFO也会先输出一个数据,在本例子中,输入为32为,输出为16位,FIFO首先输出32位中的低16位后输出高16位。如图qout端口一直挂199,等到真正的读命令来了才属于高16位的数201。但是后续每次读完之后并没有提前将下一个数据挂出,和普通FIFO无异。

2.normal mode

  • 参数设置上和上面的唯一区别就是OFF了lpm_showahead 。
    IntelFPGA_DCFIFO_IP_第3张图片
    IntelFPGA_DCFIFO_IP_第4张图片
  • 在正常模式下,一开始是没有挂数据的(输出0),只有在读命令来了之后才输出数据。相比上面的showahead模式,正常模式始终比其慢半拍(慢在最开始没有提前挂出低16位)。正常模式最后输出是197,超前模式最后输出是194。

3.超前模式应用场景

超前模式下,可以直接读取fifo最前面的数据而不必先发出读请求再读,当然为了持续读后续数据还是要发出读请求。
正常模式下,必须严格地先发读请求,再读取数据。为了持续读后续数据也是要持续发出读请求。

你可能感兴趣的:(ASIC/FPGA设计基础)