Altera FIFO IP核时序详细说明

FIFO 是 FPGA 开发中使用频率很高的单元,主要应用在需要数据缓冲且数据符合先进先出规律的同步或异步场合,FIFO 读写时序的正确与否直接关系到数据的传输,因此有必要对 FIFO 的时序做一个说明,关于使用 modelsim 仿真 Altera IP 核可参考前面一篇博文“Quartus II 和 Modelsim 联合仿真 Altera IP 核(FIFO)”。

ALTERA 在 LPM(library of parameterized mudules)库中提供了参数可配置的单时钟 FIFO(SCFIFO)和双时钟 FIFO(DCFIFO)。LPM 中的 FIFO 包含以下几种:

  • SCFIFO:单时钟 FIFO;
  • DCFIFO:双时钟 FIFO,数据输入和输出的宽度相同;
  • DCFIFO_MIXED_WIDTHS:双时钟 FIFO,输入输出数据位宽可以不同。

配置不细说,直接看时序来理解。

一、同步 FIFO 验证时序

IP 核设置说明:

Altera FIFO IP核时序详细说明

开辟空间 8bits*8words;almost_full 设置为“6”;almost_empty 设置为“2”;采用普通同步 FIFO 模式(the data becomes available before “rdreq” is asserted)。

引脚说明:

  • aclr 和 sclr:aclr 为异步清零,不管何时,只要出现上升沿,立刻清除 q 中数据,q<=8’bx。emtpy 为 1;full 为 0;almost_empty 为 1(根据参数判断);almost_full 为 0。sclr 为同步清零,只有 sclr 在 clock 上升沿时为“1”才能执行清除,效果同 aclr。
  • wrreq 和 rdreq:读写使能,高电平有效,clock 上升沿执行读、写操作。
  • full:当写入数据量达到最大空间时,clock 上升沿写入最后一个数据同时 full 拉高;读取数据时随 clock 上升沿触发同时拉低。
  • empty:与 full 相反。写入数据同时拉低;读到最后一个数据同时拉高。
  • almost_full:当 usedw 的数值≥almost_full 参数设置值 almost_full_value 时为 1,其余时刻保持 0(不管是读操作还是写操作,只与数值比较有关)。
  • almost_empty:当 usedw 的数<almost_empty 参数设置值 almost_empty_value 时为 1,其余时刻保持 0(不管是读操作还是写操作,只与数值比较有关)。
  • usedw:显示当前 FIFO 中已存数据个数,与写入数据的个数是同步的,即写第一个数据时就置 1,空或满时值为 0(满是因为寄存器溢出)。

二、异步 FIFO 验证时序

从时序图上说明 DCFIFO 的工作情况,虽然网上也有相关的时序图,但是写得不是很清晰。

Altera FIFO IP核时序详细说明

建立一个位宽为 8 位,深度为 4 的 DCFIFO。wr_clk 与系统时钟同频,但是相移 180°(反向)。rd_clk = 2*wr_clk。先写满,再读空的方式验证。从时序图上看,感觉 DCFIFO 内部存在两个存储空间,接下来解释。

T1 时刻,写使能 wr 置高。

T2 时刻,第一个 wr_clk 上升沿到来,第一个数据 8’h01 写入到 FIFO 中,此时 wr_empty 立即拉低,表明此刻 FIFO 不为空(写部分)。wr_usedw 此时还是为 0,与单时钟 FIFO(SCFIFO)不同的是,SCFIFO 第一个数据写入的时候,usedw 会为 1,说明 wr_usedw 有 1 个时钟周期的滞后(user guide 里面说 wrreq to wrusedw 会滞后 2 个 wr_clk,不太明白这与写入数据有什么之间的联系)。写满时 usedw 溢出后变为 0。

T3 时刻,rd_empty 也被拉低,这就有点像“写”部分的存储空间的数据 copy 到了“读”部分的存储空间,而延迟时间正好就是 T2 与 T3 之间的时间间隔。随即 rdusedw 开始从 0 递增,但是递增周期感觉是以 wr_clk 为基准。

T4 时刻,最后一个数据 8’h04 写入 FIFO,wr_full 被拉高,表明 FIFO(写入部分)已经满了。wr_usedw 计数为 3。随后结束写使能,即 wr 拉低。

T5 时刻,“写”部分的存储空间的数据全部 copy 至“读”部分的存储空间,此时 rd_full 也就被拉高了。

T6 时刻,读使能信号拉高,即 rd 信号拉高。

T7 时刻,读时钟信号 rd_clk 的第一个有效上升沿到来,读出第一个数据 8’h01。此时“读”存储空间的满信号 rd_full 被拉低,表明“读”空间不满。

T8 时刻,“写”存储空间的满信号 wr_full 才被拉低,表明与“读”存储空间之间有延迟。

T9 时刻,最后一个数据 8’h04 被读出,此时“读”存储空间的空信号 rd_empty 立即被拉高,表明已经空了。rdusedw 滞后 1 个 rd_clk 减为 0。

T10 时刻,在“读”存储空间已经空了之后,经过一定时间的延迟,“写”存储空间才知道 FIFO 已空。注意在 T10 时刻前后,可能存在 wrusedw 的不稳定,在 wr_empty 重新拉高一个周期之后,wrusedw 才重新置零。

经过上述时序的“直译”,发现 DCFIFO 的读和写像是两个独立的内部存储空间,存在一个“copy”或者握手的过程,所以导致双方的空、满信号存在一定的延迟。这就需要考虑,在实际项目中要用到 DCFIFO 时,采用什么信号来判断,此刻 FIFO 能否安全的读写(也可以将 almost 相关的信号添加进来)。DCFIFO 的优势在于写端和读端时钟不一样,安全的边写边读,但是得注意读写时钟频率差异,以便控制 FIFO 深度以及相应的控制信号。

Altera FIFO IP核时序详细说明
rd_clk = 2*wr_clk,不写满,读空
Altera FIFO IP核时序详细说明
rd_clk = 3*wr_clk 时

三、遇到问题

在实际设计中,有个模块控制 FIFO 写入数据 A,假设全局时钟 global_clk 以时序逻辑的方式驱动 FIFO 的写使能(fifo_wr)和写数据(data),而 FIFO 的时钟信号就直接赋上 global_clk,那么就会得到如图 1 所示的时序图。写使能和数据都在 global_clk 上升沿发生变化。

Altera FIFO IP核时序详细说明

那么问题就来了,按道理说,FIFO 写入数据是在 wr 拉高前提下,在 fifo_clk 上升沿写入数据。那么是不是这样设计就不满足数据的保持时间?

换一种设计,FIFO 的写使能(fifo_wr)和写数据(data)依然基于 global_clk 的时序逻辑,但是 fifo_clk 相对于 global_clk 有个相移,比如说反相。那么就得到了图 2 的时序图,这样就满足设计需求了吗?

Altera FIFO IP核时序详细说明

四、参考资料

FIFO Intel® FPGA IP User Guide

扫码关注尚为网微信公众号

尚为网微信公众号
每天学习电路设计嵌入式系统的专业知识,关注一波,没准就用上了。

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/682.html

(2)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年7月17日 22:30
下一篇 2020年7月22日 20:59

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(1条)

  • 陈
    2022年5月12日 09:20

    有没有可能是写进FIFO的数据经过移位之后到达输出位,rdempty信号才拉低呢