异步FIFO的Verilog设计

合集下载

异步fifo的uvm验证原理

异步fifo的uvm验证原理

异步fifo的uvm验证原理异步FIFO(First-In-First-Out,先进先出)是一种常用的数据缓冲区结构,常用于解决不同速率的数据传输问题。

UVM (Universal Verification Methodology,通用验证方法学)是一种系统级验证方法学,用于验证硬件设计。

在UVM中,对异步FIFO的验证需要对FIFO的功能和时序进行验证。

以下是异步FIFO的UVM验证原理:1. 创建FIFO模型:首先,需要创建一个FIFO模型,包括FIFO的输入端口和输出端口,以及FIFO的内部数据存储器。

可以使用SystemVerilog语言创建FIFO模型。

2. 编写验证环境:在UVM中,需要编写一个验证环境(testbench),用于生成测试用例,驱动输入数据到FIFO中,并验证FIFO的输出数据是否符合预期。

验证环境包括以下组件:- 驱动(driver):负责将测试向量输入到FIFO中。

- 监视器(monitor):监控FIFO的输出数据,并将其与预期结果进行比较。

- 预测器(predictor):根据输入数据预测FIFO的输出结果。

- 生成器(generator):生成各种测试用例。

3. 设置时序约束:对于异步FIFO的验证,需要设置时序约束,以确保FIFO的输入和输出数据能够按照预期的时序要求进行传输。

时序约束包括FIFO的读写时钟频率和时钟间隔等参数。

4. 进行功能验证:验证FIFO的功能,包括数据的读写操作是否正确,数据的顺序是否符合FIFO原则等。

可以通过在测试用例中使用不同的输入数据和读写操作顺序来验证FIFO的功能。

5. 进行时序验证:验证FIFO的时序,包括输入数据的时序要求是否满足,输出数据的时序是否符合预期。

可以通过在测试用例中使用不同的时序生成输入数据来验证FIFO的时序。

6. 进行性能验证:验证FIFO的性能,包括写入速率和读出速率是否满足要求,以及FIFO的深度是否足够。

quartus 异步fifo用法

quartus 异步fifo用法

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大小、输出宽度、寄存器位宽等。

verilogfifo读写详细讲解

verilogfifo读写详细讲解

verilogfifo读写详细讲解FIFO是一种先进先出的数据结构,其全称为First-In-First-Out。

在Verilog中,可以使用以下代码实现FIFO的读写操作。

首先,我们需要定义FIFO的模块。

如下所示:```verilogmodule fifo #(parameter DATA_WIDTH = 8) (input clk, // 时钟信号input reset, // 复位信号input read, // 读使能信号input write, // 写使能信号input [DATA_WIDTH-1:0] data_in, // 输入数据output reg [DATA_WIDTH-1:0] data_out, // 输出数据output reg empty, // FIFO为空信号output reg full // FIFO为满信号);```在FIFO的模块中,我们定义了以下信号:clk表示时钟信号,reset表示复位信号,read表示读使能信号,write表示写使能信号,data_in表示输入数据,data_out表示输出数据,empty表示FIFO为空信号,full表示FIFO为满信号。

在模块的内部,我们可以使用一个或多个寄存器来实现FIFO的功能。

在这里,我们使用两个寄存器data_reg和next_data_reg来存储数据,使用两个计数器empty_count和full_count来记录FIFO的空和满状态。

```verilogreg [DATA_WIDTH-1:0] data_reg; // 数据寄存器reg [DATA_WIDTH-1:0] next_data_reg; // 下一个数据寄存器reg [DATA_WIDTH-1:0] data_out_reg; // 输出数据寄存器reg empty_count; // 空计数器reg full_count; // 满计数器```接下来,我们定义FIFO的行为。

基于FPGA的异步FIFO设计与实现

基于FPGA的异步FIFO设计与实现

