基于异步FIFO实现不同时钟域间数据传递的设计
异步FIFO的实现方式

异步FIFO的实现方式实验目的本次实验介绍一种异步FIFO的实现方式。
使用FIFO存储器可以在两个不同时钟系统之间快速而方便的传输数据。
另外,在网络接口,图像处理等方面异步FIFO存储器也得到了广泛的应用。
因此,异步FIFO存储器具有较大的研究和应用价值。
异步FIFO的介绍和整体结构异步FIFO(First In First Out)存储器是指向FIFO缓冲器中写入数据的时钟域和从FIFO缓冲器中读取数据的时钟域是不同的,这两个时钟之间没有必然的因果关系。
异步FIFO是一种先进先出的电路,使用在异步时钟域数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。
在异步电路中,由于时钟之间周期和相位完全独立,所以数据的丢失概率不为零。
如何设计一个高可靠性、高速的异步FIFO存储器便成为一个难点。
异步FIFO的一般结构如图1所示,都是由一个读时钟域电路、一个写时钟域电路和一个双端口的RAM来构成的。
异步FIFO与同步FIFO所做的工作是相同的,都是在写信号有效时写数据到RAM中,在读信号有效时把数据从RAM中读出,所以对于中间部分的RAM 设计是比较简单的。
另外,读电路和写电路单独实现起来也是比较容易的,只需要按照同步FIFO的工作情况,如果没有写满或读空的状态时每写一个数据就把写地址加1,每读一个数据就把读地址减1。
设计难点在于两个时钟域的交叠部分:满、空状态的产生,这也是设计的重点。
图1 异步FIFO结构针对这个问题,先从对亚稳态的处理开始介绍亚稳态的处理一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。
在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态、并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
亚稳态发生的原因是由于在同步系统中,如果触发器的建立时间或保持时间不满足,就可能产生亚稳态,此时触发器输出端Q在亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态,逻辑误判有可能通过电路的特殊设计减轻危害(如本设计中将使用的Gray码计数器),而亚稳态的传播则扩大了故障面,难以处理。
跨时钟域之异步FIFO

跨时钟域之异步FIFOAsynchronous FIFO Design异步FIFO的读写指针写指针写指针指向当前将要写⼊数据的位置,复位之后,读写指针被置零。
执⾏写操作的时候,向写指针指向的存储区写⼊数据,之后写指针加1,指向接下来要被写⼊数据的位置。
On a FIFO-write operation, the memory location that is pointed to by the write pointer is written, and then the write pointer is incremented to point to the next location to be written.读指针:读指针指向当前要被读取数据的位置,复位时,读写指针被置零,FIFO为空读指针指向⼀个⽆效的数据(FIFO为空,empty信号有效——拉⾼)。
当第⼀个有效数据被写⼊FIFO之后,写指针增加,empty flag信号被拉低,且读指针⼀直指向FIFO第⼀FIFO空标志:当读写指针是相等的时候:分两种情况1.当读写指针执⾏复位操作的时候。
2.当读指针赶上写指针的时候,最后⼀笔数据从FIFO读出后FIFO为空FIFO满标志:读写指针相等,当FIFO⾥⾯的写指针写满⼀圈之后⼜转回到和读指针同样的位置。
有个问题,读写指针相等的时候怎么判断FIFO是empty还是full?设计的时候增加⼀位bit去辅助判断FIFO是空还是满。
当写指针超过FIFO的最⼤寻址范围时,写指针将使辅助位zhi⾼,其余位为0.FIFO满的时候:读写指针的低位(n-1位bit)相等,⾼位(第n位bit)不同。
FIFO空的时候,读写指针的低位和⾼位都相等。
(针对⼆进制)但是⼆进制FIFO指针综合电路复杂,⼀般采⽤**格雷码**,⽂章中采⽤⼆进制转换格雷码的⽅法,判断FIFO的空满标志4位⼆进制格雷码,有效地址位为三位。
⼆进制转换为格雷码的算法:rgraynext = (rbinnext>>1) ^ rbinnext;1.顶层模块fifo:例化各个⼦模块//顶层模块实例化各个⼦模块module fifo#(parameter DSIZE = 8, //读写数据位宽均设置为8位parameter ASIZE = 4 // 存储地址位宽设置)(output [DSIZE-1:0] rdata,output wfull,output rempty,input [DSIZE-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;// 内部线⽹// synchronize the read pointer into the write-clock domainsync_r2w sync_r2w(.wq2_rptr (wq2_rptr),.rptr (rptr ),.wclk (wclk ),.wrst_n (wrst_n ));// synchronize the write pointer into the read-clock domainsync_w2r sync_w2r(.rq2_wptr(rq2_wptr),.wptr(wptr),.rclk(rclk),.rrst_n(rrst_n));//this is the FIFO memory buffer that is accessed by both the write and read clock domains.//This buffer is most likely an instantiated, synchronous dual-port RAM.//Other memory styles can be adapted to function as the FIFO buffer.fifomem#(DSIZE, ASIZE)fifomem(.rdata(rdata),.wdata(wdata),.waddr(waddr),.raddr(raddr),.wclken(winc),.wfull(wfull),.wclk(wclk));//this module is completely synchronous to the read-clock domain and contains the FIFO read pointer and empty-flag logic.rptr_empty#(ASIZE)rptr_empty(.rempty(rempty),.raddr(raddr),.rptr(rptr),.rq2_wptr(rq2_wptr),.rinc(rinc),.rclk(rclk),.rrst_n(rrst_n));//this module is completely synchronous to the write-clock domain and contains the FIFO write pointer and full-flag logicwptr_full#(ASIZE)wptr_full(.wfull(wfull),.waddr(waddr),.wptr(wptr),.wq2_rptr(wq2_rptr),.winc(winc),.wclk(wclk),.wrst_n(wrst_n));endmodule2.时钟域同步模块sync_r2w:读指针同步到写时钟域wclk// 采⽤两级寄存器同步读指针到写时钟域module 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) beginwq1_rptr <= 0;wq2_rptr <= 0;endelse beginwq1_rptr<= rptr;wq2_rptr<=wq1_rptr;endendmodule原理图3.时钟域同步模块sync_w2r:写指针同步到读时钟域rclk//采⽤两级寄存器同步写指针到读时钟域module sync_w2r#(parameter ADDRSIZE = 4)(output reg [ADDRSIZE:0] rq2_wptr, //写指针同步到读时钟域input [ADDRSIZE:0] wptr, //格雷码形式的写指针input rclk, rrst_n);reg [ADDRSIZE:0] rq1_wptr;always @(posedge rclk or negedge rrst_n)if (!rrst_n)beginrq1_wptr <= 0;rq2_wptr <= 0;endelse beginrq1_wptr <= wptr;rq2_wptr <= rq1_wptr;endendmoduleRTL原理图4.存储模块//存储模块module fifomem#(parameter DATASIZE = 8, // Memory data word widthparameter ADDRSIZE = 4 // 深度为8即地址为3位即可,这⾥多定义⼀位的原因是⽤来判断是空还是满,详细在后⽂讲到) // 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);////////////////////////////////这部分没⽤到,可以单独写⼀个模块来调⽤//////////////`ifdef RAM //可以调⽤⼀个RAM IP核// instantiation of a vendor's dual-port RAMmy_ram mem(.dout(rdata),.din(wdata),.waddr(waddr),.raddr(raddr),.wclken(wclken),.wclken_n(wfull),.clk(wclk));//////////////////////////这部分没⽤到,可以单独写⼀个模块来调⽤//////////////////`else //⽤数组⽣成存储体// RTL Verilog memory modellocalparam DEPTH = 1<<ADDRSIZE; // 左移相当于乘法,2^4 将1左移4位reg [DATASIZE-1:0] mem [0:DEPTH-1]; //⽣成2^4个位宽位8的数组assign rdata = mem[raddr];always @(posedge wclk) //当写使能有效且还未写满的时候将数据写⼊存储实体中,注意这⾥是与wclk同步的if (wclken && !wfull)mem[waddr] <= wdata;`endifendmodule原理图5. rptr_empty模块:产⽣rempty和raddr信号//产⽣empty信号和raddar信号的模块module rptr_empty#(parameter ADDRSIZE = 4)(output reg rempty,output [ADDRSIZE-1:0] raddr, //⼆进制形式的读指针output reg [ADDRSIZE :0] rptr, //格雷码形式的读指针input [ADDRSIZE :0] rq2_wptr, //同步后的写指针同步到读时钟域input rinc, rclk, rrst_n);reg [ADDRSIZE:0] rbin;wire [ADDRSIZE:0] rgraynext, rbinnext;// GRAYSTYLE2 pointer//将⼆进制的读指针与格雷码进制的读指针同步always @(posedge rclk or negedge rrst_n)if (!rrst_n) beginrbin <= 0;rptr <= 0;endelse beginrbin<=rbinnext; //直接作为存储实体的地址rptr<=rgraynext;//输出到 sync_r2w.v模块,被同步到 wrclk 时钟域end// Memory read-address pointer (okay to use binary to address memory)assign raddr = rbin[ADDRSIZE-1:0]; //直接作为存储实体的地址,⽐如连接到RAM存储实体的读地址端。
异步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中写数据而造成溢出。
基于异步FIFO实现不同时钟域间数据传递的设计

