一种基于格雷码的异步FIFO设计与实现Word文档格式.docx

上传人:b****2 文档编号:3388733 上传时间:2023-05-01 格式:DOCX 页数:11 大小:116.86KB
下载 相关 举报
一种基于格雷码的异步FIFO设计与实现Word文档格式.docx_第1页
第1页 / 共11页
一种基于格雷码的异步FIFO设计与实现Word文档格式.docx_第2页
第2页 / 共11页
一种基于格雷码的异步FIFO设计与实现Word文档格式.docx_第3页
第3页 / 共11页
一种基于格雷码的异步FIFO设计与实现Word文档格式.docx_第4页
第4页 / 共11页
一种基于格雷码的异步FIFO设计与实现Word文档格式.docx_第5页
第5页 / 共11页
一种基于格雷码的异步FIFO设计与实现Word文档格式.docx_第6页
第6页 / 共11页
一种基于格雷码的异步FIFO设计与实现Word文档格式.docx_第7页
第7页 / 共11页
一种基于格雷码的异步FIFO设计与实现Word文档格式.docx_第8页
第8页 / 共11页
一种基于格雷码的异步FIFO设计与实现Word文档格式.docx_第9页
第9页 / 共11页
一种基于格雷码的异步FIFO设计与实现Word文档格式.docx_第10页
第10页 / 共11页
一种基于格雷码的异步FIFO设计与实现Word文档格式.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

一种基于格雷码的异步FIFO设计与实现Word文档格式.docx

《一种基于格雷码的异步FIFO设计与实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《一种基于格雷码的异步FIFO设计与实现Word文档格式.docx(11页珍藏版)》请在冰点文库上搜索。

一种基于格雷码的异步FIFO设计与实现Word文档格式.docx

1引言

FIFO(FirstINFirstOut)先进先出电路是一种实现数据先进先出的存储器件,普遍用作数据缓冲器。

FIFO的基本单元是寄存器,作为存储器件,FIFO的存储能力是由其内部定义的存储寄存器的数量决定.

FIFO通常是双端口的存储器,其中一个端口用于写入数据,而另一个端口用于读出数据.可以同时对存储器字存储单元进行写入和读出操作.它的数据吞吐率是普通RAM的两倍.FIFO型的存储器不需要由地址来存取数据.需要由另外的信号线(或标志)来指明存储器的内容状态。

在现代数字系统设计中,FPGA(现场可编程门阵列)器件凭借其灵活、方便、资源丰富的优势在很多领域得到了广泛应用.随着其片内存储资源的增加,把FIFO器件集成到其中是一种方便地代替专用芯片的实现方法。

根据异步逻辑的设计方法,引入乒乓操作的设计技巧,给出了一种新颖的异步FIFO设计方案,解决FPGA多时钟系统中不同时钟域传输数据的问题。

2异步FIFO的设计与实现

2。

1通用异步FIFO的基本结构

在现代的集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个时钟。

多时钟域带来的一个问题就是,如何设计异步时钟之间的接口电路.异步FIFO是解决这个问题一种简便、快捷的解决方案。

使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据。

在网络接口、图像处理等方面,异步FIFO得到了广泛的应用。

异步FIFO常用于存储、缓冲在两个异步时钟之间的数据传输。

在异步电路中,由于时钟之间周期和相位完全独立,因而数据的丢失概率不为零.如何设计一个高可靠性、高速的异步FIFO电路便成为一个难点。

下面将介绍解决这一问题的一种方法,其结构框图如图1所示.

本系统FPGA内部FIFO的存储介质是一块双端口的RAM,具有两个独立的读写时钟,整个系统也分为两个完全独立的时钟域——读时钟域和写时间域。

FIFO的控制逻辑执行所有的读写指针管理,产生各种状态标志。

在写时钟域部分,由写地址产生逻辑产生写控制信号和写地址;

读时钟域部分由读地址产生逻辑产生读控制信号和读地址。

在空/满标志产生部分,由读写地址相互比较产生空/满标志。

本设计的外部引脚如表1所示。