基于FPGA的异步FIFO设计与实现王伟国;张振东【摘要】随着现代数字电路系统密度和规模的不断扩大,一个系统中通常会包含多个时钟,因此不同时钟之间的数据传输成为亟待解决的问题.而一种可靠易行的解决方案就是异步FIFO.异步FIFO需要非常严格的多时钟技术,难以作出正确的设计合成和分析.本文提出了一种利用格雷码作为读写地址计数器的异步FIFO的设计方法,有效的避免了数据在不同时钟时间传输时遇到的亚稳态问题.并给出了综合仿真结果.%With the expanding of the density and scale of modern digital circuitry,a system will contain multiple clock.Therefore,the transfer of data between different clock becomes a serious problem needs to be solved.A reliable and feasible solution is asynchronous FIFO.Asynchronous FIFO require very strict clock technology,it is difficult to make the correct design of synthesis and analysis.This paper presents a design method of asynchronous FIFO which based on read/write counter in terms of gray code.This method effectively avoid the metastable state in the data transmission between different clock and given a comprehensive simulation results.【期刊名称】《聊城大学学报(自然科学版)》【年(卷),期】2012(025)003【总页数】6页(P79-84)【关键词】多时钟;异步fifo;verilog;HDL;格雷码【作者】王伟国;张振东【作者单位】中国科学院长春光学精密机械与物理研究所,吉林长春130033;中国科学院长春光学精密机械与物理研究所,吉林长春130033/中国科学院研究生院,北京100039【正文语种】中文【中图分类】TN4330 引言随着现代数字电路系统的实时数据处理能力的不断提高,逻辑电路的复杂程度和内核处理器的运算速度也快速增长,在使得一些复杂算法得以实现的同时也加剧了快速CPU与慢速外设之间的冲突.异步FIFO大量数据缓存的能力成功的解决了这一问题,但专用的高速异步FIFO芯片价格昂贵,且容量受限,随着现场可编程逻辑器件容量和速度的不断提高,利用现场可编程逻辑器件设计异步FIFO成为可行的方法.本文首先讨论了异步FIFO设计中经常出现的亚稳态问题和二进制计数器多位同时改变的问题,并给出解决办法,然后讨论了两种格雷码计数器的形式并作出比较,最后给出一种以格雷码为读写地址计数器的异步FIFO的设计方法和在设计异步FIFO时必须要注意的细节.1 多时钟电路中的亚稳态问题在一个时序电路中,合理的建立时间和保持时间是触发器正常工作的前提条件.对于下降沿触发的触发器而言,下降沿触发之前输入数据持续的最短时间是建立时间(setup time),下降沿触发之后输入数据持续的最短时间是保持时间(hold time).当电路时序不能满足setup time/hold time的要求时,系统时序就会出现混乱.在异步时序电路中,不同时钟之间是不存在任何关系的,必然会产生建立时间和保持时间冲突.解决系统时序问题常用双锁存器法如下图1所示,即在不同时钟之间传输数据时连续锁存两次.但是这种方法只是保证了电平的稳定,而在实际的系统中还需要FIFO作为不同时钟之间传输多位数据的接口.图1 避免亚稳态出现的双锁存器法2 异步FIFO指针对于同步FIFO来说,使用一个计数器计算读出和写入到FIFO缓存器中的数据量,计数器在只有写没读是递增,只读没写是递减,既读又写和没读也没写时保持不变.当计数器到达设定值时FIFO满信号置位,为零时空信号置位.在异步FIFO中,由于这种计算数据个数增减的计数器会被两个不同的时钟控制,因此这种计数器不能使用.所以,为了决定FIFO“空”和“满”状态,读指针和写指针必须相互比较.设计FIFO最主要的困难是生成FIFO指针和找到一个决定FIFO“空”和“满”状态的可靠方法.在FIFO设计中,读指针和写指针总是指向下一个要读和写的地址空间.当读或写操作完成后指针自动递增,当FIFO是空时读指针和写指针相等,当FIFO满时读指针和写指针也是相等.一种解决的方法是增加一个多余的MSB位来区分两种状态,当写指针递增超过地址范围时,写指针会递增MSB位,其他位清零,读指针同样也是.当读指针和写指针的MSB位不同时,意味着写指针比读指针多走了一圈,当MSB位相同时意味着走的圈数相等(如图2所示)图2 增加多余MSB后区分FIFO空和FIFO满的方法示意图当FIFO存储缓冲区需要(n-1)位地址时,地址指针用n位,当指针相等(包括MSB位)时空标志置位,当指针低(n-1)位相等且MSB位不等时满标志置位.2.1 二进制FIFO指针的情况二进制地址计数量会有多个位同时变化,因此在把二进制量在不同时钟域之间同步时会出现问题.一个解决的方法是取样并把周期计数量寄存在一个保持寄存器中,并发出一个ready信号,新时钟域收到信号并发出确认信号,这样变化的计数量就安全的传送到新时钟域.用这种方法不会产生上溢和下溢,因为当读指针递增到与写指针相等时,空信号置位,取样的写指针不反映当前写指针的值,而是小于当前值,故永远不能产生下溢,满信号也是如此.最常用的解决方法是用格雷码计数器,格雷码在每个时钟只有一位变换可以极大的减少在同步计数时错误的发生.3 格雷码计数器设计格雷码计数器的方法有很多,这里介绍二种简单直接的方法.下面详细介绍两种方法.3.1 格雷码计数器中的问题为了更好的理解把n-bit计数器转换成(n-1)-bit计数器时出现的问题,先考虑一下一个双重4-bit和3-bit格雷码计数器的例子如图3.图3 4-bit格雷码计数器示例及转换成3-bit格雷码时出现的问题在4-bit计数器中除了MSB位其余位关于中间对称,我们把2nd MSB位反相后,上半部分与下半部分的LSBs便相等.但是经过反相操作后整体便不是格雷码了,例如15(1100)到0(0000)的转变过程有两个bits变化,在下面的第一种格雷码计数器中会有解决方法.3.2 第一种格雷码计数器图4是第一种计数器的框图并是双重格雷码计数器中两个bits同时跳变的解决方法.其中假设输出寄存器的值是格雷码(ptr),此格雷码被输出到格雷码到二进制的转换器中,然后通过一个有条件递增的加法器并输出下一个格雷码值(gnext),连接到输出寄存器的输入端,如框图上半部分所示.(n-1)-bit格雷码简单地通过n-bit格雷码的2个MSBs的异或操作产生,(n-2)个LSBs不变.图4 第一种格雷码计数器示意图及其如何避免了两位同时跳变问题3.3 第二种格雷码计数器此种风格的格雷计数器(如图5所示)用了两组寄存器避免了把格雷码转换成二进制数的步骤.而且第二组寄存器也可以直接用来寻址FIFO存储器.n-bit格雷码指针仍然需要同步到不同的时钟域中.二进制指针可以更容易的通过计算产生“几乎满”和“几乎空”信号.因此在本论文的设计中用此种风格的格雷码计数器.图5 第二种格雷码计数器工作示意图4 总体设计及“空”和“满”信号的产生总体设计如图6所示,本设计方案共有四个模块,双口RAM模块,读控制模块,写控制模块,格雷码同步模块.写控制模块主要是当写使能信号有效且写满信号无效时产生写地址并实行地址递增功能,读控制模块实现相似功能,双口RAM模块用来使缓冲数据其读写动作可同时进行.4.1 “空”和“满”信号的产生“空”信号的产生比较简单,只需同步到读时钟域的写地址格雷码与n-bit的读指针的格雷码完全相等即可代码如下图6 异步FIFO总体设计框图及其信号说明但是,“满”信号的产生就没那么容易,简单地用n-bit格雷码作比较判断“满”信号是不可靠的.因为格雷码除了MSB位外是对称的如图3所示.在图3中假如写指针和读指针都指向地址7,此时写指针递增一次后,写指针指向地址8,读指针和写指针相比较,除了MSB位不同外其余各位均相等,满信号此时有效,但这是不符合实际情况的,错误的.这也是为什么在图4中应用双重n-bit格雷码计数器的一个原因.正确判断满信号的条件是:读写指针的n-bit格雷码的前两个MSBs都不相等,其余的写指针和同步读针相等.代码如下4.2 不同时钟速度因为异步FIFO被两个不同的时钟控制,很明显两个时钟运行在不同的速度下.当把较快的时钟同步到较慢的时钟时,会有一些计数值被跳过.当被同步的格雷码递增两次只被取样一次时也不会出现亚稳态问题,因为亚稳态出现在同步时钟上升沿附近有多位同时跳变时,而在两个同步时钟沿之间有格雷码跳变两次,第一次跳变距离同步时钟条边沿较远,只有第二次跳变在同步时钟沿附近,故不会产生亚稳态.当较快的格雷码计数器在较慢时钟沿之间递增多于一次,不会出现已经溢出却没有检测到的现象,因为同步到写时钟域的读指针滞后于当前的读指针,而写指针只会小于或等于同步读指针,故不会出现溢出.5 设计仿真及总结本设计采用Xilinx公司Spartan3A系列的XC3S1400A,封装时PG484,速度是-4,仿真器是ISE Simulator(VHDL/Verilog),硬件描述语言是Verilog,开发工具是ISE.最后对电路进行时序分析,结果为该FIFO运行速度可达到90.63MHz.wclk、rclk时钟周期分别为:75MHz、80MHz.先向FIFO中写入18个数据,当第16个数据被读入后wfull立即被置位如下图7.图7 写满仿真结果同时向FIFO中写入和读出数据,由于wptr要经过两个读周期才能同步到读时钟域,故在waddr递增后的第二个rclk的上升沿rempty才清零如下图8所示.本文对异步FIFO的结构和重要时序问题给予了详细的阐述,并得到了可靠的仿真结果.在高速数据采集系统中,采用高性能FPGA作为数据预处理和高速异步FIFO 作为数据采集缓存的应用都十分广泛.把FIFO集成在FPGA中简化了电路设计的复杂程度,增加了电路的集成化程度和可靠性,是未来高速数据采集系统的重要发展方向.图8 同时写入读出时的仿真结果参考文献【相关文献】[1] Clifford E.Cummings,Synthesis and Scrip ting Techniques for De signing Multi-Asynchronous Clock Designs[A].SNUG-2001,2001(3):2-8.[2]吴自信,张嗣忠.异步FIFO结构及FPGA设计[J].单片机及嵌入式系统应用,2000,22(3):1.[3]赵雅兴.FPGA原理、设计与应用[M].天津:天津大学出版社,1999.[4]夏宇闻.数字系统设计-Verilog实现[M].北京:高等教育出版社,2006.[5]王金明.Verilog HDL程序设计教程[M].北京:人民邮电出版社,2004.。