基于异步FIFO实现不同时钟域间数据传递的设计[ 2006-12-18 13:31:00 | By: 夏虫 ]推荐摘要:数据流在不同时钟域间的传递一直是集成电路芯片设计中的一个重点问题。
本文通过采用异步FIFO的方式给出了这个问题的一种解决方法,并采用Verilog 硬件描述语言通过前仿真和逻辑综合完成设计。
关键词:异步FIFO;时钟域;Verilog引言当今集成电路设计的主导思想之一就是设计同步化,即对所有时钟控制器件(如触发器、RAM等)都采用同一个时钟来控制。
但在实际的应用系统中,实现完全同步化的设计非常困难,很多情况下不可避免地要完成数据在不同时钟域间的传递(如高速模块和低速模块之间的数据交换)。
这时,如何保持系统的稳定,顺利完成数据的传输就成为一个重要的问题,这也是异步电路设计中最为棘手的问题。
通常的做法是采用对每位信号加同步器或增加握手信号来解决这一问题,但这样会增加系统的复杂度且影响传输速度。
本文的做法是在两个时钟域的交界处设计一个异步FIFO,通过它来实现数据流的传输。
由发送时钟域将数据写入,接收时钟域将数据取出,在数据传输的同时实现了数据的缓存,因此是一种较理想的方法。
不同时钟域间数据传递的问题及其解决方法不同时钟域间数据传递的最重要问题就是亚稳态问题。
当数据信号通过两个时钟域的交界处时,将会分别由这两个时钟来控制信号的值。
此时如果两时钟信号的敏感沿非常接近并超过了允许的额度,则将出现数据信号的不稳定,即电路陷入亚稳态,也称为同步失败。
亚稳态是在两时钟敏感沿靠得很近、第二级时钟敏感沿到来时其输入数据不稳时发生,可将其视为仅仅是第二级触发器输入信号不稳定所导致的结果。
只要使输入信号稳定,就能解决亚稳态问题。
针对如上所述亚稳态的特点,可设计一个同步器来保证数据的稳定传输以解决这个问题。
其原理在于使信号在新的时钟域中先稳定下来再进入相关的逻辑,以保证信号与新的时钟同步。
本设计在时钟域的接口处就采用此法。
基于多时钟域的异步FIFO设计

基于多时钟域的异步FIFO设计摘要:在大规模集成电路设计中,一个系统包含了很多不相关的时钟信号,当其目标域时钟与源域时钟不同时,如何在这些不同域之间传递数据成为了一个重要问题。
为了解决这个问题,我们可以用一种异步FIFO(先进先出)存储器来实现。
本文介绍了一种利用格雷码指针实现在多时钟域传递数据的FIFO设计。
关键词:FIFO,多时钟域,异步,格雷码,亚稳态,同步装置1、引言随着计算机、多媒体和数据通信技术的高速发展,数字图像、语音等数据传输技术近年来得到了极大的重视和长足的发展,并得到了广泛的应用。
如何保障这些语音、图像等数据传输的准确性、及时性?如何高效率、高速度地传输这些数据?这些都是当今信息领域的科研人员所必须解决的问题。
而往往在这些数据传输系统中,又会遇到不同系统接口间数据传输的问题。
通常在两个相连接的不同电路系统之间,因为每个系统的数据传输速度不同,在系统的接口部分就会出现数据输入速度和输出速度不同,也就是会发生数据传输速率不匹配的问题。
这种情况往往会让传输的数据产生复写或者丢失,降低数据的传输速率,同时也因为数据复写、丢失和无效数据的读入,将会产生数据出错,因此需要在不同系统的接口处设计数据传输单元来实现数据的高速高效传输。
在现代的系统设计中,为了提高系统的性能,设计者对数据的传输率、数据的传输量,对系统各部分之间的接口部分不同的数据输入和接收传输率的匹配有越来越高的要求,而FIFO存储器以其合理的价格、使用的方便灵活性以及上述的对速度匹配的应用而成为解决这类问题的理想途径,因此FIFO存储器在计算机、多媒体和数据通信领域都有着广泛的应用,因此对FIFO 的研究与设计应用具有理论上和实际应用上的双重意义。
2、FIFO的功能描述FIFO 是数据传输系统中极其重要的一环,特别是在两个处在不同时钟域的系统接口部分,FIFO 的合理设计,不但能使接口处数据传输的输入输出速率进行有效的匹配,不使数据发生复写、丢失和读入无效数据的情况,而且还会有效地提高系统中数据的传输效率,FIFO 存储器主要分为基于移位寄存器型和基于RAM 型,而RAM 型又有单口RAM和双口RAM 之分,目前来说,用的较为广泛的是基于双端口RAM的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 技术规范 1. 总体描述1.1. 功能定义异步FIFO ( First In First Out)指的是在两个相互独立的时钟域下, 数据从一个时钟域写入FIFO 而另一个时钟域又从这个FIFO 中将数据读出。
本设计用8*256的RAM 实现异步FIFO 。
具体功能:1. 写使能有效,且FIFO 不为满时,在写时钟的上升沿向FIFO 中写入数据。
2. 读使能有效,且FIFO 不为空时,在读时钟的上升沿从FIFO 中读出数据。
3. 当FIFO 写满时产生满信号,当FIFO 读空时产生空信号。
1.2. 应用范围异步FIFO 是用来作为缓冲的存储器, 它能对数据进行快速、顺序的存储和发送, 主要用来解决不同速率器件间的速率匹配问题。
2. 引脚描述图12.1. 引脚功能描述2.2.引脚时序描述当写满时full由低变高,当读空时empty由低变高。
只要不为满full就为低,不为空empty就为低。
3.顶层模块划分图2顶层模块说明:1.ram_fifo :存储器模块,用于存放及输出数据;2.w_addr_reg : 保存访问RAM的写地址;3.r_addr_reg : 保存访问RAM的读地址;4.w_addr_adder : 计算RAM下一个写地址;5.r_addr_adder: 计算RAM下一个读地址;6.cmp : 将读地址和写地址进行比较产生空满标志。
设计思想说明:FIFO满空的判定:当读地址的值加1之后等于写地址的值时,表明FIFO写满,当写地址的值加一之后等于读地址的值时,表明FIFO读空。
在初始状态时FIFO的读地址在RAM的中间位置,写地址在RAM的开始位置,所以初始状态FIFO不满也不空。
空满信号的产生由组合电路产生。
4.功能模块描述4.1.ram_fifo模块ram_fifo:RAM存储器。
用8*256双口RAM实现。
4.2.w_addr_reg模块w_addr_reg模块:写地址寄存器。
一种基于ASIC的高速异步FIFO设计

