原创 【博客大赛】【原创】ALTERA的FIFO的读写控制

2012-12-3 12:16 3485 12 19 分类: FPGA/CPLD 文集: ALTERA FPGA

      为了防止数据堵塞在FIFO里,所以不使用FIFO的almost empty和almost full来控制避免对满FIFO的写以及对空FIFO的读。假如简单的使用FULL信号来控制FIFO的写,那么就会出现如图1所示的对满FIFO的写操作,这样就会丢失一个数据。

1.jpg
图1 错误控制FIFO写,导致对已满的FIFO进行误写操作
 
上述FIFO写控制如下:
 
       if cnt(5)='1' and fifo_lv1_a_full_sig='0' then
          fifo_lv1_a_wrreq_sig <= '1';
          fifo_lv1_a_data_sig <= cnt(6 downto 0);
      else fifo_lv1_a_wrreq_sig <= '0';
      end if;
 
如果改成如下:
 
       if cnt(5)='1' and fifo_lv1_a_full_sig='0'  and fifo_lv1_a_usedw_sig<15 then
          fifo_lv1_a_wrreq_sig <= '1';
          fifo_lv1_a_data_sig <= cnt(6 downto 0);
       else fifo_lv1_a_wrreq_sig <= '0';
       end if;
 
      经过上述修改后(注意本例中的FIFO深度是16),当FIFO满了以后,逻辑会及时控制不往已经满了的FIFO里再写入数据了,效果如图2所示:
1.jpg
图2 正确控制FIFO写,避免对满FIFO进行误写
 
       这种简单通过full信号控制fifo的写,如果不是连续写FIFO一般不会出问题,一旦需要连续的往FIFO里压入数据,那么当FIFO压满之后 FIFO将full信号置位,但是这个动作不会立即通知到user,所以user会在不知情的情况下又往满的FIFO进行一次写的操作。为了避免这种情况发生必须通过使用full信号和usedw信号一起来控制FIFO的写。

 

      同样对于FIFO的读,也存在类似的情况,如果连续的从FIFO里弹出数据,当弹出最后一个数据的时候,FIFO会给empty信号置位,但是这个动作需 要一个时钟之后才能通知到user,所以这时候逻辑不会停止读,那么在user不知情的情况下就产生一个对空FIFO的读操作,如图3所示:

1.jpg
图3 错误控制FIFO读,导致对已空的FIFO进行误读
 
     连续读FIFO,会对空的FIFO进行误读,这时候的FIFO读控制信号是这样写的:
 
if ((fifo_lv1_a_empty_sig='0' and fifo_lv1_a_usedw_sig>0) or fifo_lv1_a_full_sig='1') and ((fifo_lv1_b_empty_sig='0' and fifo_lv1_b_usedw_sig>0) or fifo_lv1_b_full_sig='1') and fifo_lv2_full_sig='0' and fifo_lv2_usedw_sig<15  then
          fifo_lv1_a_rdreq_sig <= '1';fifo_lv1_b_rdreq_sig <= '1';
else fifo_lv1_a_rdreq_sig <= '0';fifo_lv1_b_rdreq_sig <= '0';
end if;
 
上述代码是放在进程里,修改后将控制逻辑放在进程外面:
 
fifo_lv1_a_rdreq_sig <= '1' when ((fifo_lv1_a_empty_sig='0' and fifo_lv1_a_usedw_sig>0) or fifo_lv1_a_full_sig='1') and ((fifo_lv1_b_empty_sig='0' and fifo_lv1_b_usedw_sig>0) or fifo_lv1_b_full_sig='1') and fifo_lv2_full_sig='0' and fifo_lv2_usedw_sig<15 else '0';
 
fifo_lv1_b_rdreq_sig <= '1' when ((fifo_lv1_a_empty_sig='0' and fifo_lv1_a_usedw_sig>0) or fifo_lv1_a_full_sig='1') and ((fifo_lv1_b_empty_sig='0' and fifo_lv1_b_usedw_sig>0) or fifo_lv1_b_full_sig='1') and fifo_lv2_full_sig='0' and fifo_lv2_usedw_sig<15 else '0';
 
       读控制信号修改后,能保证不对空的FIFO“读”了,如图4所示:
1.jpg

图4 正确控制FIFO读,避免对已空FIFO误读

 

 

PARTNER CONTENT

文章评论7条评论)

登录后参与讨论

coyoo 2012-4-20 16:34

另外,判决条件看起来复杂可能是因为例子中是要同时判决2个FIFO符合条件后将2个FIFO里的数据合并到第三个FIFO里

coyoo 2012-4-20 16:16

1.同意; 2.我觉得我的判决条件并不复杂,且都是必须的;我的目的就是要把FIFO读空,确保当数据一段一段的时候能及时地把所有数据读出来,而不留一个。

用户1000403 2012-4-18 11:01

写的不错,谢谢分享,两个观点: 1、almostfull的使用 fifo_lv1_a_usedw_sig<15就是almostfull 2、almostempty使用 读条件LZ写的太复杂了,其实就是两个条件: 进程里用fifo_rdcnt/=0 and almostempty='0' 即“非空即读,将空停止读” 进程外用empty代替almostempty LZ可以试试,对比一下仿真结果。

用户1000403 2012-4-18 10:53

爱的色放

coyoo 2012-4-17 09:20

是吗?那还不错

用户403664 2012-4-13 16:36

很快EDN就换新的博客编辑器,那就有强大的功能啦 。

coyoo 2012-4-12 13:04

有点小遗憾,EDN没有插入“code”功能哦
相关推荐阅读
coyoo 2025-01-16 13:07
PET探测器
记录下PET探测器的知识点。所谓探测器,即探测出核医学里的核辐射。人体代谢等反应发生的湮没产生了伽马光子,该伽马光子的能量很强,当前很难直接探测(尽管还存在直接探测的探测器)。所以,更多的时候是间接探...
coyoo 2024-12-25 14:13
ALTERA Cyclone 10器件的使用-8:特定的上电顺序
概述 Intel 要求用户为其10代FPGA器件使用特定的上电和掉电顺序,这就要求用户在进行FPGA硬件设计的时候必须选择恰当的FPGA供电方案,并合理控制完整的供电上电顺序。经过在Cyclone 1...
coyoo 2024-12-22 11:46
AD9218子板在新处理板上表现的问题
概述 新的数据处理板融合了数字和数据处理功能模块,计划采用ADI的4通道串行ADC芯片代替之前的并行ADC。由于初次使用,所以初次设计时预留了AD9218的子板的插槽。 在调试AD9633功能的同时并...
coyoo 2024-12-14 17:15
在Cyclone 10 GX器件上实现高精度TDC探索
概述 Cyclone 10 GX器件的ALM结构与Cyclone V类似,所以在Cyclone 10 GX器件上实现TDC功能理论上是可以完全参考甚至移植自Cyclone V系列的成功案例。但是,现实...
coyoo 2024-12-10 13:28
Cyclone V GX FPGA设计TDC的优化问题
概述 通过前面的研究学习,已经可以在CycloneVGX器件中成功实现完整的TDC(或者说完整的TDL,即延时线),测试结果也比较满足,解决了超大BIN尺寸以及大量0尺寸BIN的问题,但是还是存在一些...
coyoo 2024-12-03 12:20
比较器检测模拟脉冲说明(四)
概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解...
我要评论
7
12
关闭 站长推荐上一条 /3 下一条