一种高可靠性高速可编程异步FIFO的设计

一种高可靠性高速可编程异步FIFO的设计

0引言在现代的大规模ASIC 设计中,常常涉及多时钟系统控制方式,这样就会产生不同时钟域数据传输的问题。

比较好的解决方案就是使用异步FIFO(First In First Out)来实现不同时钟域数据传输的缓冲[1-2]。

这是因为,异步FIFO 只按指针的递增顺序写入数据,并以同样的顺序读出数据,不需要外部读写地址线,使用起来非常简单,这样既可以使相异时钟域数据传输的时序要求变得宽松,也提高了它们之间的传输效率。

因此,异步FIFO 在网络通信和数字信息处理等领域都有着广泛的应用[3-6]。

而高性能异步FIFO 的研究也就成为了大规模集成电路设计领域的研究热点之一,并取得了很多研究成果[7-10]。

例如,文献[7]中,采取了比较同步指针的方法来降低亚稳态出现的可能,这样做确实保证了比较时两个指针都是同步的,但是在进行大容量FIFO 设计时,读、写指针的位数很多,同步模块会使用大量的寄存器,这样会大大增加设计成本,降低工作效率。

而且该论文提到的设计方案在进行空满判断时,增加了一个地址位来标识读写指针的相对位置,这样做不仅占用了过多的逻辑资源,还降低了FIFO 控制系统的可移植性。