这种FIFO设计当中有两个难点:

一是如何正确地设计空、满信号的控制电路;

二是如何同步异步信号,使触发器不产生亚稳态。

下一小节将具体阐述解决方法。

2.2FIFO的读写控制

空/满标志的产生是FIFO的核心部分,如何正确设计这部分逻辑,直接影响到FIFO的性能。

空/满标志产生的原则是:

写满不溢出,读空不多读.即无论在什么时候,都不应出现读写地址同时对一个存储器地址操作的情况。

在读写地址相等或相差一个或多个地址的时候,满标志应该有效,表示此时FIFO已满。

在满信号有效时若继续向FIFO写数据,应根据设计的要求对数据作保持或抛弃重发处理,空标志的产生也是如此。

最直接的做法是,采用读写地址相比较来产生空满标志。

当读写地址的差值等于一个预设值的时候,空/满信号被置位.这种实现方法逻辑简单,但它是减法器形成的一个比较大的组合逻辑,因而限制了FIFO的速度。

所以,一般只采用相等不相等的比较逻辑,避免使用减法器.即:

空标志<

=(|写地址—读地址|<

=预定值)AND(写地址超前读地址)

满标志〈=(|写地址—读地址|〈=预定值)AND(读地址超前写地址)

另一种方法是,比较器只对读写地址比较是否相等。

在读写地址相等的时候有两种情况:

满或者空。

所以,附加了一个并行的区间判断逻辑来指示是空还是满。

这个区间判断逻辑将整个地址空间分为几个部分,以指示读写地址的相对位置.这种做法提高了整个电路的速度,但是也有其缺点。

主要是直接采用读写地址等于不等于的比较逻辑来进行空/满标志的判断,可以带来误判。

将读写指针位宽分别定义为:

rp[aw:

0]和wp[aw:

0],其中rp[aw]和wp[aw]为最高位进位位,rp[aw-1:

0]和wp[aw—1:

0]分别表示读写指针寻址的地址。

当读写指针每次从初始地址处读写到最后一位地址位时,均需向最高位rp[aw]和wp[aw]进位。

因为先有写才能有读,所以当wp[aw-1:

0]=rp[aw-1:

0]时,只要判断wp[aw]与rp[aw]是否相等就可以知道是写指针追赶上读指针写满了(wp[aw]!

=rp[aw]),还是读指针追赶上写指针读空了(wp[aw]=rp[aw]).rp_pl1和wp_pl1分别定义为读写指针的下一个地址,而且为了在判断空满标志时对读写指针进行同步比较,设计中定义了与rd_clk同步的写指针wp_s以及与wr_clk同步的读指针rp_s,这两个信号可以通过同步逻辑来实现。

2.3跨时钟域设计带来的亚稳态问题

亚稳态(Metastability)是指触发器信号和时钟不满足建立时间/保持时间(setup/hold)的基本要求,触发器的输出端将会达到一个不确定的状态。

当一个触发器进入亚稳态时,既无法预测它的输出电平,也无法预测其输出何时才能稳定在某个正确的电平上.在这期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。

当一个信号跨越某个时钟域时,接收该信号的电路需要对其进行同步,用以防止前级存储单元(触发器)的亚稳态在新的时钟域里传播蔓延。

在本系统中内部工作时钟有两个互相异步的不同频率时钟,并且在两个时钟域的逻辑模块之间有许多控制信号需要传递,亚稳态是不可避免的,但是下面的设计可以将其发生的概率降低到一个可以接受的程度.

①对写地址/读地址采用格雷码。

由实践可知,同步多个异步输入信号出现亚稳态的概率远远大于同步一个异步信号的概率。

对多个触发器的输出所组成的写地址/读地址可以采用格雷码。

由于格雷码每次只变化一位,采用格雷码可以有效地减少亚稳态的产生。

②采用两极触发器来同步异步输入信号。

信号同步的目的是防止新时钟域中第一级触发器的亚稳态信号对下级逻辑造成影响.两级寄存器的同步化处理单元由两个触发器串联而成,中问没有其它组合电路。

