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核时序说明的更多相关文章
-
FIFO IP核
转载: 说白了,IP核就是别人做好了的硬件模块,提供完整的用户接口和说明文档,更复杂的还有示例工程,你只要能用好这个IP核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所 ...
-
FIFO IP核仿真
FIFO IP核仿真 1.FIFO IP核配置 2.FIFO测试逻辑代码 首先往FIFO里面写入512个数据(FIFO深度的一半),然后再开始同时往FIFO里面写入,读出数据.FIFO读和写的时钟域不 ...
-
Altera DDR2 IP核学习总结3-----------DDR2 IP核的使用
根据上一篇生成的IP核,例化之后如上图,Local开头的数据是用户侧数据,其他数据暂时不用纠结,不用管. 这些是需要关注的信号,但是初学阶段很难对这些信号形成具体的概念,这里参考明德扬的代码进行二次封 ...
-
FPGA基础学习(2) -- FIFO IP核(Quartus)
ALTERA在LPM(library of parameterized mudules)库中提供了参数可配置的单时钟FIFO(SCFIFO)和双时钟FIFO(DCFIFO).FIFO主要应用在需要数据 ...
-
altera DDR2 IP核之仿真
在生成的IP核文件夹下,有一个testbench文件夹,里面包含了一个example测试激励和DDR2仿真模型. 如下 20 -rw-r--r-- 1 Administrator 197121 171 ...
-
如何使用和了解ALTERA的IP核
可以通过直接对IP核进行仿真验证,通过波形来分析IP核的功能和工作方式,以及各个寄存器之间的工作关系. 也可以通过查看用户指导手册来学习IP核,如下图.
-
关于ALTERA生成IP核卡住
最近搞fft,用的quartus13.1版本,发现quartus和modelism存在各种各样的坑啊,fftIP核大家可能也遇到过ip核 生成到一半就卡住的问题,之前我是通过换系统解决的,但是好景不长 ...
-
Altera DDR2 IP核学习总结2-----------DDR2 IP核的生成
打开IP核工具,然后选择Verilog HDL选项,填写路径,写入文件名DDR2_IP.V,点击next PLL reference clock frequency填入板子晶振的频率50MHZ,这里设 ...
-
ALTERA DDRII IP核使用
提到DDRII,大家应该都不陌生,DDRII SDRAM是第二代双倍速率同步动态RAM.今天小编给大家介绍一下QUARTUS II 下调用DDRII软核. 新建QUARTUSII工程之后,在tool下 ...
随机推荐
-
SpreadJS电子表格
SpreadJS是wijmo旗下的一款HTML5电子表格控件. 官方网址:http://wijmo.com/products/spreadjs/ 在这里简单整理了SpreadJS几个比较简单的特点,如 ...
-
XXX项目总结
前言 昨天晚上睡不着总感觉有些什么东西需要记下来,所以就有了这篇文章.做了好几次的重构是应该有一个总结以备以后查阅,当然有些设计思想是通过自己的总结也有些是吸收别人的思想,同样如果能对你有所帮助那就再 ...
-
[置顶] Android常用适配器控件
Android常用适配器控件 列表控件用于显示数据集合,Android不是使用一种类型的控件管理显示和数据,而是将这两项功能分布用列表控件和适配器来实现.列表控件扩展了android.widget.A ...
-
视频编辑类sdk--lansoeditor--更新啦, 完全免费,欢迎下载
当前版本是20160506 beta, 增加了兼容高通的64位硬件编码器增加MediaInfo类,您可以轻松获取多媒体中的各种信息.增加了演示的15个ffmpeg处理方法,您可以用这些方法实现秒拍图像 ...
-
1.编写TextRw.java的Java应用程序,程序完成的功能是:首先向TextRw.txt中写入自己的学号和姓名,读取TextRw.txt中信息并将其显示在屏幕上。
package zuoye; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...
-
div模拟table
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>div模 ...
-
201521123006 《java程序设计》 第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
-
Linux目录结构及作用
/:根目录 /bin:存放基础系统所需的最基础的命令(程序) binary 比如:ls.cp.mkdir等 功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令 /b ...
-
Windows平台下载、安装、配置Apache全攻略
本文介绍了如何在windows平台进行apache服务器的下载.安装和配置过程. 1.下载 首先进入apache for windows的官方下载地址[猛戳这里],依次在下列页面进行下载操作: 我这里 ...
-
Oracle存储过程入参传入List集合的小例子
第一步:创建一个对象类型 create or replace type STUDENT as object( id ), name ), age ) ); / 第二步:创建一个数组类型 (任意选择下面 ...