quartus 异步fifo用法
异步FIFO设计(非常详细,图文并茂,值得一看!)
异步FIFO设计(非常详细,图文并茂,值得一看!)一、概述在大规模ASIC或FPGA设计中,多时钟系统往往是不可避免的,这样就产生了不同时钟域数据传输的问题,其中一个比较好的解决方案就是使用异步FIFO来作不同时钟域数据传输的缓冲区,这样既可以使相异时钟域数据传输的时序要求变得宽松,也提高了它们之间的传输效率。
此文内容就是阐述异步FIFO的设计。
二、设计原理2.1结构框图Fig. 2.1.1如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的读指针rd_ptr采集到写时钟(wr_clk)域,然后和写指针wr_ptr进行比较从而产生或撤消写满标志位wr_full;类似地,同步模块synchronize to read clk的作用是把写时钟域的写指针wr_ptr采集到读时钟域,然后和读指针rd_ptr进行比较从而产生或撤消读空标志位rd_empty。
另外还有写指针wr_ptr和写满标志位wr_full产生模块,读指针rd_ptr和读空标志位rd_empty产生模块,以及双端口存储RAM模块。
2.2 二进制计数器存在的问题异步FIFO读写指针需要在数学上的操作和比较才能产生准确的空满标志位,但由于读写指针属于不同的时钟域及读写时钟相位关系的不确定性,同步模块采集另一时钟域的指针时,此指针有可能正处在跳变的过程中,如图Fig.2.2.1所示,那么采集到的值很有可能是不期望的值,当然,不期望的错误结果也会随之发生。
Fig. 2.2.1上图中,rd_ptr2sync 3和4以及4和5之间的中间态是由于到各寄存器的时钟rd_clk存在偏差而引起的。
二进制的递增操作,在大多数情况下都会有两位或者两以上的bit位在同一个递增操作内发生变化,但由于实际电路中会存在时钟偏差和不同的路径延时,二进制计数器在自增时会不可避免地产生错误的中间结果,如图Fig.2.2.2。
Fig.2.2.2上图是Fig.2.2.1的电路原型以及局部波形的放大。
Quartus II LPM使用指南(FIFO篇)
下图中是 SCFIFO 和 DCFIFO 的框图,其中,SCFIFO 中读写双方信号与时钟 clock 同步,DCFIFO 读写双方信号分别与读写时钟同步。
表一中列出 FIFO 中各个 IO 的详细描述: 表一 端口描述
端口
类型 是否必选
描述
Clock
输入
是
上升沿触发时钟
Wrclk
当该信号有效时,FIFO 会被认为已经读空,此时不能 再进行读操作;
准装满信号,当 usedw 大于参数 almost_full_value 或 相同时,该信号被激活,即是 full 信号被激活的预示; 准读空信号,当 usedw 小于参数 almost_empty_value 或相同时,该信号被激活,即是 empty 信号被激活的 预示; 显示当前 FIFO 中数据存量。
Rdreq
输入
是
Sclr
输入
非
Aclr
Q
输出
是
Full Wrfull Rdfull Empty Wrempty Rdempty Almost_full
输出
非
输出
非
输出
非
Almost_empty
输出
否
Usedw Wrusedw Rdusedw
输出
否
FIFO 篇
第 -5- 页
Rdreq Rdfull Rdempty Rdusedw 当 wrreq 有效时数据线上的数据通过 DATA 端口被写 入 FIFO 中 写请求信号,激发写入操作。 1.当 full(对于 SCFIFO)或 wrfull(对于 DCFIFO)有 效时,不能激活 wrreq 信号,参数 overflow_checking 设置为 ON,即在 full 状态下 FIFO 会自动无视写请求; 2.不能再 aclr 有效期间激活 wrreq 信号; 3. 使 用 Stratix 和 Cyclone 系 列 器 件 ( 除 了 Stratix, Stratix GX, 和 Cyclone 系 列 以 外 ) 需 要 将 write_aclr_synch 参数选择位 ON,确保符合限制条件。 读请求信号,激发读出操作。 1. 该信号 的作用在正 常模式下和 在预读模式 下的作用 有很多不同(详情见后文); 2.当 empty(对于 SCFIFO)或 rdempty(对于 DCFIFO) 有效时,不能激活 rdreq 信号,参数 underflow_checking 设置为 ON,即在 full 状态下 FIFO 会自动无视读请求; 清零端口,详情见后文
quartus 异步fifo用法 -回复
quartus 异步fifo用法-回复quartus异步FIFO用法引言:在数字电路设计中,FIFO(First In First Out)是一种常见的数据存储器,它允许数据以先进先出的顺序进出。
在使用Quartus进行FPGA设计时,异步FIFO是一种非常有用的工具,它可以帮助我们处理不同速度的数据流,并实现数据的缓冲和流量控制。
本文将介绍Quartus异步FIFO的基本概念和使用方法,并给出一些实例。
第一部分:Quartus异步FIFO概述1.1 什么是异步FIFO?异步FIFO是一种数据存储器,在其中数据可以以不同速度进入和退出。
与同步FIFO不同,异步FIFO的读写时钟可以是不同的,这使得它可以处理速度不匹配的数据流。
Quartus提供了异步FIFO的库函数和IP核,使得它可以在FPGA设计中方便地使用。
1.2 Quartus异步FIFO的特点Quartus异步FIFO具有以下特点:- 可以使用不同的时钟频率进行读写操作。
- 可以配置不同的缓冲深度来满足特定的设计需求。
- 可以实现流量控制和数据的重排序。
- 可以支持并行读写和读写使能信号。
- 可以适应不同的数据宽度和时钟域要求。
第二部分:Quartus异步FIFO的使用方法2.1 创建异步FIFO在Quartus中创建异步FIFO的方式有两种:使用库函数和使用IP核。
使用库函数创建异步FIFO的步骤如下:- 首先,在Quartus中打开设计工程,并创建一个新的源文件。
- 然后,将异步FIFO的库函数导入到源文件中,以便在设计中调用它。
- 接着,实例化异步FIFO,并通过参数配置其属性,例如宽度,深度,时钟域等。
- 最后,将异步FIFO连接到其他逻辑模块,完成设计。
使用IP核创建异步FIFO的步骤如下:- 首先,在Quartus中打开设计工程,并创建一个新的IP核。
- 然后,在IP核的界面中选择合适的FIFO类型和配置参数。
- 接着,将异步FIFO实例化到设计中,将其连接到其他逻辑模块。
异步fifo的工作原理
异步fifo的工作原理今天咱们来唠唠异步FIFO这个超有趣的东西哦。
你可以把异步FIFO想象成一个特别的小仓库,这个小仓库是用来存放数据的呢。
不过它可有点特别,和咱们平常那种规规矩矩同步的仓库不太一样。
异步FIFO主要是在不同时钟域之间工作的。
就好比啊,有两个世界,一个世界的节奏快,另一个世界的节奏慢,异步FIFO就在这两个节奏不一样的世界之间搭起了一座数据的桥梁。
那它怎么存数据呢?当有数据要进来的时候,就像是有人要往这个小仓库里送货。
在写端口这边,有一个写指针,这个写指针就像一个小向导,它告诉大家数据应该放在仓库的哪个位置。
每次有新的数据要存进来,写指针就会指向下一个空闲的地方。
就像我们在图书馆书架上找空位放书一样,写指针就是那个帮我们找空位的小助手。
再说说读这边吧。
读端口有个读指针,这个读指针就负责从仓库里取数据。
它就像一个小管家,知道哪些数据已经被取走了,哪些还在仓库里等着被取。
读指针也是一步一步地移动,每次取走一个数据,就会指向下一个要取的数据的位置。
这里面有个超关键的东西,就是空满标志的判断。
你想啊,如果仓库满了,还往里塞东西,那不就乱套了嘛;或者仓库都空了,还在傻乎乎地去取数据,那也不行呀。
对于空满标志的判断呢,其实有点小巧妙。
因为是异步的,时钟不一样,所以不能简单地用一个计数器来判断。
一般会采用一些特殊的编码方式,像是格雷码。
为啥用格雷码呢?这就像是给这个小仓库的货物管理上了一道保险。
格雷码的好处就是相邻的码值只有一位不同。
这样在不同时钟域转换的时候,就不容易出错啦。
比如说,写指针和读指针在判断满的时候,不是简单地看数字大小哦。
因为时钟不一样,数字可能会乱套。
用格雷码就不一样啦,它能很准确地判断出是不是真的满了。
就好像是两个人在不同的节奏下数数,但是通过一种特殊的规则,能准确知道什么时候仓库满了。
还有哦,异步FIFO的深度也是个很重要的概念。
深度就像是这个小仓库的大小。
如果数据来的太快,而读的速度又跟不上,那仓库就得大一点,不然就容易满了溢出来。
异步FIFO设计
异步FIFO设计2011.6.22摘要本文采用格雷码设计了一个异步FIFO,经过DC综合的结果如下:时钟频率:1.1GHz面积: 10744.447um2功耗: 7.791mw目录1. 异步FIFO的设计 (22)1.1 异步FIFO简介 (22)1.2 FIFO的参数 (22)1.3 FIFO的设计原理 (22)1.4 FIFO的设计模块 (66)1.5 用modelsim仿真FIFO (1111)1.6 用DC对FIFO进行综合 (1313)2.参考文献 (1515)1. 异步FIFO的设计1.1 异步FIFO简介FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。
同步FIFO是指读时钟和写时钟为同一个时钟。
在时钟沿来临时同时发生读写操作。
异步FIFO是指读写时钟不一致,读写时钟是互相独立的。
异步FIFO(Asynchronous FIFO),一般用于不同时钟域之间的数据传输,比如FIFO的一端连接频率较低的AD数据采样信号,另一端与计算机的频率较高的PCI总线相连。
另外,对于不同宽度的数据接口也可以用AFIFO,例如单片机为8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用AFIFO来达到数据匹配的目的。
由于实际中,异步FIFO比较常见。
为了便于描述,在后面的章节中将异步FIFO简称为FIFO.1.2 FIFO的参数FIFO的宽度:进行一次读写操作的数据的位宽。
FIFO的深度:双口存储器中能容纳的数据的总数。
满标志: FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出。
quartus 异步fifo用法 -回复
quartus 异步fifo用法-回复Quartus 异步FIFO 用法说明引言:在现代数字系统设计中,FIFO(先进先出)是一种常见的数据缓冲区,用于解决数据在不同速度的模块之间的数据流问题。
在Quartus 中,异步FIFO 提供了一种灵活和方便的方式来实现数据的缓冲和流控。
本文将逐步介绍Quartus 异步FIFO 的基本用法,帮助读者了解其操作和配置。
第一步:创建FIFO首先,在Quartus 中打开自己的设计项目,选择要创建异步FIFO 的模块。
然后,点击菜单栏中的"Project",选择"New",再选择"FIFO MegaWizard"。
接下来,按照提示选择FIFO 的类型、数据位宽和深度等配置参数。
请注意,深度是指FIFO 可以容纳的数据数量。
点击"Next"继续,然后会出现一个界面,该界面将由Quartus 生成FIFO 的RTL(寄存器传输级)代码。
在这个界面上,您可以选择生成的接口样式以及其他自定义选项。
完成配置后,点击"Finish",Quartus 将自动生成FIFO 的VHDL 或Verilog 代码,并将其添加到项目中。
第二步:添加FIFO 的输入和输出端口一旦FIFO 生成完成并添加到项目中,您需要将其引入到适当的模块中,并为其添加输入和输出端口。
假设我们将FIFO 引入到名为"Top_Module"的模块中,请按照以下步骤进行操作:1. 在"Top_Module"的代码中,将FIFO 的引用添加为一个实例,例如:fifo_inst : entity work.my_fifoport map (clk => internal_clk,reset => reset,wr_data => data_in,wr_en => write_enable,rd_data => data_out,rd_en => read_enable,full => fifo_full,empty => fifo_empty);2. 根据您的设计需要,为FIFO 添加输入和输出信号。
在FPGA中进行fifo配置
今天我们来讨论一下通过Quartus2中的Mega-plugin来配置一个FIFO,这是偏软件的,但是今天我把归为硬件来讲,因为其中有许多是硬件相关联的。
首先我们TOOLS进入配置界面,选择"creat a custome megafuction variation",进入第2页然后在左面点开“memory compiler",然后选择FIFO,同时在右边填入自命名的器件名字。
点下一步,在这一步中要设置FIFO的数据宽度,FIFO的深度,FIFO的类型(同步FIFO还是异步FIFO,他们的区别后面会说到),这要根据你的实际系统来设置,需要注意的是输出数据与输入数据宽度可以不一样,但是他们的宽度不能随便设置,另外FIFO的深度是2的幂,这里你选择同步FIFO与异步FIFO下一步的设置将不一样,点下一步,如果你前面选择了同步FIFO,那么这一步你需要设置FIFO的握手信号与状态信号有full(满),empty (空),almostfull(几乎满),almostempty(几乎空),Asynchronous clear(异步清零),如果你选择了异步FIFO,那么在读与写两边就要单独设置,读写两边均有full, empty, usedwide(使用深度)3个信号,你可以根据你的实际系统来决定需要哪些信号。
点下一步设置两个内容,一个是FIFO的输出的两种形式,一种是传统的同步方式,即你在有readreq='1'的一个周期后才能读取数取,另一种为show ahead,即为你在readreq='0'时,数据口就一直有一个数据,在读取数据时不用等待一个周期。
第二个设置就是综合出FIFO是用一般逻辑单元,还是使用专用的M4K块(当然这需要在该器件有M4K块才可以)。
点下一步重要是选择速度优先还是面积优先。
然后就可以点FINISH了。
你的FIFO就配置完成了,你可以到.bdf文件中去调用FIFO模块,也可以在程序中实例化该模块。
fifo使用
【转】同步FIFO和异步FIFO的Verilog实现2011-10-10 10:59:26| 分类:FPGA学习 | 标签:fifo verilog fpga|举报|字号订阅FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端是AD数据采集,另一端是计算机的PCI总线,假设其AD采集的速率为16位 100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速率为 1056Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。
另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而 DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。
FIFO的分类根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。
同步FIFO是指读时钟和写时钟为同一个时钟。
在时钟沿来临时同时发生读写操作。
异步FIFO是指读写时钟不一致,读写时钟是互相独立的。
FIFO设计的难点 FIFO设计的难点在于怎样判断FIFO的空/满状态。
为了保证数据正确的写入或读出,而不发生益处或读空的状态出现,必须保证FIFO在满的情况下,不能进行写操作。
在空的状态下不能进行读操作。
怎样判断FIFO的满/空就成了FIFO设计的核心问题。
..................................................................... ....................................................................同步FIFO的Verilog代码之一在modlesim中验证过。
lpm_fifo使用、详细参数
lpm_fifo使⽤、详细参数⼀、lpm_fifo的使⽤⽅法1、建⽴.mif格式⽂件⾸先在Quartus II中打开ROM数据⽂件的编辑窗⼝,即:File——New命令。
并在New 窗⼝中选择Memory Initialization File选项,单击OK按钮后产⽣ROM数据⽂件的选项窗⼝如图1-1.完成后,选择File-SaveAs命令,保存此数据⽂件,在这⾥可取名为fifod.Mif。
1-1a1-1b图1-12、制定lpm_fifo元件的制定打开Mega WizardPlug-In Manager初始化对话框。
选择Tools——Mega Wizard Plug-In Manager命令,打开如图1-2a的对话框图1-2a如图选择Cerate a......选项,单击next,制定⼀个新的模块。
如图1—2b图1-2b3、选择ROM控制线、地址线和数据线。
在Memory Compiler下的FIFO,⼀路单击next,如图1-3a,1-3b,1-3c,1-3d,1-3e,1-3f,1-3g,1-3h。
1-3a1-3b1-3c1-3d1-3e1-3f1-3g1-3h4、单击YES,最后⽣成的ROM_FIFO⽂件如下所⽰:LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;4ENTITY data ISPORT(clock : IN STD_LOGIC ;data : IN STD_LOGIC_VECTOR (7 DOWNTO 0);rdreq : IN STD_LOGIC ;wrreq : IN STD_LOGIC ;empty : OUT STD_LOGIC ;full : OUT STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);usedw : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) ); END data;ARCHITECTURE SYN OF data ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (5 DOWNTO 0); SIGNAL sub_wire1 : STD_LOGIC ;SIGNAL sub_wire2 : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL sub_wire3 : STD_LOGIC ;COMPONENT scfifoGENERIC (add_ram_output_register : STRING;intended_device_family : STRING;lpm_numwords : NATURAL;lpm_showahead : STRING;lpm_type : STRING;lpm_width : NATURAL;lpm_widthu : NATURAL;overflow_checking : STRING;underflow_checking : STRING;use_eab : STRING);PORT (usedw : OUT STD_LOGIC_VECTOR (5 DOWNTO 0); rdreq : IN STD_LOGIC ;empty : OUT STD_LOGIC ;clock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);wrreq : IN STD_LOGIC ;data : IN STD_LOGIC_VECTOR (7 DOWNTO 0);full : OUT STD_LOGIC);END COMPONENT;BEGINusedw <= sub_wire0(5 DOWNTO 0); empty <= sub_wire1;q <= sub_wire2(7 DOWNTO 0);full <= sub_wire3;scfifo_component : scfifoGENERIC MAP (add_ram_output_register => "OFF", intended_device_family => "Cyclone III", lpm_numwords => 64,lpm_showahead => "OFF",lpm_type => "scfifo",lpm_width => 8,lpm_widthu => 6,overflow_checking => "ON", underflow_checking => "ON",use_eab => "ON")PORT MAP (rdreq => rdreq,clock => clock,wrreq => wrreq,data => data,usedw => sub_wire0,empty => sub_wire1,q => sub_wire2,full => sub_wire3);END SYN;5、参量的含义和设置⽅法⼆、lpm_shifreg 模块的使⽤⽅法1:建⽴.mif 格式⽂件⾸先在QuartusⅡ中打开File 菜单下的New命令,并在New窗⼝中选择Memory Initialization File 选项,单击OK按钮后产⽣数据⼤⼩选择窗⼝,如下图1.1所⽰。
异步FIFO的设计文档
异步FIFO的设计版本v1.02011-05-06异步FIFO的设计一.功能描述本设计用16*8 RAM实现一个异步FIFO,具体功能定义如下:1. 异步复位。
2. FIFO不为满时,当写使能有效时,在写时钟的上升沿向FIFO中写入数据。
3. FIFO不为空时,当读使能有效时,在读时钟的上升沿从FIFO中读出数据。
4. 当FIFO写满的时候,产生满信号;当FIFO读空的时候,产生空信号。
5. FIFO一旦空或者满时候,复位FIFO;二.输入输出信号描述信号名输入/输出目标/源功能描述Rclk Input Pin 读时钟频率,10M ,占空比1:1。
Wclk Input Pin 写时钟,频率10M ,占空比1:1。
data_in[7:0] Input Pin 8位的输入数据rd_en Input Pin 读使能,高电平有效,在FIFO非空时,CLK上升沿读入数据;wr_en Input Pin 写使能,高电平有效,在FIFO非满时,CLK上升沿写入数据;Rst Input Pin 异步清零,低电平有效,低电平时读地址,写地址,计数器都清零。
三顶层划分图1 系统框图顶层模块说明:1.RAM :存储器模块,用于存放及输出数据;2.Waddr_Reg : 保存访问RAM的写地址;3.Raddr_Reg : 保存访问RAM的写地址;4.Wbin_addr : 计算RAM下一个写地址;5.Rbin_addr : 计算RAM下一个读地址;6.Gwaddr_reg : 将写地址的二进制编码转换成格雷码,并保存;7.Graddr_reg : 将读地址的二进制编码转换成格雷码,并保存;8.Syn_Rfield : 将写地址同步到读时钟域,并产生空标志;9.Syn_Wfield : 将读地址同步到写时钟域,并产生满标志;10、Reset_Unit : 复位信号产生单元设计思想说明:1、由于实现的异步FIFO,分别用不同的读、写时钟产生读写地址,因此FIFO 的判空和判满是本设计中的一个难点。
异步fifo格雷码的约束
异步fifo格雷码的约束异步FIFO格雷码是一种常用于数据传输和存储的技术,它能够在数据读写方面提供高效的解决方案。
该技术实现起来很简单,但需要注意一些约束条件,以确保数据传输的正确性和可靠性。
首先,异步FIFO格雷码需要提供一个读写指针,用于指示当前读写的位置。
读写指针需要满足以下约束条件:1. 写指针必须指向下一个可写位置,即写指针只能在读指针前面或者等于读指针。
2. 读指针必须指向下一个可读位置,即读指针只能在写指针前面或者等于写指针。
这些约束条件的目的在于防止读写指针的重叠和失序,确保数据读写的正确性和可靠性。
另外,异步FIFO格雷码还需要使用状态机控制数据的读写。
状态机需要满足以下约束条件:1. 状态机必须保持同步,即状态转移需要在时钟信号的上升沿完成。
2. 状态机需要根据读写指针的位置控制数据的读写,确保数据读写的正确性和可靠性。
以上约束条件是异步FIFO格雷码实现中非常重要的限制条件,需要严格遵守才能够保证数据传输的正确性和可靠性。
同时,在实际的应用中,还需要注意以下几个方面:1. 异步FIFO格雷码的读写速度需要相匹配,否则会出现溢出或者死循环等问题。
2. 异步FIFO格雷码需要具备错误检测和纠错的功能,可以通过添加CRC校验码或者自校验码来实现。
3. 异步FIFO格雷码的缓存区需要具备足够的容量,以确保数据传输不会出现阻塞或丢失的情况。
综上所述,异步FIFO格雷码的约束涉及到读写指针、状态机的控制和缓存区的容量等多个方面,需要根据具体应用情况进行合理的策略选择和实现。
只有在严格遵守约束条件并且充分考虑应用需求的情况下,才能够实现高效的数据传输和存储。
异步FIFO理解
异步FIFO理解⼀、异步FIFO与同步FIFO的区别异步FIFO通常⽤于时钟域的过渡,是双时钟设计,即FIFO⼯作于独⽴的两个时钟之间,也就是读写时钟域不同。
⼆、难点及解决⽅法⼀是如何同步异步信号以及处理亚稳态问题;针对这⼀难点,采⽤的是使⽤格雷码指针和⼆进制指针及握⼿信号。
就是现将写指针同步到读时钟域,读指针同步到写时钟域,然后通过格雷码判断空满。
⼆是如何正确地设计空/满等信号的控制电路。
针对这⼀难点,利⽤读写指针相互⽐较产⽣空/满标志,采⽤两种⽅法来辨别空/满两种状态:⼀种是在读写地址前加⼀位附加位,通过附加位来辨别空/满状态;(本⽂使⽤该种⽅法,其实两种归根结底就是加⼀个标志)另⼀种⽅法是通过划分地址空间来判断。
三、深度的计算⽹上找的⼀个例⼦,⼀个8bit宽的AFIFO,输⼊时钟为100MHz,输出时钟为95MHz,设⼀个package为4Kbit,且两个package之间的发送间距⾜够⼤。
问AFIFO的深度。
burst_length=4K/8=500deep=500-500X95/100 =25四、格雷码和⼆进制码之间的转换1.gray to binalways @ (gray)for(i=0;i<SIZE;i=i+1)bin[i] = bin[i]^(gray>>i)2.bin to grayassign gray = (bin>>1)^bin;五、整体结构图(style #1 if you have saw SNUG user guide)Simulation and Synthesis Techniques for Asynchronous的⽹盘链接链接:/s/1ntsqGjR密码:scfz五、Verilog关键代码//topmodule asyn_fifo(rdata, // Data path from FIFOrempty, // Flag asserted high for empty stackwfull , // Flag asserted high for full stackwdata, // Data path into FIFOwinc,wclk,wrst_n,rinc,rclk,rrst_n);parameter DSIZE = 8;parameter ASIZE = 4;output [DSIZE -1 : 0] rdata;output rempty, wfull;input [ASIZE -1 : 0] wdata;input winc,wclk,wrst_n;input rinc,rclk,rrst_n;wire [ASIZE-1:0] waddr, raddr;wire [ASIZE:0] wptr, rptr, wq2_rptr, rq2_wptr;sync_r2w i_sync_r2w (.wq2_rptr(wq2_rptr), .rptr(rptr),.wclk(wclk), .wrst_n(wrst_n)); sync_w2r i_sync_w2r (.rq2_wptr(rq2_wptr), .wptr(wptr),.rclk(rclk), .rrst_n(rrst_n)); fifomem #(DSIZE, ASIZE) i_fifomem(.rdata(rdata), .wdata(wdata),.waddr(waddr), .raddr(raddr),.wclken(winc), .wfull(wfull),.wclk(wclk));rptr_empty #(ASIZE) i_rptr_empty(.rempty(rempty),.raddr(raddr),.rptr(rptr), .rq2_wptr(rq2_wptr),.rinc(rinc), .rclk(rclk),.rrst_n(rrst_n));wptr_full #(ASIZE) i_wptr_full(.wfull(wfull), .waddr(waddr),.wptr(wptr), .wq2_rptr(wq2_rptr),.winc(winc), .wclk(wclk),.wrst_n(wrst_n));endmodule//read to writemodule sync_r2w#(parameter ADDRSIZE = 4)(output reg [ADDRSIZE:0] wq2_rptr,input [ADDRSIZE:0] rptr,input wclk, wrst_n);reg [ADDRSIZE:0] wq1_rptr;always @(posedge wclk or negedge wrst_n)if (!wrst_n)wq1_rptr <= 0;else wq1_rptr <= rptr;always @(posedge wclk or negedge wrst_n)if (!wrst_n)wq2_rptr <= 0;else wq2_rptr <= wq1_rptr;endmodule//write fullmodule wptr_full#(parameter ADDRSIZE = 4)(output reg wfull,output [ADDRSIZE-1:0] waddr,output reg [ADDRSIZE :0] wptr,input [ADDRSIZE :0] wq2_rptr,input winc, wclk, wrst_n);reg [ADDRSIZE:0] wbin;wire [ADDRSIZE:0] wgraynext, wbinnext;// GRAYSTYLE2 pointeralways @(posedge wclk or negedge wrst_n)if (!wrst_n) {wbin, wptr} <= 0;else {wbin,wptr } <= {wbinnext, wgraynext};// Memory write-address pointer (okay to use binary to address memory)assign waddr = wbin[ADDRSIZE-1:0];assign wbinnext = wbin + (winc & ~wfull);assign wgraynext = (wbinnext>>1) ^ wbinnext;//------------------------------------------------------------------assign wfull_val = (wgraynext=={~wq2_rptr[ADDRSIZE:ADDRSIZE-1],wq2_rptr[ADDRSIZE-2:0]});always @(posedge wclk or negedge wrst_n)if (!wrst_n) wfull <= 1'b0;else wfull <= wfull_val;endmodulemodule fifomem #(parameter DATASIZE = 8, // Memory data word widthparameter ADDRSIZE = 4) // Number of mem address bits(output [DATASIZE-1:0] rdata,input [DATASIZE-1:0] wdata,input [ADDRSIZE-1:0] waddr, raddr,input wclken, wfull, wclk);reg [DATASIZE-1:0] mem[15:0];asign rdata = mem[raddr];always @(posedge wclk)if (wclken && !wfull) mem[waddr] <= wdata; endmodule。
异步FIFO
异 步 FIFO 结 构(第一部分)作者:Vijay A.Nebhrajani翻译:Adam Luo2006年7月设计一个FIFO是ASIC设计者遇到的最普遍的问题之一。
本文着重介绍怎样设计FIFO——这是一个看似简单却很复杂的任务。
一开始,要注意,FIFO通常用于时钟域的过渡,是双时钟设计。
换句话说,设计工程要处理(work off)两个时钟,因此在大多数情况下,FIFO工作于独立的两个时钟之间。
然而,我们不从这样的结构开始介绍—我们将从工作在单时钟的一个FIFO特例开始。
虽然工作在同一时钟的FIFO在实际应用中很少用到,但它为更多的复杂设计搭建一个平台,这是非常有用的。
然后再从特例推广到更为普通的FIFO,该系列文章包括以下内容:1.单时钟结构2.双时钟结构——双钟结构13.双时钟结构——双钟结构24.双时钟结构——双钟结构35.脉冲模式FIFO单时钟FIFO特例FIFO有很多种结构,包括波浪型(ripple)FIFO,移位寄存器型以及其他一些我们并不关心的结构类型。
我们将集中讨论包含RAM存储器的结构类型。
其结构如图1所示。
通过分析,我们看到图中有一个具有独立的读端口和独立的写端口的RAM 存储器。
这样选择是为了分析方便。
如果是一个单端口的存储器,还应包含一个仲裁器保证同一时刻只能进行一项操作(读或写),我们选择双口RAM(无需真正的双口RAM,因为我们只是希望有一个简单的相互独立的读写端口)是因为这些实例非常接近实际情况。
读、写端口拥有又两个计数器产生的宽度为log2(array_size)的互相独立的读、写地址。
数据宽度是一个非常重要的参数将在在稍后的结构选择时予以介绍,而现在我们不必过分的关心它。
为了一致,我们称这些计数器为“读指针”(read pointer)和“写指针”(write pointer)。
写指针指向下一个将要写入的位置,读指针指向下一个将要读取的位置。
每次写操作使写指针加1,读操作使读指针加1。
异步FIFO结构及FPGA设计 ---跨时钟域设计
异步FIFO结构及FPGA设计 ---跨时钟域设计1、异步FIFO介绍在现代的集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个时钟。
多时钟域带来的一个问题就是,如何设计异步时钟之间的接口电路。
异步 FIFO(First In First Out)是解决这个问题一种简便、快捷的解决方案。
使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据。
在网络接口、图像处理等方面, 异步FIFO得到了广泛的应用。
异步FIFO是一种先进先出的电路,使用在需要产时数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。
在异步电路中,由于时钟之间周期和相位完全独立,因而数据的丢失概率不为零。
如何设计一个高可靠性、高速的异步FIFO电路便成为一个难点。
本文介绍解决这一问题的一种方法。
由图1可以看出:整个系统分为两个完全独立的时钟域——读时钟域和写时间域;FIFO的存储介质为一块双端口RAM,可以同时进行读写操作。
在写时钟域部分,由写地址产生逻辑产生写控制信号和写地址;读时钟部分由读地址产生逻辑产生读控制信号和读地址。
在空/满标志产生部分,由读写地址相互比较产生空/满标志。
2、异步FIFO的设计难点设计异步FIFO有两个难点:一是如何同步异步信号,使触发器不产生亚稳态;二是如何正确地设计空、满以及几乎满等信号的控制电路。
下面阐述解决问题的具体方法。
2.1 亚稳态问题的解决在数字集成电路中,触发器要满足setup/hold的时间要求。
当一个信号被寄存器锁存时,如果信号和时钟之间不满足这个要求,Q端的值是不确定的,并且在未知的时刻会固定到高电平或低电平。
这个过程称为亚稳态(Metastability)。
图2所示为异步时钟和亚稳态,图中clka和clkb为异步时钟。
亚稳态必定会发生在异步FIFO中。
图中在异步FIFO中,电路外部的输入和内部的时钟之间是毫无时间关系的,因此setup/hold冲突是必然的;同在电路内部的两个没有关系的时钟域之间的信号传递,也必须会导致setup/hold冲突。
对altera的FIFO读写操作深入研究
对altera的FIFO读写操作深入研究支持原创,如需转载请注明出处。
由于本人一直使用的是A家的芯片,所以本次针对FIFO的读写操作也仅仅是在调用Quartus ii上的IP核上进行。
针对FIFO有两种使用方式,同步FIFO和异步FIFO,同步的不想多说。
以下所有操作均为异步FIFO即DCFIFO。
1.针对FIFO读操作的两种不同设计做一下解释:Normal mode 和Show-ahead mode,前者为先来读请求信号,接下来一个时钟才将q端数据读出。
后者来读请求信号,这即将q读数据读出。
IP核设置如图(1)两种时序操作如下图:Normal modeNormal mode:将读信号rdreq置高后,下个时钟才能将q端数据读出。
Show-ahead modeShow-ahead mode:将读信号rdreq置高后,该时钟才能将q 端数据读出,即数据已经在q端口准备好,读请求一到数据即读出。
2.针对rdusedw和rdempty的使用。
一般读取操作判断FIFO中数据都是根据rdusedw和rdempty来决定是否开启读操作的。
当你读完FIFO内数据的同时,读端口状态并不会马上响应,即rdusedw不会在紧接的时钟为0,rdempty不会高电平有效。
这是由于FIFO有读保护逻辑,所以更新才会慢上两拍,如果此时再更具该信号判断FIFO是否可读必然会处错误,所以解决办法延时一个时钟之后再判断reusedw是否大于0来决定能否开启下一读取操作(有先决条件)。
前方高能预警:上述操作针对的情况是读时钟 rdclk >= 2wrclk,如果不满足条件就会导致FIFO满。
因为通过判断reusedw大于0,开启读操作,之后再延时1个时钟等待reusedw变化,本次读操作需要两个时钟才完成,若不满足 rdclk >= 2wrclk必然会导致FIFO满状况的出现。
针对 wrclk < rdclk < 2wrclk情况,一般操作是可以让FIFO中缓存一定数量的数据,之后在开始进行读取操作,这样FIFO中的数据一段一段的读出就不会有问题。
异步FIFO
使用FIFO同步源自不同时钟域的数据是在数字IC设计中经常使用的方法,设计功能正确的FUFO会遇到很多问题,探讨了两种不同的异步FIFO的设计思路。
两种思路都能够实现功能正确的PIFO。
本文所研究的FIFO,从硬件的观点来看,就是一块数据内存。
它有两个端口,一个用来写数据,就是将数据存入FIFO;另一个用来读数据,也就是将数据从FIFO当中取出。
与FIFO操作相关的有两个指针,写指针指向要写的内存部分,读指针指向要读的内存部分。
FIFO控制器通过外部的读写信号控制这两个指针移动,并由此产生FIFO空信号或满信号。
对于异步FIFO而言,数据是由某一个时钟域的控制信号写入FIFO,而由另一个时钟域的控制信号将数据读出FIFO。
也就是说,读写指针的变化动作是由不同的时钟产生的。
因此,对FIFO空或满的判断是跨时钟域的。
如何根据异步的指针信号对FIFO的满状态或空状态进行正确的判断是本文研究的重点。
此外,设计过程中的一些细节问题也将在文中涉及到。
1 指针以及满空信号的产生为了更好地说明问题,先探讨一下同步FIFO指针移动以及满空信号的产生过程。
对于同步FIFO,读写指针都指向一个内存的初始位置,每进行一次读写操作,相应的指针就递增一次,指向下一个内存位置。
当指针移动到了内存的最后一个位置时,它又重新跳回初始位置。
在FIFO非满或非空的情况下,这个过程将随着读写控制信号的变化一直进行下去。
如果FIFO处于空的状态,下一个读动作将会导致向下溢出(underflow),一个无效的数据被读人;同样,对于一个满了的FIFO,进行写动作将会导致向上溢出(overflow),一个有用的数据被新写入的数据覆盖。
这两种情况都属于误动作,因此需要设置满和空两个信号,对满信号置位表示FIFO处于满状态,对满信号复位表示FIFO非满,还有空间可以写入数据;对空信号置位表示FIFO处于空状态,对空信号复位表示FIFO非空,还有有效的数据可以读出。
异步FIFO在FPGA与DSP通信中的运用
www d ian zik e ji o rg
53
电子 电路
胡波, 等: 异步 F IFO 在 FPGA 与 D SP 通信中的运用
的关键。
判断 F IFO为空还是满, 本文采用如下算法: 构 造一个指针宽度为 N + 1, 深度为 2N By te的 F IFO, 当
读、写指针的二进制 码中最高位不一致而其他 N 位 都相等时, F IFO 为 满。当 读、写 指针完 全相 等时,
其发生的概率降到最低。其中的一个方法就是使用格 雷码。格雷码在相邻的两个码元之间只有一位变换。 这就避免了读、写指针与时钟同步的时候发生亚稳态
else { wq2_rptr, w q1_rptr} < = { wq1_rptr, rptr}。
( 4)将写指针用两级 D 触发器与读时钟同步
现象。另外 一种方 法就是 使用两 级 D 触发 器同步,
另外一种方法就是使用两级触发器同步假设一个d触发器发生亚稳态的概率为p那么两个级联的d触发器发生亚稳态的概率就为p综上所述本文设计了如图1所示的fifofifo的输入端口有wclkrrstn读复位sendbegin启动数据发送dsp发送给fpgawdatadsize输出端口为rdatadsizefull写满标志rempty读空标志ready数据准备好fpga发送给dspfifo的深度设为048即一共有048个16位数据存贮单元当写复位无效写使能有效时fpga就在写时钟的控制下将数据写入fifo中将数据准备好信号置为有效通知dspfifo写满情况出现时写满标志置为有效阻止继续向fifo中写入数据
if ( ! w rst_n) w full < = 1∀b0;
else w full &l志 assign rem pty_val= ( rgraynext= = rq2_w ptr); alw ays@ ( posedge rc lk o r negedge rrst_n) if ( ! rrst_n)
异步fifo时序约束
异步FIFO时序约束在数字电路设计中,异步FIFO(First-In First-Out)是一种常见的同步和异步信号之间的缓冲器。
由于FIFO是在不同的时钟域上操作,因此需要考虑时序约束以确保数据正确传输。
本文将介绍异步FIFO的时序约束及其重要性。
一、异步FIFO简介异步FIFO是一种存储器,它可以在不同的时钟域上读写数据。
在数字电路设计中,FIFO被广泛应用于解决不同时钟域之间的数据传输问题。
由于异步FIFO 涉及跨时钟域的操作,因此需要特别注意时序约束,以避免数据冲突和亚稳态问题。
二、异步FIFO时序约束异步FIFO的时序约束主要包括以下几个方面:1.读/写时钟域的约束:为了保证数据的正确传输,读/写时钟域必须满足一定的时序要求。
具体来说,写时钟域的频率应该高于读时钟域的频率,以避免数据在FIFO中溢出。
同时,两个时钟域之间的相位差也应该控制在一定的范围内,以避免数据读写时出现冲突。
2.读/写指针的约束:读/写指针是FIFO中用于追踪读写位置的变量。
为了保证数据的正确读写,读/写指针必须满足一定的时序要求。
具体来说,写指针的更新应该发生在写时钟域的上升沿,而读指针的更新应该发生在读时钟域的上升沿。
这样可以确保在正确的时钟周期内进行数据读写操作。
3.数据有效性的约束:由于异步FIFO涉及跨时钟域的操作,因此需要考虑数据的有效性。
具体来说,当读指针小于写指针时,FIFO中的数据是有效的;而当读指针大于或等于写指针时,FIFO中的数据是无效的。
因此,需要根据实际情况对数据的读写进行控制,以确保数据的正确性。
4.空/满标志的约束:空/满标志是用于指示FIFO是否为空或满的标志位。
为了保证数据的正确传输,空/满标志必须满足一定的时序要求。
具体来说,当FIFO为空或满时,相应的标志位应该被及时更新;而当FIFO不为空或满时,相应的标志位应该保持不变。
这样可以确保在正确的时钟周期内进行数据读写操作。
三、结论异步FIFO时序约束是数字电路设计中需要考虑的重要问题之一。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
quartus 异步fifo用法
在Quartus中使用异步FIFO,可以通过IP Core Catalog中的"ALTAsyncFIFO"来实现。
以下是使用异步FIFO的步骤:
1. 打开Quartus Prime软件。
点击"File"菜单,选择"New Project"来创建一个新的项目。
2. 在"New Project Wizard"中,选择项目的名称、储存位置和顶层实体的文件。
点击"Next"继续。
3. 在"Add Files"步骤中,添加设计文件,包括顶层实体和其他组件文件。
点击"Next"继续。
4. 在"Family and Device Settings"步骤中,选择您的目标FPGA 器件。
点击"Next"继续。
5. 在"EDA Tool Settings"步骤中,选择Quartus使用的EDA工具。
点击"Next"继续。
6. 在"Summary"步骤中,查看项目设置的摘要。
点击"Finish"完成项目创建。
7. 在Quartus主界面的左侧面板中,点击"IP"选项卡,然后选择"Library"。
在IP Core Library窗口中,搜索"ALTAsyncFIFO"。
8. 在搜索结果中,选择"ALTAsyncFIFO"并点击"OK"来添加该
IP到项目中。
9. 在设计文件中实例化ALTAsyncFIFO组件。
可以使用Quartus的"IP Catalog"来生成实例化代码。
10. 配置ALTAsyncFIFO的参数,包括FIFO大小、输出宽度、寄存器位宽等。
11. 连接适当的信号到ALTAsyncFIFO组件的输入和输出端口。
12. 运行Quartus中的"Analysis & Synthesis"和"Implementation"
工具,以生成逻辑网表和比特流文件。
13. 下载比特流文件到FPGA器件,并验证异步FIFO的功能。
注意:在使用异步FIFO时,需要特别注意时序设计和异步信
号的同步,以确保正确的数据传输和避免异步冲突。