一种基于ASIC的高速异步FIFO设计丁彬勇;白雪飞;黄鲁【摘要】分析了异步FIFO的结构和关键技术,在与利用格雷码作为异步FIFO指针编码对比的基础上,提出了一种采用移位码编码方式的FIFO,不仅减小了亚稳态出现的概率,也简化了电路结构,降低了电路面积和功耗,在此基础上也缩短了电路的关键路径,工作频率明显提升。
根据仿真和综合结果显示,本文设计的FIFO工作性能稳定可靠。
%This paper analysis the structure and key technology of asynchronous FIFO. Compared with the method of using Gray code as the pointer of asynchronous FIFO, the paper presents a method that shift code is instead of gray code. This new design has the following advantages. Firstly, the probability of occurrence in metastability is reduced. Secondly, the circuit structure, area and the pow- er consumption are more simple, small and lower. Also, the key path of the circuit is shortened. The result is the circuit's working frequency is improved significantly. The results of simulation and synthesis shows that this FIFO is stable and reliable.【期刊名称】《微型机与应用》【年(卷),期】2011(030)022【总页数】4页(P21-23,27)【关键词】专用集成电路(ASIC);异步FIFO;移位码;亚稳态【作者】丁彬勇;白雪飞;黄鲁【作者单位】中国科学技术大学电子科学与技术系集成电路实验室,安徽合肥230027;中国科学技术大学电子科学与技术系集成电路实验室,安徽合肥230027;中国科学技术大学电子科学与技术系集成电路实验室,安徽合肥230027【正文语种】中文【中图分类】TN492在现代集成电路设计中,随着集成度的不断提升,常常会遇到数据缓存与不同时钟域之间数据传递的问题,在不同系统间如不能设计出有效的接口单元,将会产生数据传输过程中的复写、丢失和无效数据的读入等错误,同时亚稳态现象也会出现在不同时钟域之间的数据传递过程中。
异步FIFO的设计与实现

摘要随着数字系统规模的不断增大,单时钟域设计会极大地限制数字系统性能,现代数字系统为了提升性能,常采用多时钟域的设计。
跨时钟域的信号在传输时会遇到亚稳态现象,如何保持系统稳定地传输数据是多时钟域系统设计者重点关注的问题,在跨时钟域传递数据的系统中,常采用异步FIFO(First In First Out,先进先出队列)口来缓冲传输的数据,以克服亚稳态产生的错误,保证数据的正确传输。
常规的异步FIFO 设计采用先同步读写指针后比较产生空/满标志和用先比较读写指针产生空/满标志,再同步到相应时钟域的方法,但由于常规异步FIFO 模块中的RAM 存储器读写寻址指针常采用格雷码计数器以及“空满”控制逻辑的存在,工作频率低,面积大,将使通过这两个模块的信号通路延时对整个模块的工作频率造成制约。
本文提出了一种新型异步FIFO 的设计方法,该方法省略“了满”信号产生模块和多余的存储器位深来简化常规的FIFO 模块,而只保留“空”信号产生模块,避免使用大量的同步寄存器,减少了面积空间。
FPGA 验证的结果表明,改进后的异步 FIFO 性能有了显著的提高。
关键词:现场可编程门阵列(FPGA )亚稳态空/满标志产高速FIFOABSTRACTWith the increasing of digital system size, a single clock domain design will greatly limit the digital system performance. To enhance the performance of modern digital systems, multiple clock domain design is conventionally adopted. While being transmitted, Cross-clock domain signals will come across the phenomenon of metastability, hence it will be a major concern for the multi -clock domain system designers to probe how to maintain the system stability and to have data transmission conducted smoothly. As to the bus system data transmission in the system where the two data interface clocks don’t match, one of super and effective solutions is to use asynchronous FIFO buffer memory. How To solve the key and difficult issue that metastability and how to generate empty and full flag correctly in asynchronous FIFO design. Traditional FIFO design often synchronizes write/read address first, then compares them to generate empty/full signals or empty / full flag first compare the read and write pointer, and then synchronized to the clock domain, This design takes on too much area and can only work at a low frequency,this will allow the signaling pathways of these two modules delay caused by constraints of the operating frequency of the entire module. A new method of asynchronous FIFO is proposed to overcome these problems,omit the "full" signal generator module and redundant memory bit depth to simplify the conventional FIFO module, leaving only the "empty" signal generation module,avoid the use of a large number of synchronization registers, reducing the area of space. FPGA verification results show that the asynchronous FIFO improved performance has been significantly improved.Keywords: Field Programmable Gate Array (FPGA); Metastable; Mmpty / Full Flag production; High-speed FIFO目录摘要 (I)ABSTRACT (II)第一章绪论 (1)1.1研究背景和意义 (1)1.2研究现状 (1)1.3本文的主要工作 (3)1.4论文结构 (3)第二章跨时钟域设计的挑战与实现方法 (4)2.1跨时钟域设计的挑战 (4)2.1.1亚稳态问题 (4)2.1.2亚稳态产生的原因 (5)2.1.3亚稳态的危害 (5)2.2 跨时钟域的实现方法 (6)2.2.1同步器 (6)2.2.2握手机制 (9)第三章开发环境 (11)3.1硬件平台 (11)3.2软件平台 (11)第四章异步FIFO的设计与实现 (13)4.1异步FIFO (13)4.1.1异步FIFO工作原理 (13)4.1.2异步FIFO设计的难点 (14)4.2常见异步 FIFO 的设计 (16)4.2.1 读写地址产生逻辑 (18)4.2.2空/满标志的产生及代码的实现 (19)4.3.3改进的异步 FIFO 设计方法分析 (22)4.4高速异步FIFO的设计与实现 (23)4.4.1常见FIFO模块分析 (23)4.4.2高速异步FIFO 设计 (25)第五章结论 (28)第六章参考文献 (29)致谢 (30)附录高速异步FIFO设计仿真分析 (31)附1. 设计工作流程 (31)附.1.1 设计输入 (31)附.1.2 设计编译 (35)附.1.3 设计仿真 (36)第一章绪论1.1研究背景和意义作为21 世纪最重要的科学领域之一,超级计算机是体现科技竞争力和综合国力的重要标志。
基于多时钟域的异步FIFO设计