文献[8]中提到了一种通过判断格雷码前两位来划分存储区间,进而判断空满的方法,但是由于这种判断区间的划分方式是通过硬件的形式实现的,可编程性不好。

本设计为了满足一款国产FPGA 的芯片设计需求,在保证高可靠性的前提下,进一步增强了异步FIFO 的可编程性,提出了一种基于格雷码的、可以对近空满示警阈值进行编程的异步FIFO ,并且结合异步指针比较的方法提出了一种新的空满判断标准,进而提高了电路的工作速度和效率,∗基金项目:辽宁省教育厅研究生教育教学改革联合培养项目(辽教函[2017]24号)一种高可靠性高速可编程异步FIFO 的设计∗牛博,赵宏亮(辽宁大学物理学院,辽宁沈阳110036)摘要:基于一款国产FPGA 芯片的研发,提出了一种具有高可靠性、高速及可编程性的异步FIFO 电路结构。

FIFO设计

FIFO设计

• 4) FULL信号控制进程 • 如何判断FULL信号为‘1’;
• 1、当前没有读/写数据有效信号,FIFO数 据已满 • 2、当前没有读有效信号,有写有效信号, 而且FIFO还差一个就满了。
• 4) FULL信号控制进程

Process(clk,reset) begin if reset='1' then full_mid<='1'; elsif rising_edge(clk) then if (rd_enable='0' and (fifo_cnt(8 downto 1) = "11111111") and ((fifo_cnt(0)='1') or (wr_enable='1'))) then full_mid<='1'; else full_mid<='0'; end if; end if; end process;
同步FIFO的操作
1、 同步FIFO的操作 当FIFO不满且wr_en有效时,向FIFO写数据,并 置写使能wr_enable有效; 当FIFO不空且rd_en有效时,从FIFO从读出数据 并置读使能rd_enable有效; 当FIFO满且wr_en有效时,置写使能wr_enable
无效且作废此次写操作; 当FIFO空且rd_en有效时,置读使能rd_enable 无效且作废此次读操作。
异步FIFO的设计
• 异步FIFO的数据读、写受不同时钟的控制; • 异步FIFO的空、满状态不能依靠计数的方 式进行,因为读、写均需要对计数器进行 操作; • 如何判断异步FIFO的空、满情形?如何操 作?