这种设计可以保证后面的触发器获得前一个触发器输出时,前一个触发器已退出了亚稳态,并且输出已稳定。

但是,这种方法同时带来了对输入信号的一级延时,需要在设计时钟的时候加以注意.

虽然亚稳态是不可避免地,但是采用格雷码可以有效地减少亚稳态的产生.由前面的分析可以看出,由地址直接相减和将地址相互比较产生空/满标志都不可取。

如何简单地进行直接比较,又不提高逻辑的复杂程度呢?

对地址加延时可以做到这一点。

设读地址为rp_bin,用读地址产生读地址格雷码rp_grap_next,将rp_grap_next延一拍得到rp_grap,再将rp_grap延一拍得到rp_grap_x.在绝对时间上,rp_grap_next、rp_grap、rp_grap_x先后从大到小,相差一个地址,如图2所示.写地址也与此类似,即:

wp_grap_next、wp_grap、wp_grap_x.利用这6个地址进行比较,同时加上读写使能,就能方便而灵活的产生空/满标志。

以空标志empty产生为例,当读写格雷码地址相等或者FIFO还剩下一个深度的字,并且正在不空的情况下执行读操作,这时empty标志设置为有效.即:

empty<

=(rp_gray==wp_gray)and(re==1)或empty<

=(rp_gray_next==wp_gray)and(we==1),同理可类推满标志的产生逻辑。

3Verilog实现与仿真

本设计完成了一个完整的规格为256×

8双时钟通用异步FIFO的Verilog建模,并对该设计的编写测试向量进行行为级仿真,仿真工具采用ModelSimSE6.0。

图3给出了整个电路的仿真时序图。

分析上面读写时序图中各状态变化和数据的传输情况,验证各状态信号时序正确,逻辑正确,功能仿真结果正确,整个的工作波形也符合设计要求。

图3双口异步FIFO读写仿真波形

最后,用Synplify7。

6Pro软件进行综合,器件为Altera的EP1C6Q240C8。

一般标志产生电路(用减法器,设阈值)和基于格雷码的标志产生电路,设计结果性能指标对照表如表2所示。

由表2可知,带区间指示逻辑设计的双时钟通用FIFO的特点是直接对读写指针地址进行比较,并通过辅助的区间指示来判断FIFO的读空与写满。

这种方法正如前面所说的,因为避免了地址的减法比较,所以减少了逻辑的复杂度,提高了系统的速度,但是也容易出现一定的误判断现象,而且由于双时钟FIFO出现异步的情况,容易产生亚稳态现象,这种方法亦不能很好地解决.我们可以通过设计格雷码双时钟通用FIFO来较好地处理亚稳态的问题,提高了系统的稳定性。

但是不可避免地,较之一般方式的FIFO来说,需要有更多的逻辑单元,需要用更长的数据传输时间。

4总结

本文提出了一种新颖的用FPGA实现异步FIFO并作为异步时钟域数据传输的接口电路的方法,特别详述了空、满信号的产生.按此方案设计的异步FIFO的软件仿真和硬件实现都已经通过了验证,并应用到实际的电路。

实践证明用此方案设计的异步FIFO具有性能稳定、空满状态标志可靠等特点.

.......。

...。

.....。

.

......。

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

在现代IC设计中,特别是在模块与外围芯片的通信设计中,多时钟域的情况不可避免。

当数据从一个时钟域传递到另一个域,并且目标时钟域与源时钟域不相关时,这些域中的动作是不相关的,从而消除了同步操作的可能性,并使系统重复地进入亚稳定状态[1]。

在有大量的数据需要进行跨时钟域传输且对数据传输速度要求比较高的场合,异步FIFO是一种简单、快捷的解决方案。

  异步FIFO用一种时钟写入数据,而用另外一种时钟读出数据。

读写指针的变化动作由不同的时钟产生。

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

如何根据异步的指针信号产生正确的空、满标志,是异步FIFO设计成败的关键.本文提出一种新颖的异步FIFO设计方案,它通过先比较读写地址并结合象限检测法产生异步的空/满标志,再把异步的空/满标志同步到相应的时钟域。