基于多时钟域的异步FIFO设计
杨青山;蔡敏
【期刊名称】《中国集成电路》
【年(卷),期】2007(016)009
【摘要】在大规模集成电路设计中,一个系统包含了很多不相关的时钟信号,当其目标域时钟与源域时钟不同时,如何在这些不同域之间传递数据成为了一个重要问题.为了解决这个问题,我们可以用一种异步FIFO(先进先出)存储器来实现.本文介绍了一种利用格雷码指针实现在多时钟域传递数据的FIFO设计.
【总页数】5页(P36-39,62)
【作者】杨青山;蔡敏
【作者单位】华南理工大学物理科学与技术学院;华南理工大学物理科学与技术学院
【正文语种】中文
【中图分类】TP3
【相关文献】
1.接入网多时钟域系统中异步FIFO控制器的设计 [J], 朱华伟
2.基于异步FIFO实现不同时钟域间数据传递的设计 [J], 常胜;黄启俊
3.基于异步FIFO的多时钟域同步技术研究 [J], 朱华伟;税奇军
4.基于FPGA的异步跨时钟域设计 [J], 黄琳; 王新; 胡成辉
5.基于Verilog HDL的异步FIFO设计 [J], 李红科;王庆春;余顺园
因版权原因,仅展示原文概要,查看原文内容请购买。
基于VHDL的异步FIFO设计