quartus 异步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 添加输入和输出信号。

最新-一种异步FIFO的设计方法 精品

最新-一种异步FIFO的设计方法 精品

一种异步FIFO的设计方法摘要使用同步源自不同时钟域的数据是在数字设计中经常使用的方法,设计功能正确的会遇到很多问题,探讨了两种不同的异步的设计思路。

两种思路都能够实现功能正确的。

关键词异步握手同步二进制格雷码本文所研究的,从硬件的观点来看,就是一块数据内存。

它有两个端口,一个用来写数据,就是将数据存入;另一个用来读数据,也就是将数据从当中取出。

与操作相关的有两个指针,写指针指向要写的内存部分,读指针指向要读的内存部分。

控制器通过外部的读写信号控制这两个指针移动,并由此产生空信号或满信号。

对于异步而言,数据是由某一个时钟域的控制信号写入,而由另一个时钟域的控制信号将数据读出。

也就是说,读写指针的变化动作是由不同的时钟产生的。

因此,对空或满的判断是跨时钟域的。

如何根据异步的指针信号对的满状态或空状态进行正确的判断是本文研究的重点。

此外,设计过程中的一些细节问题也将在文中涉及到。

1指针以及满空信号的产生为了更好地说明问题,先探讨一下同步指针移动以及满空信号的产生过程。

对于同步,读写指针都指向一个内存的初始位置,每进行一次读写操作,相应的指针就递增一次,指向下一个内存位置。

当指针移动到了内存的最后一个位置时,它又重新跳回初始位置。

在非满或非空的情况下,这个过程将随着读写控制信号的变化一直进行下去。

如果处于空的状态,下一个读动作将会导致向下溢出,一个无效的数据被读人;同样,对于一个满了的,进行写动作将会导致向上溢出,一个有用的数据被新写入的数据覆盖。

这两种情况都属于误动作,因此需要设置满和空两个信号,对满信号置位表示处于满状态,对满信号复位表示非满,还有空间可以写入数据;对空信号置位表示处于空状态,对空信号复位表示非空,还有有效的数据可以读出。

当读指针和写指针相等也就是指向同一个内存位置的时候,可能处于满或空两种状态。

可以通过不同的方法判断或区分究竟是处于满状态还是空状态,也就是究竟是写指针从后赶上了读指针,还是读指针从后赶上了写指针。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

异步FIFO的Verilog设计3卜宪宪(莱阳农学院 青岛 266109)

摘 要 介绍异步FIFO的基本结构和工作原理,分析异步FIFO的设计难点及其解决办法,在传统设计的基础上提出一种新颖的电路结构,用verilog描述并对其进行综合仿真并在FPGA上实现,得到较好的性能。关键词 FIFO 双口RAM 格雷码 Verilog

中图分类号 TN45