通过仿真验证,该方法是稳定有效的。

  1异步信号传输问题的分析

  在一个ASIC或FPGA库中,每种触发器都有时序要求。

对于使用上升沿触发的触发器来说,建立时间(SetupTime)是在时钟上升沿到来之前,触发器数据保持稳定的最小时间;

而保持时间(HoldTime)是在时钟上升沿到来之后,触发器数据还应该保持的最小时间[2]。

如图1所示,在时钟上升沿前后的这个窗口内数据应该保持不变,否则会使触发器工作在一个不确定的状态,即亚稳态.当触发器处于亚稳态,且处于亚稳态的时间超过了一个时钟周期时,这种不确定的状态将会影响到下一级的触发器,最终导致连锁反应,从而使整个系统功能失常.当一个信号跨越某个时钟域时,对新时钟域的电路来说它就是一个异步信号。

由于异步信号之间的时序是毫无关系的,因此必然存在SetupTime/HoldTime冲突。

为了避免亚稳态问题,采用如图2所示的双锁存器法[3],即在一个信号进入另一个时钟域前,将该信号用两个锁存器连续锁存两次,最后得到的采样结果就可以消除亚稳态。

  消除亚稳态只是保证了信号电平的稳定,要在不同时钟域中准确传输数据还需要一个接口电路.异步FIFO就是一种不同时钟域之间传递多位数据的常用方法。

  2异步FIFO设计

  异步FIFO是一种先进先出电路,用在需要实时数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。

主要由双口存储器、读地址产生逻辑、写地址产生逻辑、空/满标志产生逻辑四部分构成.图3是一种常用的异步FIFO设计方案,其中,读地址(rptr)和空标志(rempty)由读时钟(rclk)产生,而写地址(wptr)和满标志(wfull)由写时钟(wclk)产生.把写地址与读地址相互比较以产生空/满标志。

由于读写地址的变化由不同的时钟产生,所以对FIFO空或满的判断是跨时钟域的。

如何避免异步传输带来的亚稳态以及正确地产生空/满标志是设计异步FIFO的难点。

  2.1读写地址产生逻辑

  读写地址线一般有多位,如果在不同的时钟域内直接同步二进制码的地址指针,则有可能产生亚稳态。

例如,读指针从011变化到100时,所有位都要变化,读指针的每一位在读时钟的作用下,跳变不一致,即产生毛刺。

如果写时钟恰好在读指针的变化时刻采样,得到的采样信号可能是000~111中的任何一个,从而导致空/满信号判断错误。

由实践可知,同步多个异步输入信号出现亚稳态的概率远远大于同步一个异步信号的概率[3]。

解决这一问题的有效方法是采用格雷码.格雷码的主要特点是相邻的两个编码之间只有一位变化。

图4是格雷码产生的逻辑框图。

在读使能或写使能信号有效、并且空/满标志无效的情况下,读写指针开始累加,进行FIFO读或写操作.二进制码与格雷码的转换是一个“异或”运算:

gnext=(bnext〉〉1)^bnext.格雷码gnext经寄存器输出格雷码指针ptr。

这种方法采用了两组寄存器,虽然面积较大,但是有助于提高系统的工作频率。

  2。

2空/满标志产生逻辑

  正确地产生空/满标志是设计任何类型FIFO的关键点.空/满标志产生的原则是:

写满而不溢出,能读空而不多读。

传统的异步FIFO把读写地址信号同步后再进行同步比较以产生空满标志,由于读写地址的每一位都需要两级同步电路,大量使用寄存器必然要占用很大的面积。

这种方法不适合设计大容量的FIFO.当读、写指针相等也就是指向同一个内存位置时,FIFO可能处于满或空两种状态,必须区分FIFO是处于空状态还是满状态。

传统的做法是把读、写地址寄存器扩展一位,最高位设为状态位,其余低位作为地址位。

当读写指针的地址位和状态位全部吻合时,FIFO处于空状态;

当读写指针的地址位相同而状态位相反时,FIFO处于满状态。