基于VHDL的异步FIFO设计2011年7月15日第34卷第14期现代电子技术ModernElectronicsTechniqueJuI.2011V o1.34No.14基于VHDL的异步FIFO设计李辉,王晖(中国空空导弹研究院,河南洛阳471009)摘要:FIFO经常应用于从一个时钟域传输数据到另一个异步时钟域.为解决异步FIFO设计过程中空满标志判断难以及FPGA亚稳态的问题,提出一种新颖的设计方案,即利用格雷码计数器(每次时钟到来仅有1位发生改变)表示读/写指针,设计二级同步链为跨越不同时钟域的读/写指针,以提供充足的稳定时间,并通过对比格雷码指针产生空满标志位.该设计采用VHDL语言进行设计,利用ALTERA公司的FPGA得以实现.经验证进一步表明,模块化的设计不仅避免了亚稳态的产生,增大平均无故障工作时间(MBTF),也使工作效率大为提升.关键词:FIrO;异步;亚稳态;格雷码中图分类号:TN402—34文献标识码:A文章编号:1004—373X(2011)14—0154—03 AsynchronousFIFODesignBasedonVHDLIIHui,WANGHui(ChinaAirborneMissileAcademy,Luoyang471009,China)Abstract:FIFOisoftenusedtOsafelypassdatafromoneclockdomaintoanotherasynchronou sclockdomain.InordertO solvetheconundrumsofcorrectlyjudging"full"or"empty"intheFIF0designandmetastabilityofFPGA,anewdesignusinggraycounterpointers(onlyonebitchangedwhenclockedgearrived)tOdenotereadand writepointersisproduced,dualstagesynchr0nizationisusedtOprovideadequatestabilizationtimeforthereadandwritepoin tersacrosstWOdifferentclock domains."full"or"empty"flagsareproducedbycomparingthetWOpointers.Thedesignisac hievedusingVHDLinAITERAFPGA.Themoduledesignusestheerrorsofmetastabilitygracefullythroughverifi cation.TheMTBFhasbeenin—creasedgreatlyandtheworkefficiencyhasbeenimprovedextraordinarny.Keywords:FIF0;asynchronous;metastabi1ity;Graycode先进先出缓存电路读/写(FIFO)在大规模逻辑设计中被广泛应用,几乎每个芯片都要涉及,同样在空空导弹的数据传输体系中也得以大量应用.FIFO类型可以分为两种,第一种为同步FIFO,即读/写时钟是同步的,这里的同步不仅仅是指读/写时钟为同一个时钟,即属于同一个时终域.当读/写时钟频率为倍数关系,即相位关系确定时,也归属同步FIFO的范畴.另一种为异步FIFO,读/写时钟频率不成倍数关系或相位关系不确定,即跨时钟域.异步FIFO可以在不同的时钟域之间快速方便地传输实时数据,因此在遥测数据传输中,异步FIFO实用性更好.然而如何正确地产生空满标志以及如果解决亚稳态问题是异步FIFO设计的难点_1].1FIFO结构首先,典型的FIFO结构框图如图1所示.FIFO的数据存储在具有独立写端I=1和读端口的RAM中.读指针rd—pointer指向下一个将要读取的位置,写指针wrpointer指向下一个将要写入的位置,每1次写操作收稿日期:201卜02—14后写指针加1,读操作使读指针加1.状态产生模块中, full和empty表示FIFO读/写的临界状态.FIFO设计的关键是产生读/写地址和空满标志.空满标志是基于引起指针相等的操作.如果是复位或者读操作引起读/写指针相等,FIFO认为是空;如果原因是写操作,那么FIFO认为是满.异步FIFO设计的难点是如何同步跨时钟域的指针以及空满标志的产生.r_datJrd出fa双端[_=】RAM"addrrdaddr一]l写指针lvalid_rd读指针valid1vrwrA)trrd~tr状态产生——一fde"●ful】图1F1FO原理框图第14期李辉等:基于VHDL的异步FIFO设计1552亚稳态亚稳态是当信号在无关的电路中或异步时钟域之间传输时导致FPGA系统失效的一种现象.包括FPGA在内的所有数字器件的寄存器都定义了信号时序要求,以保证每一个寄存器都能够从输入端获取数据和在输出端产生数据.为了确保可靠的操作,输入信号必须在时钟沿之前稳定一段时间(寄存器建立时间t.),并且在时钟沿之后稳定一段时间(寄存器保持时间t),然后寄存器输出经过一个特定的时钟到输出延时后有效.满足此要求寄存器才可以正确的在输入端获取数据在输出端产生数据,否则输出有可能是亚稳态].在亚稳态时,寄存器的输出电压在高低电平之间摇摆,即输出将有可能是逻辑0(0V)或者逻辑1(+5V),或者是介于0~5V中间的某个值.亚稳态产生机制图如图2所示,当建立时间或者保持时间不满足时序要求时便会产生亚稳态.在同步系统中,输入信号必须总是满足寄存器时序要求,所以亚稳态不会发生.亚稳态问题通常发生在当一个信号在无关的线路中或异步时钟域中传输.一个寄存器进入亚稳态和从亚稳态进入稳态的时间依赖于制造商的制造工艺和使用环境.大部分情况下,寄存器会很快的进入一个定义的稳态中.在异步FIFO设计中就要避免亚稳态的产生.ico!!一j…一…一0一一lco!:!!竺竺.L一—一——一——]二三二二二l0窖ic0型旦塑塑型——0———一——一————logicIlogic0一一一——1————…——MetastableoutputB,——k图2亚稳态的产生机制图3解决问题的方法3.1同步寄存器当信号在不相关或者异步时钟域传输时,在新的时钟域使用这个信号之前必须进行同步,比如异步FIFO的读指针被同步到写时钟域或写指针被同步到读时钟域[6].新时钟域里的第一个寄存器的作用就是一个同步寄存器.同步装置中寄存器到寄存器路径上的时序裕量可以为亚稳态信号提供稳定时间.由两个寄存器组成的二级同步链如图3所示,它大大的提高了系统的平均无故障工作时间(MTBF),减少了信号传输过程中亚稳态问题的风险.此外,可以通过三级同步进一步增加MTBF值,但在实际中很少需要.3.2格雷码(Graycode)计数器设计异步FIFO的原则是安全可靠地把数据从一个时钟域传输到另一个时钟域.如果用一个相对于计数器时钟是异步的时钟来取样计数器的值,就要考虑计数器的每一位在哪个范围内变化,每一位都有机会同时发生变化,比如从FFFF变化到0000,这时每个单独的位都处于亚稳态.这种变化意味着读数有可能是0000~FFFF之间的任意一个值.这种情况下FIFO将无法正常工作,于是设计一个格雷码来表示的计数器,因为格雷码是最小距离码,相邻的码元只有1位不同,它可以避免因延迟不一致而引起的毛刺现象. SYNCHRONIZATIONCHAINClockldomainf一一一一一一一一一一一一一一一一一一一] I………………一图3二级同步链二进制码转格雷码:g=b,G:b④b件l,Vi≠格雷码转二进制码:b一g,b一g①b斗1,Vi≠计数器由触发器组和累加器组成,处理格雷码计数器的办法为:将格雷码转换为二进制码元,然后加1,再将它转换回格雷码并存储,这是解决产生N位格雷码算法棘手问题的一个办法].异步FIFO的写地址和读地址由格雷码计数器来实现计数,读/写指针均用格雷码来表示,格雷码计数器指针原理如图4所示,当FIFO非空或者非满时,读指针或者写指针实现加1操作.图4格雷码计数器指针原理3.3一种新颖的设计方法产生空满标志空满标志位是通过比较读/写指针来判断的,空满标志的判断方法:对于二进制地址来说,如果RAM大小为M,那么它需要的地址位宽度为N—logM.假设156现代电子技术2011年第34卷双口RAM大小是8B,所需寻址地址位宽度是3b.如果读/写指针均用3位来表示的话,那么当读/写指针相等时,无法判别是读时针追上了写时针造成读空还是写时针追上了读时针造成写满,这样就无法正确判断空, 满标志.为了方便的区分空,满,读/写指针各增加1位,取地址指针宽度为logM+1,寻址中没有使用的最高位地址标记为MSB,即读/写指针为N+1位,寻址范围为2".表1为格雷码表示的4位地址指针.衰1四位二进制与格雷码对比表二进制格雷码指针寻址次数X+1个循环寻址仔细观察表1并分析数据,一种新颖的判断空满标志的方法为:当读/写指针的最高位(MSB)不相等且读/写指针的次高位不相等,剩余的N一2位地址相等时,此时写指针追上了读指针,即写指针比读指针多转一圈,状态模块输出满标志;当读/写指针N+1位都相等时,状态模块输出空标志.判断满标志部分的VHDL代码:process(reset,clk)beginif(reset=O)thenwfull~一0:elsif(clkeventandclk一1)thenif(wgnext(addrsize){一wq2一rptr(addrsize)andwgnext(ad—drsize-1)/一wq2一rptr(addrsize-1)andwgnext(addrsize一2downto o)/一wq2~rptr(addrsize-2downto0))thenwfull<一1:elsewfull<一0:endif;endif;endprocess;判断空标志产生部分的VHDL代码:process(reset,clk)beginif(reset一0)thenrempty<一0:elsif(clkeventandclk=1)thenif(rgraynext=rq2一wptr)thenrempty<一1:elsewfull<一0;endif:endif;endprocess;3.4异步FIFO总体设计通过时针比较产生的异步FIFO框图如图5所示. WCLK和RCLK分别为读时钟和写时钟,wrst—n和rrst—n分别为读/写模块的复位信号.rdata为数据输出端口,wdata为数据输人端口.异步FIFO通过读/写指针来寻址一个双口RAM来实现对数据的读/写, 双口RAM的大小为2"B.读指针被二级同步链到写时钟域,然后与写时针比较产生满标志,读指针产生读地址raddress;写时针被二级同步链同步到读时钟域, 然后与读时钟比较产生空标志,写指针产生写地址waddress.需要注意的是此异步FIFO设计中,空满标志是保守的空满标志,比如满标志,当读时针通过二级同步链同步到写时钟域且满足满标志的条件时,写指针停止加1操作,而同步读指针的过程中,读时针则移动到了其他的地址,同样的适合于空标志,当输出空,满时,其实FIFO的真实状态是还有空间没被写满或者读空,这就是保守的空和满,而这正保证了FIFO不会向上会向下溢出,进一步提高了FIFO工作的可靠性.图5同步时针比较构成异步FIFO框图表2为平均无故障工作时间的对比,c,和C.依赖于器件工艺.表2平均无故障工作时间不采用格雷采用格雷码计数器码指针8L二级同步装置妻无R故100h100年F工作时间(MBT)0占用逻辑单元/个1400860计算公式MTBF一Ⅲ_I_寒软件环境VHDIINALTERAFPGA4结语一个高的平均无故障工作时间表明一个设计是优秀的,提高亚稳态的平均无故障工作时问减少信号传输(下转第16O页)址争环循个^^-}1)¨""¨l.∞∞∞∞吡∞叽如n∞∞n∞∞∞∞阻叽∞叫¨u∞Uu¨n如16O现代电子技术2O11年第34卷相邻系统的发射线上加了不同频率的方波信号,避免了相邻系统间的干扰.本设计中,选用了3kHz,5kHz,7kHz的方波信号,相邻系统的发射端得到不同的发射信号.接收端收到信号以后采用了以发射端信号频率为中心频率,带宽为1kHz的带通滤波,滤波后去掉干扰信号得到有用信号.3.3.3单系统防护距离随着感应线圈长度的变化,线圈和地之间的分布电容也会产生相应的变化,感应线圈越长,分布电容越大. 在感应线很长时,人接近感应线后,分布电容的变化较小,会导致系统灵敏度下降,所以单系统的防护距离不宜太长,限定150m内为宜.4结语经过软件仿真和现场测试,得到了正确的数据.在进行了详细的数据分析以后,证明整个系统的设计思路和计算方法是正确的.基于虚拟仪器及DSP的静电感应式电子围栏系统的前端围栏带有高压脉冲电给入侵者极大威慑,有形围栏给入侵者带来了很多阻碍,若强行入侵,则系统自动发出声,光报警,并可以与其他安防系统联动(如防盗报警主机,视频监控系统,l10报警等).该电子围栏能适应各种环境,且误报率极低,克服了传统的红外,微波等技术的缺陷,报警基本不受气候,地形,树木,小动物等影响.参考文献[1]郭为民.视频监控系统软件现状与技术分析[J].科技致富向导,2010(7):5-7.[2]张俊才,刘树聃.基于计算机控制的红外监控系统的设计与实现[J].微计算机信息,2010(12):35—37.[3]Anon.AudioprocessingsystembasedOnDSPandTIV320CAIC23BrJ].Automation&.Instrumentation, 2009,24(8):57—60.[4]蔡宁果,雷杭州,张毓.用LABWINDOWS/CVI实现分布式数据采集系统[J].继电器,2001,29(4):36—38.[5]桑国明,刘智.数字滤波器的DSP实现[J].大连大学, 2001,22(44):69—72.[6]孙祥娥,李永全.基于Matlab的Chebyshev数字滤波器设计[J].现代电子技术,2004,27(20):109—110.[7]孙洪,余翔宇.数字信号处理[M].北京:电子工业出版社,2005.[8]吴杰康,龙军,王辑祥.基于数字微分算法的系统频率快速准确测量[J].电工技术,2004,19(4):93—97.[9]鞠苏民,陈文华.FIR滤波器的MA TIAB设计与DSP算法实现[J].通信与广播电视,2005(4):l5—2O.Elo]王创业.电子围栏在变电站周界防护中的应用[J].安徽科技,2010(6):48—49.[11]赵亮,张应亮,杨国清,等.基于DSP的电机磁控式智能软起动研究I-J].电网与清洁能源,2009(1):72—75.作者简介:李向东男,1983年出生,硕士研究生.主要研究方向为光电检测和图像处理.(上接第156页)中导致亚稳态问题的风险[1.本文通过研究FIFO的基本结构以及FPGA亚稳态的产生机理,提出了利用二级同步链和格雷码计数器指针解决了同步以及空满状态判断的难题,给出了VHDL软件代码,且该设计已经通过QuartusII的时序仿真验证,作为独立模块可以应用到需要异步时钟域传输数据的电路中,大大提高异步数据传输效率及平均无故障工作时间.参考文献[1]赵永建,段国东,李苗.集成电路中的多时钟域同步设计技术[J].计算机工程,2008,34(9):246—248.[2]许盛,易浩勇.异步FIFO在USB2.0控制器中的应用[J].电子测量技术,2009,32(8):137—140.1-3]许新新,赵雷.可编程逻辑器件亚稳态的分析与测试[J].电子质量,2006(2):3-6.[4]房海东,潘长勇,杨知行.处理整帧数据的FIF()的巧妙控制设计[J].电讯技术,2003,43(4):63—67.I-5]CUMMINGSCliffordE.Synthesisandscriptingtechniques fordesigningmulti—asynchronousclockdesigns[c].SanJo—se,CA:SynopsysUsersGroupConference,2001.[6]雷伏容.VHDL电路设计[M].北京:清华大学出版社,2007.[7]王念旭.DSP基础与应用系统设计[M].北京:电子工业出版社,2003.[8]田志明,杨军,罗岚.异步复位设计中的亚稳态问题及其解决方案[J].电子器件,2002,25(4):435—439.r9]CUMMINGSCliffordE,MIIISDon.SynchronousRe—sets?AsynchronousResets?IamSoConfused!HOWWⅢI EverKnowWhichtOUseEc].SanJose,CA:Synopsys UsersGroupConference,2002.[1o]罗吴.一种异步FIFO的设计方法[J].电子技术应用,2004(8):70—74.作者简介:李辉男,1983年出生,硕士研究生.研究方向为数据通信领域.。
异步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冲突。
基于FPGA的异步FIFO设计方法详解