1 引言在现代的集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个时钟,因而出现了跨不同时钟区域进行异步数据传输的要求。异步FIFO(FirstInFirstOut)是解决这个问题一种简便、快捷的解决方案。使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据。在网络接口、图像处理等方面,异步FIFO得到了广泛的应用。异步FIFO是一种先进先出的电路,使用在需要产时数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。在异步电路中,由于时钟之间周期和相位完全独立,因而数据的丢失概率不为零。如何设计一个高可靠性、高速的异步FIFO电路便成为一个难点。本文介绍解决这一问题的一种方法。2 异步FIFO功能描述图1给出了FIFO的接口信号和内部模块图。图1 异步FIFO内部模块图和接口信号由图1可以看出,写地址和满信号产生模块产生写有效信号和下一次要写数据的地址,以及指示缓冲区满信号。读地址和空信号产生模块产生下一次要读数据的地址,以及指示缓冲区空信号。FIFO的操作如下:FIFO复位时写指针和读指针都为0,满信号无效,空信号有效。当有写信号有效时,把数据写入写指针指向的单元,并把写指针加1,使它指向下一个要写数据单元,写时钟每一拍写入一个数据,直到满信号有效或写信号无效时停止。当读信号有效时,读指针指向的数据被读出,

读时钟每一拍可以读出一个数据,直到读信号无效或空信号有效时停止读出数据。

3 异步FIFO的难点及解决方法设计异步FIFO有两个难点:一是不同时钟域域间数据传递的问题;二是如何正确的生成的空\

满标志。下面阐述解决这两个问题的方法。3.1 不同时钟域间数据传递的问题及解决方法亚稳态是不同时钟域间传递数据的最重要的问题。当数据信号通过两个时钟域的交界处时,将会分别由两个时钟来控制信号的值。此时如果两个时钟信号敏感沿非常接近并超过允许的额度,则将出现数据信号不稳定,即电路陷入亚稳态。图2(a)中是一种最简单的异步电路,clka和clkb为异步时钟。触发器B采样触发器A的输出数据。当clka和clkb的上升延离得太近时,如果触发器A的值在这个时候发生改变,clkb将采样到一个正在变化的数据,触发器的B的输出将是一个不确定的值,如图2(b)所示。考虑到亚稳态是由于两个时钟沿过分接近造

191第38卷(2007)第6期 计算机与数字工程

3收到本文时间:2006年10月24日作者简介:卜宪宪,女,助教,硕士,研究方向:计算机系统结构、专用集成电路设计。成的,如果对不同时钟域的输入信号用两个锁存器串连续锁存两拍,第一个触发器锁存到一个不稳定信号,经过一个时钟周期的等待以后很可能趋于稳定,变为确定值0或者1,第二个触发器在下一拍锁存的时候就能得到一个确定的值。图2 亚稳态示意图3.2 空/满标志的生成空满标志的产生是异步fifo设计的核心部分。如何正确设计此部分的逻辑,直接影响到fifo的性能。空满标志产生的原则是:写满不溢出,读空不多读。即无论在什么时刻,都不应出现读写地址同时对一个存储器地址操作的情况。空满标志都是由于读写地址相等所产生的,因此需要找到一种方法来区分开地址相等的时候应该是空还是满。传统的空/满标志产生方法有两种,第一种方法是:空标志=(|写地址-读地址|<=预定值)并且(写地址超前读地址)满标志=(|写地址-读地址|<=预定值)并且(读地址超前写地址)图3 格雷码指针产生电路最直接的做法是,采用读、写地址相比较来产生空满标志。如图3(a)所示,当读、写地址的差值等于一个预设值的时候,空/满信号被置位。这种实现方法逻辑简单,但是减法器是会引入比较大的组合逻辑延时,因而限制了FIFO的速度。所以,在对FIFO的速度要求比较严格的场合,一般只采用相等不相等的比较逻辑,避免使用减法器。图3(b)是另外一种常见的设计,比较器只对读、写地址比较是否相等。但在读、写地址相等的时候FIFO既可能为空又可能满。因此,增加一个并行的区间判断逻辑来指示是空还是满。这个区间判断逻辑将整个地址空间分为几个部分,以指示读、写地址的相对位置。这种做法提高了整个电路的速度,但是也有其缺点。主要是直接采用读、写地址等于不等于的比较逻辑来进行空/满标志的判断,可能带来误判。

4 改进的FIFO4.1 格雷码的应用及产生逻辑异步设计情况下读写时钟属于不同的时钟域,