传统的异步FIFO工作频率低、面积大。

下面将介绍一种产生空/满标志的新方法。

随着设计规模的不断增大,一个系统中往往包含多个时钟。

时钟的增多给异步时钟之间的接口带来了很多的问题.使用异步FIFO可以在两个不同的时钟系统之间方便快速的传输数据。

异步时钟是一种先进先出的电路,用来存储,缓存在两个异步时钟域之间的数据。

在异步电路中,由于时钟之间周期和相位的完全独立,因而数据的丢失概率不为0.

异步FIFO的基本结构:

异步双端口ram,和控制逻辑。

异步双端口ram采用altea公司quarutsii定制ip核实现,定制一个存储深度为128bit的双端口ram。

控制逻辑:

空满逻辑的原理是,判定满标志时,将读指针用写时钟同步后采样,与当前写指针一起融入满判定逻辑;

判定空标志时,将写指针用读时钟同步后采样,与当前读指针一起送入空判定逻辑。

当同步读指针时,实际的读指针可能已经发生变化。

这样从写操作的角度考虑,会发生少读的现象,即条件(这个条件后面讨论)满足,判定FIFO满,实际上FIFO可能未满,因为读指针可能仍在变化。

同理,当同步写操作时,实际的写指针可能已经发生变化,因为读操作方看到的只是被同步的或者是被延迟的写指针,从而认定FIFO空,但其实仍在进行写操作,写指针仍在变化,但读操作方是“看不见”的。

简而言之就是,当FIFO未满时,写操作方可能称FIFO已经满了,当FIFO未空时,读操作方可能认为FIFO已经空了。

这样的效果好像是FIFO存储空间动态的缩小了,但是这毫无坏处,因为,如果在FIFO真正的空时,去读,或者当FIFO真正的满时,去写,这才是真正的坏处。

接下来我们分析判断空满所谓的条件:

存储器的空满状态指示是整个fifo设计的核心,其基本原则是在任何时候都不会出现异步FIFO对同一存储单元进行读/写操作。

当读,写指针相等的时候,要么是存储器满,要么是存储器空,必须加以区分.区分的方法有很多,

一种是:

当写指针追赶读指针时,输出几乎满标志,当读指针和写指针相等时,且几乎满标志有效,则判定FIFO为满;

当读指针追赶写指针时,输出几乎空标志,当读指针和写指针相等时,且几乎空标志有效,则判定FIFO为空.

另一种方法是:

通过对读写指针进行编码,将格雷码指针转换为二进制指针。

这里fifo的深度为2^N,而指针采用N+1位。

当二进制编码中的最高位不一致,而其他位都相等时,FIFO满,当二进制编码完全相等的时候,FIFO空。

注意,指针不是影响空满标志的唯一因素,产生空标志是读操作引起的空满标志相等,产生满标志的条件是,写操作引起的读写指针相等。

例如:

存储深度为16bit,即2^4,读写指针宽度为5位.上电复位后,读地址和写地址都为00000,向fifo中写入16个数据,写指针变为10000,而读地址仍然为00000,则FIFO满;

假设再进行16次读操作,写指针为10000,读指针为10000,这就是空标志;

再进行16次写操作使得写指针变为00000,而读指针仍然为10000,则FIFO满。

空标志判断的VHDL语言描述:

architecturebehaveofempty_cmpis

begin

=’1'

whenwr_addr(n-1downto0)=rd_addr(n-1downto0)else

'

0’;

endbehave;

满标志判断的VHDL语言描述:

architecturebehaveoffull_cmpis

full<

=’1’when(wr_addr(n—1)/=rd_addr(n-1))and

(wr_addr(n—2downto0)=rd_addr(n—2downto0))else’0’;

endbehave;

同步逻辑:

同步逻辑就是加一个寄存器对上一个状态进行一下缓存,这样造成了一个时钟周期的延时。

process(clk)

ifrising_edge(clk)then

addr_s〈=temp;

temp<

=addr_a;

endif;

endprocess;

格雷码计数器参见另一篇博文:

整体RTL图如下:

kongmanpanding

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2