基于FPGA的异步FIFO设计方法详解在现代电路设计中,一个系统往往包含了多个时钟,如何在异步时钟间传递数据成为一个很重要的问题,而使用异步FIFO可以有效地解决这个问题。
异步FIFO是一种在电子系统中得到广泛应用的器件,文中介绍了一种基于FPGA的异步FIFO设计方法。
使用这种方法可以设计出高速、高可靠的异步FIFO。
在现场可编程逻辑芯片的设计过程中不同模块之间的数据接口尤其是不同时钟系统的各个模块之间的数据接口是系统设计的一个关键用异步FIFO模块来实现接口,接口双方都在自己时钟的同步下进行工作它们之间不需要互相握手只需要跟接口FIFO模块进行交互即可即向接口FIFO模块中写入数据或从FIFO模块中读出数据。
用这样一个缓冲FIFO模块实现FPGA内部不同时钟系统之间的数据接口使设计变得非常简单和容易所用的FIFO 接口是XILINX公司提供的IP核。
经过充分测试和优化,系统运行稳定占用的FPGA内部资源也非常少。
1 FIFO 类型FIFO先进先出队列是一种在电子系统得到广泛应用的器件通常用于数据的缓存和用于容纳异步信号的频率或相位的差异FIFO的实现通常是利用双口RAM 和读写地址产生模块来实现的图1显示出了FIFO 的内部结构。
根据读写操作的同步/异步标志方案的同步/异步第一个写操作以及复位功能的不同FIFO 存储器可分为4 大类:(1)异步FIFO。
通常只有两个控制信号读使能(RE )与写使能(WE)信号标志信号有全空标志(EF)全满标志(FF)可选半满标志(HF)几乎全满标志(AF)几乎全空标志(AE)这些标志并不与任何时钟或事件同步但是反映读写指针的即时对照。
(2)选通式FIFO。
与异步FIFO存储器相似选通FIFO通常使用读写选通UNCK和LDCK 信号以及输出使能OE信号这类FIFO 通常提供半满标志(HF)可选几乎满标志(AF)几乎空标志(AE)全空标志(EF)和全满标志(FF)这些标志虽然反映读写指针但不与任何时钟或事件同步。
高速异步FIFO的实现

另外由于比较前要同步,所以当写满标志有效时,FIFO 内其实还可以写入一到两个数据,这一个问题是异步电路本身决定的。读空情况与写满相同。
3.3 FIFO 的功能模块划分和现实
本方案实现的FIFO 数据宽度为8 位,深度为256 ,整个电路分为三个主要功能模如图2 所示,读写地址产生模块,双端口RAM ,满空标志模块。写地址产生模块的功能是,当写能有效且FIFO 写满无效时,写地址增加一,读地址产生模块与之雷同。
图3 FIFO 的波形仿真图
最后对电路进行时序分析,得出采用该方案设计的FIFO 工作频率为91.74 MHz (没有对电路优化) ,与文献[2]采用的延迟比较方案工作频率103 MHz相当但不会出现FIFO 刚开始工作时的逻辑错误,而与传统的FIFO 电路77.6 MHz 相比快了不少。
参 考 文 献
[1] Clifford E. Cummings Synthesis and Scripting Techniques for Designing Multi2Asynchronous Clock Designs [ EB/ OL ] . www. . cn ,2001.
图2 FIFO 功能模块的划分
4 设计仿真及总结
clka、clkb 时钟周期分别为:77 MHz、83 MHz。仿真开始先向FIFO 写入若干个数据,然后读出两个数据,此后只写数据而不读,当双端口RAM 的写地址为2 (FIFO 已被写满) 如图3 所示,写满标志fw马上为高,禁止写数据同时写地址也不再增加,此时将写使能hsa 置低hsb 置高即只读不写,当读地址为2 时( FIFO 已读空) 空标志fr 变高,禁止读并且读地址不 亚稳态的消除
基于FPGA的异步FIFO设计毕业设计论文.doc

