FPGA基础学习(2) -- FIFO IP核(Quartus)
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的时序(主要是时钟吧)是怎样的呢?
FPGA基础学习(2) -- FIFO IP核(Quartus)的更多相关文章
- FPGA基础学习(1) -- FFT IP核(Quartus)
为了突出重点,仅对I/O数据流为steaming的情况作简要说明,以便快速上手,有关FFT ip核模型及每种设置详细介绍请参考官方手册FFT MegaCore Function User Guide. ...
- FIFO IP核
转载: 说白了,IP核就是别人做好了的硬件模块,提供完整的用户接口和说明文档,更复杂的还有示例工程,你只要能用好这个IP核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所 ...
- FIFO IP核仿真
FIFO IP核仿真 1.FIFO IP核配置 2.FIFO测试逻辑代码 首先往FIFO里面写入512个数据(FIFO深度的一半),然后再开始同时往FIFO里面写入,读出数据.FIFO读和写的时钟域不 ...
- Altera FIFO IP核时序说明
ALTERA在LPM(library of parameterized mudules)库中提供了参数可配置的单时钟FIFO(SCFIFO)和双时钟FIFO(DCFIFO).FIFO主要应用在需要数据 ...
- Altera DDR2 IP核学习总结3-----------DDR2 IP核的使用
根据上一篇生成的IP核,例化之后如上图,Local开头的数据是用户侧数据,其他数据暂时不用纠结,不用管. 这些是需要关注的信号,但是初学阶段很难对这些信号形成具体的概念,这里参考明德扬的代码进行二次封 ...
- Altera DDR2 IP核学习总结2-----------DDR2 IP核的生成
打开IP核工具,然后选择Verilog HDL选项,填写路径,写入文件名DDR2_IP.V,点击next PLL reference clock frequency填入板子晶振的频率50MHZ,这里设 ...
- FPGA基础学习(8) --内部结构之存储单元
目录 1. 基本结构 2. BRAM与DRAM的比较 3. BRAM的特点 4. Block Memory的使用 4.1 配置为RAM或ROM 4.2. 配置为FIFO 参考文献: 上一篇中提到了SL ...
- FPGA基础学习(3) -- 跨时钟域处理方法
文章主要是基于学习后的总结. 1. 时钟域 假如设计中所有的触发器都使用一个全局网络,比如FPGA的主时钟输入,那么我们说这个设计只有一个时钟域.假如设计有两个输入时钟,如图1所示,一个时钟给接口1使 ...
- FPGA基础学习(9) -- 复位设计
目录 1. 常见问题 2. 常见的复位方式 3. 合理的复位设计 3.1 复位电平 3.2 异步复位同步化 3.3 恰到好处的复位 4. 补充 4.1 所谓的上电初始化 参考文献 一开始接触到FPGA ...
随机推荐
- python连接sql server数据库
记录一下pyodbc连接数据库的使用方法和注意事项,基于python2.7: 前提: pip install pyodbc .下载pyodbc包. pyodbc.connect('DRIVER ...
- Android 4学习(2):概述 - AndroidManifes.xml
Android应用程序包含下面这几个部分: 程序的前后台: Activities Services 存储: Content Providers 消息传递: Intents Broadcast Rece ...
- NoSQL概述
- 百度Apollo解析——3.common
1.略读 该目录下主要提供了各个模块公用的函数和class以及一些数学API还有公共的宏定义. 在Apollo 1.0中,common是整个框架的基础.configs是配置文件加载.adapters是 ...
- 202. Happy Number 平方循环数
[抄题]: Write an algorithm to determine if a number is "happy". A happy number is a number d ...
- VMware内部错误解决办法
虚拟机内部错误,不要担心不是致命错误,往往是由于你的配置被禁用了或者VMware运行权限不够导致 检查你的VMware虚拟网卡是否被禁用 检查你的VMware的运行权限,直接管理员运行就够够的了
- Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件
一.目标:读取properties文件,获得类名来生成对象 二.类 1.Movable.java public interface Movable { void run(); } 2.Car.java ...
- Ubuntu相关IP配置(转)
配置文件:/etc/network/interfaces 打开后里面可设置DHCP或手动设置静态ip.前面auto eth0,让网卡开机自动挂载. 1. 以DHCP方式配置网卡 编辑文件/etc/ne ...
- DjVu、PDF中的隐藏文本
作者:马健邮箱:stronghorse_mj@hotmail.com发布:2012.06.11 目录一.背景二.DjVu中的隐藏文本三.PDF中的隐藏文本 一.背景 目前对于扫描电子文档,网上比较流行 ...
- docker初探
1.什么是docker: 可以理解为一个可移植的集装箱容器,开发者可以打包他们的应用以及依赖包到一个可移植的容器中. 2.docker安装及使用(ubuntu16.04) (1)首先通过apt-get ...