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

2012-12-3 12:16 3458 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误读

 

 

文章评论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 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读出测试系统需要解...
coyoo 2024-11-16 13:54
不同ADC采样同一前端模拟信号时转换用时差异分析
概述 同一组前端模拟信号接入由不同型号ADC组成的模数转换电路时,采样后在FPGA中发现采样用时差异较大。本文主要分析这个时间差异形成的原因,并记录该差异产生对系统造成的影响。系统数字化简介 项目前端...
coyoo 2024-11-10 13:04
ALTERA Cyclone 10器件的使用-7:FPGA片内RAM资源利用率思考
概述 项目使用的FPGA目标器件为Cyclone 10 GX系列规模最大一颗料,由于功能升级增加了功能模块更多,发现器件片内RAM不够使用了。为了探索片内RAM使用的利用率问题,从代码RTL级与编译软...
coyoo 2024-11-10 12:30
转知乎:幽灵般的人体成像技术-PET
幽灵般的人体成像技术——PET - 知乎...
coyoo 2024-11-09 10:26
AD9633默认情况下调试记录(二)
概述 所谓默认情况,即如器件手册中图2所标示那样。对应AD9633的调试,除了涉及到ADC自身,还需要兼顾前端驱动器,系统中AD9633驱动器使用了差分运算放大器,这里不在赘述,笔者已有相关文章论述。...
我要评论
7
12
关闭 站长推荐上一条 /2 下一条