江苏科技大学本科毕业设计(论文)学院专业学生姓名班级学号指导教师二零壹叁年六月江苏科技大学本科毕业论文基于FPGA的异步FIFO设计Asynchronous FIFO design based on FPGA摘要在现代集成电路芯片中,随着设计规模的不断扩大,一个系统往往包含多个时钟,如何进行异步时钟间的数据传输成为了一个很重要的问题。
异步FIFO (First In First Out)是一种先进先出电路,可以在两个不同的时钟系统间进行快速准确的数据传输,是解决异步时钟数据传输问题的简单有效的方案。
异步FIFO 在网络接口、数据采集和图像处理等方面得到了十分广泛的应用,由于国内对该方面研究起步较晚,国内的一些研究所和厂商开发的FIFO电路还远不能满足市场和军事需求。
由于在异步电路中,时钟间的周期和相位完全独立,以及亚稳态问题的存在,数据传输时的丢失率不为零,如何实现异步信号同步化和降低亚稳态概率以及正确判断FIFO的储存状态成为了设计异步FIFO电路的难点。
本课题介绍了一种基于FPGA的异步FIFO 电路设计方法。
课题选用Quartus II软件,在Cyclone II 系列的EP2C5T144C8N芯片的基础上,利用VHDL 硬件描述语言进行逻辑描述,采用层次化、描述语言和图形输入相结合的方法设计了一个RAM深度为128 bit,数据宽度为8 bit的高速、高可靠的异步FIFO电路,并对该电路功能进行时序仿真测试和硬件仿真测试。
关键词:异步FIFO;同步化;亚稳态;仿真测试AbstractIn modern IC chips, with the continuous expansion of the scale of design, a system always contains several clocks. How to transmit data between the asynchronous clocks become a very important problem.Asynchronous FIFO (First In First Out) is a first-in, first-out circuit, it can transmit data between two diffent clock systems fastly and accurately, it is also a simple and effective solution to solve the problem of asynchronous clock data transfer. The asynchronous FIFO has a very wide range of applications in network interface, data acquisition and image processing.But because of the aspect of a late start, some domestic research institutes and manufacturers which research the FIFO circuit also can not meet the needs of the market and the military.In the asynchronous circuit, because of that the clock cycle and phase is completely independent, and the presence of metastability problems, the loss rate of data transmission is not zero. How to implement asynchronous signal synchronization, reduce the probability of metastability and judge the state of the FIFO storage correctly become a difficult problem while designing the asynchronous FIFO circuit. This paper introduces a method of asynchronous FIFO circuit design based on FPGA. This topic selects Quartus II software, the Cyclone II family EP2C5T144C8N chip, based on the use of VHDL hardware description language for logical descriptions, using the method of combining hierarchical, description language and graphical input ,This topic designs a high-speed, highly reliable asynchronous FIFO circuit as the RAM depth is 128 bit and the data width is 8 bit, and tests the circuit function with timing and software simulation.Keywords:Asynchronous FIFO; Synchronization; Metastability; simulation testing目录第一章绪论 (1)1.1 FPGA简介 (1)1.2 异步FIFO简介 (1)1.3 国内外研究现状及存在的问题 (1)1.3.1 研究现状 (1)1.3.2 存在问题 (2)1.4 本课题主要研究内容 (3)第二章异步FIFO设计要求及基本原理 (4)2.1 设计要求 (4)2.2 异步FIFO基本原理 (5)2.3 异步FIFO设计难点 (5)2.4 系统设计方案 (6)2.5 异步FIFO验证方案 (7)2.5.1 验证复位功能 (7)2.5.2 验证写操作功能 (7)2.5.3 验证读操作功能 (7)2.5.4 验证异步FIFO电路整体功能 (7)第三章模块设计与实现 (8)3.1 格雷码计数器模块 (8)3.2 同步模块 (8)3.3 格雷码∕自然码转换模块 (9)3.4 空满标志产生模块 (10)3.5 双端口RAM (13)第四章时序仿真与实现 (15)4.1 模块整合 (15)4.2 时序仿真及功能测试 (17)4.2.1 复位功能软件仿真与测试 (17)4.2.2 写操作功能时序仿真与测试 (17)4.2.3 读操作功能时序仿真与测试 (18)4.2.4 异步FIFO电路整体功能软件仿真与测试 (18)4.2.5 时序仿真结果总结 (19)第五章硬件仿真与实现 (20)5.1 外部电路焊接 (20)5.2 引脚分配 (21)5.3 调试电路设计 (24)5.3.1 调试电路介绍 (24)5.3.2 异步时钟产生模块 (25)5.3.3 伪随机数据队列产生模块 (25)5.3.5 调试电路引脚分配 (26)5.3.6 调试电路硬件仿真 (27)5.4 异步FIFO电路硬件仿真 (28)5.4.1 复位功能硬件仿真与测试 (29)5.4.2 写操作功能硬件仿真与测试 (30)5.4.3 读操作功能硬件仿真与测试 (30)5.4.4 异步FIFO硬件电路整体功能软硬件仿真与测试 (31)5.4.5 硬件仿真结果总结 (32)结论 (33)致谢 (34)参考文献 (35)附录 (36)第一章绪论1.1 FPGA简介FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在CPLD、PAL、GAL等可编程器件的基础上进一步发展的产物[10]。
基于异步FIFO的多时钟域同步技术研究

刻 , t= 0一时刻 , 定 信 号 的取 值 为 0 t = 0 在 规 ; + 时 刻 , 定信 号 的取 值 为 1 显 然 , 规 , 亚稳 态 的数
据定 义 回避 了上述 问题 , 是 在 同步 电路设 计 中 , 但
0 引言
在现 代 I 、 SC 以及 F G CAI P A设 计 中 , 多 软 许
必须考 虑 上述 问题 。 为此 首先介 绍 两个概 念 :
建 立 时问 : 发器 在 时钟上 升沿 到来 之前 , 触 输
人 数据 必须 保持 不变 的时 间.
件 程序 可 以 帮助 工 程 师 建 立 几 百万 门 的 电路 , 但
第2 2卷 第 5期
Vo . 2 No 5 12 .
四川 文理 学院 学报
Se u n Un v r i fArsa d S in eJ u n l ih a i e st o t n ce c o r a y
21 0 2年 9月
Se 2 2 p. 01
基 于 异 步 FF IO的 多时 钟 域 同步 技术 研 究
3 7
21 0 2年第 5期
朱华伟 , 税奇 军: 基于异步 FF IO的 多时钟域 同步技 术研 究
一
方面, 集成 电路的集成度越来越高 , 其内部各模
为 了消 除亚稳 态 , 常 需要 将 异 步 时 钟 域 交 互 的 通 信 号在 本地 时钟 域 用 两 级触 发器 同步 , 样 又 会 这 有 很多 时钟周 期 浪费 在 系统 的 “ 手 ” , 而 降 握 中 从 低 传输 速率 .
的异 步 FF I O同步器 设计 方法 .
异步FIFO设计

