ALTERA在LPM(library of parameterized mudules)库中提供了参数可配置的单时钟FIFO(SCFIFO)和双时钟FIFO(DCFIFO)。FIFO主要应用在需要数据缓冲且数据符合先进先出规律的同步或异步场合。LPM中的FIFO包含以下几种:

1.SCFIFO:单时钟FIFO;

2.DCFIFO:双时钟FIFO,数据输入和输出的宽度相同;

3.DCFIFO_MIXED_WIDTHS:双时钟FIFO,输入输出数据位宽可以不同。

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

1. 同步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(满是因为寄存器溢出)。

2. 异步FIFO验证时序

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

建立一个位宽为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深度以及相应的控制信号。

rd_clk = 2*wr_clk,不写满,读空

rd_clk = 3*wr_clk时

3、遇到问题

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

写使能和数据都在global_clk上升沿发生变化。



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

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



我想请问的是,一般工程设计,怎样设计FIFO的时序(主要是时钟吧)是怎样的呢?

Altera FIFO IP核时序说明的更多相关文章

  1. FIFO IP核

    转载: 说白了,IP核就是别人做好了的硬件模块,提供完整的用户接口和说明文档,更复杂的还有示例工程,你只要能用好这个IP核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所 ...

  2. FIFO IP核仿真

    FIFO IP核仿真 1.FIFO IP核配置 2.FIFO测试逻辑代码 首先往FIFO里面写入512个数据(FIFO深度的一半),然后再开始同时往FIFO里面写入,读出数据.FIFO读和写的时钟域不 ...

  3. Altera DDR2 IP核学习总结3-----------DDR2 IP核的使用

    根据上一篇生成的IP核,例化之后如上图,Local开头的数据是用户侧数据,其他数据暂时不用纠结,不用管. 这些是需要关注的信号,但是初学阶段很难对这些信号形成具体的概念,这里参考明德扬的代码进行二次封 ...

  4. FPGA基础学习(2) -- FIFO IP核(Quartus)

    ALTERA在LPM(library of parameterized mudules)库中提供了参数可配置的单时钟FIFO(SCFIFO)和双时钟FIFO(DCFIFO).FIFO主要应用在需要数据 ...

  5. altera DDR2 IP核之仿真

    在生成的IP核文件夹下,有一个testbench文件夹,里面包含了一个example测试激励和DDR2仿真模型. 如下 20 -rw-r--r-- 1 Administrator 197121 171 ...

  6. 如何使用和了解ALTERA的IP核

    可以通过直接对IP核进行仿真验证,通过波形来分析IP核的功能和工作方式,以及各个寄存器之间的工作关系. 也可以通过查看用户指导手册来学习IP核,如下图.

  7. 关于ALTERA生成IP核卡住

    最近搞fft,用的quartus13.1版本,发现quartus和modelism存在各种各样的坑啊,fftIP核大家可能也遇到过ip核 生成到一半就卡住的问题,之前我是通过换系统解决的,但是好景不长 ...

  8. Altera DDR2 IP核学习总结2-----------DDR2 IP核的生成

    打开IP核工具,然后选择Verilog HDL选项,填写路径,写入文件名DDR2_IP.V,点击next PLL reference clock frequency填入板子晶振的频率50MHZ,这里设 ...

  9. ALTERA DDRII IP核使用

    提到DDRII,大家应该都不陌生,DDRII SDRAM是第二代双倍速率同步动态RAM.今天小编给大家介绍一下QUARTUS II 下调用DDRII软核. 新建QUARTUSII工程之后,在tool下 ...

随机推荐

  1. Spring事务管理配置示例

    (一).Spring事务特性 1.事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度. ISOLATION_DEFAULT:默认值,使用数据库的默认隔离级别,就是ISOLATION_READ_C ...

  2. asp.net中使用Global.asax文件中添加应用出错代码,写入系统日志文件或数据库

    void Application_Error(object sender, EventArgs e) { // 在出现未处理的错误时运行的代码 Exception objErr = Server.Ge ...

  3. win10 UWP 蜘蛛网效果

    我看见了知乎首页登录背景和普通的地球人写的博客,发现了个好看的效果. 那么我来告诉大家如何做这个效果. 第一步是在 Canvas 画点,第二步是让点移动,第三步是画线 在 Canvas 画一个点 我们 ...

  4. canvas图表详解系列(5):雷达(面积)图

    雷达(面积)图 本章建议学习时间4小时 学习方式:详细阅读,并手动实现相关代码(如果没有canvas基础,需要先学习前面的canvas基础笔记) 学习目标:此教程将教会大家如何使用canvas绘制各种 ...

  5. (转)十分钟入门pandas

    本文是对pandas官方网站上<10 Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook . 习 ...

  6. Ubuntu使用Windows下的conio.h

    把虚线框里面的内容粘贴进文档文本里面 --------------------------------------------------------------------------------- ...

  7. LINUX 笔记-watch命令

    命令格式:watch[参数][命令] 可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令 命令参数: -n或--interval  watch缺省每2秒运行一下程序,可以用-n ...

  8. LINUX 笔记-ln 命令

    给文件创建软链接 命令:ln -s log2013.log link2013 给文件创建硬链接 命令:ln log2013.log ln2013

  9. zookeeper 笔记-ACL

    zookeeper中,znode的ACL是没有继承关系的,是独立控制的,zookeeper的acl可以从3个维度理解,一是scheme,二是user,三是permission,通常表示为scheme: ...

  10. 深入理解Java虚拟机--下

    深入理解Java虚拟机--下 参考:https://www.zybuluo.com/jewes/note/57352 第10章 早期(编译期)优化 10.1 概述 Java语言的"编译期&q ...