这给空满标志产生逻辑部分及双端口存储器的读写逻辑设计部分带来很大的难度。在空满信号产生逻辑部分,由于读写地址信号是由不同时钟域的时钟所产生,通过比较读写地址产生空满信号就面临着处理多时钟域信号之间数据交换可能导致亚稳态的问题。Gray码技术是解决这一问题的有效格雷码,是一种在相邻计数值之间只有一位发生变化的编码方式,使用格雷码指针使在不同时钟域传递地址指针过程中不会出现因为指针中多位数值变化带来的错误。格雷码生成可以采用A,B两种电路改进的异步fifo采用B方案,通过增加一个寄存器保存二进制的值,减少一级复杂的组合逻辑电路,使整个电路可以工作在更高的频率上。4.2 新颖的空/满标志产生逻辑FIFO中的读写指针是一个循环指针,读写指针初始化值都为0,满标志初始化为0,空标志初始化为1。读写操作开始候,每做一次写操作写指针加1,每做一次读操作读指针也加1。当读指针在加1过程中与写指针相等的时候,表示缓冲区为空应该置空标志。反之,写指针加1过程中等于读指针时,缓冲区满应该置满标志。分析看出空满标志产生的必要条件是读地址等于写地址。现在难点就集中在当读地址等于写地址时如何区分缓冲区空或者满,也就是如果判断是读指针追上写指针,还是写指针追上读指针。分析满标志发生时候格雷码地址指针变化情况发现,可以把读写指针四等分并增加标志位go2ingfull代表存储区的将要满状态,如图5,当写指针

291 卜宪宪:异步FIFO的Verilog设计 第38卷wptr落在在第n块,而读指针rptr落在第n+1块时,这个时候应该产生“将要满”goingfull状态。分析这个时机的读写地址特性发现,写指针wptr的第n位总是和读指针rptr的第n-1位相反,而写指针wptr的第n-1位总是和读指针rptr的第n位相同。根据这个条件,我们就可以产生“将要满”标志,即:goingfull=(wptr[n]^rptr[n-1])&~(wptr[n-1]^rptr[n])

图4 将要满信号判断逻辑图将要空信号goingempty的产生机制和将要满goingfull的产生机制类似,如图6,在读指针rptr落后写指针wptr一个块距离的时候产生,判断逻辑为在读指针落后写指针一个块的距离的时候产生,

即:goingempty=~(wptr[n]^rptr[n-1])&

(wptr[n-1]^rptr[n])

图5 将要空信号判断逻辑图通过判断将要满信号goingfull从1到0跳变的

出现和写指针wptr和读指针rptr相等,就能确定写指针wptr追上了读指针rptr,即缓冲区满了,这时置位满标志。而在将要空信号出现1到0的跳变且读写地址相等时产生空标志。以16×16异步fifo为例,空满标志产生逻辑用veriglog实现如下:

parameterADDRSIZE=4;parameterN=ADDRSIZE-1;

outputempty,full;input[N:0]wptr,rptr;inputwrst_n;regdirection;wiregoingfull=(wptr[N]^rptr[N-1])&~(wptr[N-1]^rptr[N]);wiregoingempty=(~(wptr[N]^rptr[N-1])&(wptr[N-1]^rptr[N]);always@(posedgehighorposedgegoingfullorposedgegoingempty)if(goingempty)direction<=1’b0;elseif(goingfull)direction<=1’b1;elsedirection<=high;assignempty=~((wptr==rptr)&&!direction);assignfull=~((wptr==rptr)&&direction);

5 综合与仿真仿真工具采用的是Modelsim,对异步FIFO电路编写测试向量进行仿真.图5给出FIFO电路的仿真波形。图6(a)是异步FIFO复位后的波形,从图中看到开始时刻满信号wfull为0,空信号rempty

为1,在进行了几个字节的些操作以后空信号rempty降为低电平,缓冲区的数据从rdata被读出且读写数据一致,说明电路的基本输入输出功能和空信号的产生是正确的。从图6(b)上看到,当写入第19(十六进制)个数据,读出第0a个数据的时候,满信号wfull被置位,这说明满信号产生时机比较准确。综合上面两个波形图的结果,整个FIFO

的工作波形符合设计要求。

图6 异步FIFO仿真波形6 总结最后用xilinx综合工具综合与布局布线,在“xc2v8000”fpga上验证,综合结果见表1,设计比

391第38卷(2007)第6期 计算机与数字工程

相关文档
最新文档