,异步FIFO设计文档一、概述在大规模ASIC或FPGA设计中,多时钟系统往往是不可避免的,这样就产生了不同时钟域数据传输的问题,其中一个比较好的解决方案就是使用异步FIFO 来作不同时钟域数据传输的缓冲区,这们既可以使相异时钟域数据传输的时序要求变得宽松,也提高了它们之间的传输效率。
此文内容就是阐述异步FIFO的设计。
二、设计原理结构框图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模块。
二进制计数器存在的问题异步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的电路原型以及局部波形的放大。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于异步FIFO实现不同时钟域间数据传递的设计
[2006-12-1813:31:00|By:夏虫]
推荐
摘要:数据流在不同时钟域间的传递一直是集成电路芯片设计中的一个重点问题。
本文通过采用异步FIFO的方式给出了这个问题的一种解决方法,并采用Verilog硬件描述语言通过前仿真和逻辑综合完成设计。
关键词:异步FIFO;时钟域;Verilog
引言
当今集成电路设计的主导思想之一就是设计同步化,即对所有时钟控制器件(如触发器、RAM等)都采用同一个时钟来控制。
但在实际的应用系统中,实现完全同步化的设计非常困难,很多情况下不可避免地要完成数据在不同时钟域间的传递(如高速模块和低速模块之间的数据交换)。
这时,如何保持系统的稳定,顺利完成数据的传输就成为一个重要的问题,这也是异步电路设计中最为棘手的问题。
通常的做法是采用对每位信号加同步器或增加握手信号来解决这一问题,但这样会增加系统的复杂度且影响传输速度。
本文的做法是在两个时钟域的交界处设计一个异步FIFO,通过它来实现数据流的传输。
由发送时钟域将数据写入,接收时钟域将数据取出,在数据传输的同时实现了数据的缓存,因此是一种较理想的方法。
不同时钟域间数据传递的
问题及其解决方法
不同时钟域间数据传递的最重要问题就是亚稳态问题。
当数据信号通过两个时钟域的交界处时,将会分别由这两个时钟来控制信号的值。
此时如果两时钟信号的敏感沿非常接近并超过了允许的额度,则将出现数据信号的不稳定,即电路陷入亚稳态,也称为同步失败。
亚稳态是在两时钟敏感沿靠得很近、第二级时钟敏感沿到来时其输入数据不稳时发生,可将其视为仅仅是第二级触发器输入信号不稳定所导致的结果。
只要使输入信号稳定,就能解决亚稳态问题。
针对如上所述亚稳态的特点,可设计一个同步器来保证数据的稳定传输以解决这个问题。
其原理在于使信号在新的时钟域中先稳定下来再进入相关的逻辑,以保证信号与新的时钟同步。
本设计在时钟域的接口处就采用此法。
异步FIFO模块设计及实现
异步FIFO结构设计
本文所设计的异步FIFO采用循环队列方式,由独立的两个时钟Iclk和Oclk来控制读、写指针。
模块结构如图1所示。
输入端口:输入端时钟Iclk,输出端时钟Oclk,8位并行输入数据Din,复位信号Rst_。
输出端口:8位并行输出数据Dout,FIFO写满信号Full,FIFO读空信号Empty。
信号后缀:i—由输入时钟域控制、o—由输出时钟域控制、g—GRAY码、b—二进制自然码。
由于FIFO的空、满是通过比较读、写指针来确定的,而读、写指针分别属于Oclk 和Iclk两个时钟域,所以对其比较时要进行同步化处理,即用到双触发器型同步器,以避免亚稳态的出现。
以写指针Wp为例。
Wpib转换为Wpig,一方面控制Din 的写入地址,另一方面通过同步和GRAY到二进制码转换送入到Oclk。
本文将传输的Wp由GRAY码形式转换为二进制形式,形成Wpob。
此时Wpob与Rpob为同步信号,比较其大小后可判断FIFO是否读空来控制FlagE信号。
若FIFO为空,则FlagE置Empty信号,同时调整Rpob停止读出数据。
同理可知Rp和Full的控制过程。
在整个数据流动过程中,需要跨过时钟域的指针经历了两次码制的变化:二进制码到GRAY码和GRAY码到二进制码。
前者是利用GRAY码在递增时每次只有一位发生变化的特点,以GRAY码的形式通过时钟域分界线最大限度减小了指针信号的变化,避免了信号传输中的抖动。
而再将信号由GRAY码转换为二进制码进行比较则是由FIFO异步的特点所决定。
由于读、写指针异步,不存在稳定的相对关系,为避免读、写指针同时对一个存储单元进行操作,在对FIFO做空、满比较时会对指针差留下一定余量。
由于GRAY码形式不易于直接比较这种有固定差额的数值,所以将其转化为二进制码进行比较。
HDL实现
下面采用Verilog HDL语言在RTL级上设计此异步FIFO数据通道。
此方案的核心在于GRAY码到二进制的转换和同步器的设计,均在同步和GRAY到二进制码转换模块中实现,程序如下:
……
always@(posedge Oclk or negedge Rst_)//Oclk domain synchronization
if(!Rst_)
……//initialize Wpmg1,Wpmg2and Wpob
else
begin
Wpmg1<=Wpig;
Wpmg2<=Wpig1;
Wpob[0]<=Wpmg2[5]^Wpmg2[4]^Wpmg2[3]^Wpmg2[2]^Wpmg2[1]
^Wpmg2[0];//GRAY to binary
Wpob[1]<=Wpmg2[5]^Wpmg2[4]^Wpmg2[3]^Wpmg2[2]^Wpmg2[1];
……
Wpob[0]<=Wpmg2[5];
end
……
如上程序所示,以写指针为例,输入时钟GRAY码写指针Wpig进入输出时钟域后赋给两个串行寄存器Wpmg1、Wpmg2,此后将Wpmg2变换成二进制码并传输给下一级寄存器Wpob。
这样就完成跨时钟域数据的同步化并实现了码制的变换。
这样,当读、写信号被顺利同步化以后,实际上其中通过时钟域边界的信号(仍以Wpob为例)已被同步器延迟了两个Oclk周期,在这段时间内Wpib有可能已经在Iclk作用下增加了。
如果使用“Wpob=Rpob”为条件来判断FIFO达到空状态,则此时实际控制读FIFO主体的指针Wpig可能已继续下行,导致读出错误的数据。
为避免这种情况的出现,进行指针比较时是留有一定余地的,具体程序如下:……
parameter DIFF=3’b100;
……
assign FlagE=((Wpob<=Rpob+DIFF)&&(Wpob>=Rpob))?1:0;……
如上程序所示,以空标志为例,比较的是保留了4位的“即空”状态,即读指针离写指针还差4个周期时,就认为其读“空”,从而置读空标志FlagE。
对于一个FIFO而言,数据流在其中是连续流动的,“即空”状态的判断是通过减小FIFO的最大容量来保证传输的稳定。
仿真验证和综合
设系统复位后Din输入为从0开始每Iclk周期加1至63的循环变化数据。
如果仿真时钟周期Iclk设为30ns、Oclk设为50ns,所得结果如图2所示。
从图2中可以看到,当输入时钟频率大于输出时钟频率时会出现数据写满的情况。
因为此时写时钟是快时钟,故写满比较发生在输入时钟域。
当比较到两指针差等于定义的DIFF值(此时为4)时,由Iclk触发写满信号给前级系统。
同理可得空状态的仿真也能达到设计要求。
对于逻辑综合,本文使用Synopsys公司的Design Compiler工具实现ASIC综合。
通过生成的Violators.rpt、area.rpt、tim_max.rpt、lib.rpt等报告观察综合所得电路的特性,可知此设计无violated constraints,表明综合结果能够达到约束条件的要求,此设计能在给定条件下工作,即约束成功。
结语
本文讨论了异步设计中数据在不同时钟域间传递所产生的亚稳态问题及其解决方法,使用Verilog HDL,采用Top-Down的模块设计方法实现了一种解决此问题的异步FIFO方案。
经验证这种方案能方便安全地实现数据跨时钟域的传递,并能同时起到数据缓存的作用,因此是一种较好的解决方法。
■
参考文献
1A.Chakraborty,M.R.Greenstreet A minimal source-synchronous interface, ASIC/SOC Conference,2002.15th Annual IEEE International,25-28Sept. 2002Page(s):443-447
2William J.Dally,John W.Poulton Digital Systems Engineering, CambridgeUniversity Press,1998,Page(s):468.
3Clifford E.Cummings Synthesis and Scripting Techniques for Designing Multi-Asynchronous Clock Designs,Sunburst Design,Inc.。