首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ALTERA的FIFO的读写控制

ALTERA的FIFO的读写控制

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


图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满了以后,逻辑会及时控制不往已经满了FIFO里再写入数据了,效果如图2所示:


图2 正确控制FIFO写,避免对满FIFO进行误写



       这种简单通过full信号控制fifo的写,如果不是连续写FIFO一般不会出问题,一旦需要连续的往FIFO里压入数据,那么当FIFO压满之后 FIFO将full信号置位,但是这个动作不会立即通知到user,所以user会在不知情的情况下又往满的FIFO进行一次写的操作。为了避免这种情况 发现必须通过和usedw信号一起来控制FIFO的写。
      同样对于FIFO的读,也存在类似的情况,如果连续的从FIFO里弹出数据,当弹出最后一个数据的时候,FIFO会给empty信号置位,但是这个动作需 要一个时钟之后才能通知到user,这时候继续读没有结束,那么在user不知情的情况下就产生一个对空FIFO的读操作,如图3所示:


图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所示:











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

返回列表