ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:226.23KB ,
资源ID:9722621      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9722621.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(异步FIFO设计.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

异步FIFO设计.docx

1、异步FIFO设计【转】异步FIFO是一种先进先出电路,用在需要实时数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。异步FIFO与同步FIFO最大的不同在于异步FIFO读写时钟不同,通常异步FIFO用来做数据的时钟域转换,FIFO设计中难度最大的地方在FIFO的空满标识的产生,对同步FIFO来说,由于读写指针的增加时钟频率相同,因此读写指针可以直接进行比较产生出空满标志,而异步FIFO某由于读写两端时钟频率不同,读写指针需要进行时钟域转换后才能进行比较,也就是读时钟域的读地址要先转到写时钟域,然后与写时钟域的写地址进行比较,而实际这种比较时存在一定风险的。 异步FIFO设计一般的结构

2、有:双口存储器、读地址产生逻辑、写地址产生逻辑、空/满标志产生逻辑四部分构成。图1是一种常用的异步FIFO设计方案,其中,读地址(rptr)和空标志(rempty)由读时钟 (rclk)产生,而写地址(wptr)和满标志(wfull)由写时钟(wclk)产生。把写地址与读地址相互比较以产生空/满标志。由于读写地址的变化由不同的时钟产生,所以对FIFO空或满的判断是跨时钟域的。如何避免异步传输带来的亚稳态以及正确地产生空/满标志是设计异步FIFO的难点。图1 在设计时,需要弄清楚以下几个方面: 1.首先确定输入输出接口,异步FIFO在一个时钟域中进行写数据操作,而在另一个时钟域中进行读数据操作,

3、所以在写数据模块,需要有写数据wdata,写时钟wclk,写复位wrst_n,写请求wreq,写满标志wfull;在读数据模块,需要有读数据rdata,读时钟rclk,读复位rrst_n,读请求rreq,读空标志rempty。其中rdata,rempty,wfull为输出信号,其余为输入信号。 其FIFO用来存储16*8数据(数据宽为8,数据深度为16)的顶层模块如下: /异步FIFO缓存16*8数据,即数据宽度为8,深度为 16/module yibufifo(rdata,rempty,rrep,rclk,rrst_n,wdata,wfull,wrep,wclk,wrst_n);input

4、wclk,wrep,wrst_n;input rclk,rrep,rrst_n;input7:0wdata;output7:0rdata;output rempty,wfull;wire wclk,wrep,wrst_n;wire rclk,rrep,rrst_n;wire 7:0wdata;wire 7:0rdata;wire 3:0wptr,rptr;wire 3:0waddr,raddr;wire aempty_n,afull_n;ram i1(.wdata(wdata),/读写存储模块 .rdata(rdata), .waddr(wptr),/地址与指针同步 .raddr(rptr),

5、/ .wrep(wrep), .wclk(wclk);async_cmp i2(.aempty_n(aempty_n),/异步比较读写指针产生异步空满标志 .afull_n(afull_n), .wptr(wptr), .rptr(rptr), .wrst_n(wrst_n);rptr_empty2 i3(.rempty(rempty),/根据rclk产生读指针rptr和空标志rempty .rptr(rptr), .aempty_n(aempty_n), .rrep(rrep), .rclk(rclk), .rrst_n(rrst_n);wptr_full2 i4(.wfull(wfull)

6、,/根据wclk产生写指针wptr和满标志wfull .wptr(wptr), .afull_n(afull_n), .wrep(wrep), .wclk(wclk), .wrst_n(wrst_n);endmodule顶层模块图: 其中 2.1 读写地址产生逻辑(本设计中读写地址与读写指针同步)读写地址线一般有多位,如果在不同的时钟域内直接同步二进制码的地址指针,则有可能产生亚稳态。例如,读指针从011变化到100时,所有位都要变化,读指针的每一位在读时钟的作用下,跳变不一致,即产生毛刺。如果写时钟恰好在读指针的变化时刻采样,得到的采样信号可能是000111中的任何一个,从而导致空/满信号判

7、断错误。由实践可知,同步多个异步输入信号出现亚稳态的概率远远大于同步一个异步信号的概率3。解决这一问题的有效方法是采用格雷码。格雷码的主要特点是相邻的两个编码之间只有一位变化。图2是格雷码产生的逻辑框图。在读使能或写使能信号有效、并且空/满标志无效的情况下,读写指针开始累加,进行FIFO读或写操作。二进制码与格雷码的转换是一个“异或”运算:gnext=(bnext1)bnext。格雷码gnext 经寄存器输出格雷码指针ptr。这种方法采用了两组寄存器,虽然面积较大,但是有助于提高系统的工作频率。图2always (posedge rclk or negedge rrst_n)begin if(

8、!rrst_n) begin rbin=0; rptr=0; end else begin rbin=rbnext; rptr1)rbnext;/二进制码转换成格雷码always(posedge wclk or negedge wrst_n)begin if(!wrst_n) begin wbin=0; wptr=0; end else begin wbin=wbnext; wptr1)wbnext;/二进制码转换成格雷码2.2 空/满标志产生逻辑 正确地产生空/满标志是设计任何类型FIFO的关键点。空/满标志产生的原则是:写满而不溢出,能读空而不多读。传统的异步FIFO把读写地址信号同步后再

9、进行同步比较以产生空满标志,由于读写地址的每一位都需要两级同步电路,大量使用寄存器必然要占用很大的面积。这种方法不适合设计大容量的FIFO。当读、写指针相等也就是指向同一个内存位置时,FIFO可能处于满或空两种状态,必须区分FIFO是处于空状态还是满状态。传统的做法是把读、写地址寄存器扩展一位,最高位设为状态位,其余低位作为地址位。当读写指针的地址位和状态位全部吻合时,FIFO处于空状态;当读写指针的地址位相同而状态位相反时,FIFO处于满状态。传统的异步FIFO工作频率低、面积大。下面将介绍一种产生空/满标志的新方法。 采用象限比较法,先确定当前读写状态是快接近满了,还是快要接近空了。取读指

10、针rptr和写指针wptr的最高两位,按其次序分为4个象限,显然当写指针滞后一个象限,并且当写使能,即复位信号wrst_n为1时,FIFO快要满了,在程序中用close_full_n(dirset)表示,当写指针超前一个象限时,FIFO快要空了,在程序中用close_empty_n(dirrst)表示。如图3所示: 图3图4 用一个寄存器direction来寄存当前是否接近满空的状态,快接近满了则令direction=1;快接近空了则令direction0;由于空/满标志产生的原则为:写满而不溢出,能读空而不多读,所以在其它情况下令direction=1,这样保证满标志不会出错,不会在快满时误

11、以为未满而继续向FIFO写数据造成有效数据被覆盖。最后再由读写指针是否相同和direction一起来判断当前状态是满afull_n还是空aempty_n。 整个满空标志位的判断过程都使用组合逻辑,这样虽然读写时钟不一样,但是在读写指针发生变化时可以马上判断当前满空状态,之后再在读写时钟下清除写满wfull和读空rempty标志位,写满wfull要同步到写时钟域,而读空rempty要同步到读时钟域。写满wfull在afull_n变低时有效为1,在afull_n变高后的下一个时钟清除为0。读空rempty在aempty_n变低时有效为1,在afull_n变高后的下一个时钟清除为0。 根据图4可得:

12、wire close_full_n=(wptrnrptrn-1) & (wptrn-1rptrn);wire close_empty_n=(wptrnrptrn-1) & (wptrn-1rptrn) |wrst);always (posedge high or negedge dirset or negedge dirrst) if (!close_empty_n) direction = 1b0; else if (!close_full_n) direction = 1b1; else direction = high;assign aempty=(wptr=rptr) & !direc

13、tion);assign afull=(wptr=rptr) & direction);always (posedge rclk or negedge aempty) if (!aempty) rempty,rempty2 = 2b11; else rempty,rempty2 = rempty2,aempty;always (posedge wclk or negedge afull) if (!afull) wfull,wfull2 = 2b11; else wfull,wfull2 = wfull2,afull ; 2.3 保守的空/满标志设计中FIFO空/满标志的设置是保守的,即FIF

14、O空/满标志的置位是立即有效的,而其失效则是在一段时间之后。例如一旦读指针追上写指针,就会立即声明一个低电平有效的异步空信号aempty。此信号会立即把图6所示的set触发器置位,使触发器输出为1,即向外部输出同步的空信号rempty,并且保证了FIFO一旦为空,读指针就不增加,避免了FIFO的读溢出。当写地址增加时,表明FIFO已经非空,空标志aempty由低变高,此时可以进行安全的读操作。aempty信号的失效与写时钟同步。空信号rempty是在读时钟域中同步aempty信号得到的。由于同步器使用了两个触发器,因此空信号rempty的失效要经过至少两个时钟周期的延迟。所以,空信号的声明是及

15、时的,而空信号的失效是保守的。也就是说,虽然FIFO已经非空了,但是空信号rempty要经过几个周期的延迟才能变为无效。满信号也有类似的情况。虽然空/满标志的设置是保守的,但这并不影响FIFO功能的正确性,经验证保守的空/满标志能够满足FIFO的设计要求。具体的各个模块程序如下: 读写存储模块RAM:/异步FIFO缓存16*8数据,即数据宽度为8,深度为 16/module ram(wclk,wrep,wdata,waddr,raddr,rdata);input wclk,wrep;/读时钟,读使能input 7:0wdata;/写数据8位input3:0waddr,raddr;/读写地址ou

16、tput7:0rdata;reg7:0fifomem0:3;/duassign rdata=fifomemraddr;/xiealways(posedge wclk)begin if(wrep) fifomemwaddr=wdata;endendmoduleram模块图如下:异步比较读写指针产生异步空满标志async_cmp模块/异步FIFO缓存16*8数据,即数据宽度为8,深度为 16/module async_cmp(aempty_n,afull_n,wptr,rptr,wrst_n);/异步比较产生空满信号/parameter addrsize=4;/parameter N=addrsi

17、ze-1;/地址位宽input wrst_n;/写复位input 3:0wptr,rptr;/读写指针output aempty_n,afull_n;/空满标志reg direction;/ 用一个寄存器direction来寄存当前是否接近满空的状态wire close_full_direction_n; /快接近满了,低电平有效wire close_empty_direction_n;/快接近空了,低电平有效assign close_full_direction_n=(wptr3rptr3-1)&(wptr3-1rptr3);assign close_empty_direction_n=(w

18、ptr3rptr3-1)&(wptr3-1rptr3)|wrst_n);always( negedge close_full_direction_n or negedge close_empty_direction_n)/低电平有效,用来判断directionbegin if(!close_full_direction_n) direction=1b1; /快接近满了则令direction=1; else if(!close_empty_direction_n) direction=1b0;/快接近空了则令direction0; else direction=1b1;/ /所以在其它情况下令d

19、irection=1endassign aempty_n=(wptr=rptr)&!direction);/几乎空信号产生assign afull_n=(wptr=rptr)& direction);/几乎满信号产生endmoduleasync_cmp模块图如下:根据rclk产生读指针rptr和空标志rempty,rptr_empty2模块/异步FIFO缓存16*8数据,即数据宽度为8,深度为 16/module rptr_empty2(rempty,rptr,aempty_n,rrep,rclk,rrst_n);input rrep,rclk,rrst_n;/读时钟,读使能,读复位input

20、 aempty_n;/空标志output3:0rptr;/读指针output rempty;/读空标志reg3:0rptr,rbin;/读指针,读地址二进制reg rempty,rempty2;wire3:0rgnext,rbnext;/读格雷码地址,读二进制地址always(posedge rclk or negedge rrst_n)begin if(!rrst_n) begin rbin=0; rptr=0; end else begin rbin=rbnext; rptr1)rbnext;/二进制码转换成格雷码always(posedge rclk or negedge aempty_

21、n)/读空标志的产生。用格雷码表示begin if(!aempty_n) rempty,rempty2=2b11; else rempty,rempty2=rempty2,aempty_n;endendmodulerptr_empty2模块图:根据wclk产生写指针wptr和满标志wfull,wptr_full2模块/异步FIFO缓存16*8数据,即数据宽度为8,深度为 16/module wptr_full2(wfull,wptr,afull_n,wrep,wclk,wrst_n);input wrep,wclk,wrst_n;/写时钟,写使能,写复位input afull_n;/满标志ou

22、tput3:0wptr;/写指针output wfull;/写满标志reg3:0wptr,wbin;/写指针,写地址二进制reg wfull,wfull2;wire3:0wgnext,wbnext;/写格雷码地址,写二进制地址always(posedge wclk or negedge wrst_n)begin if(!wrst_n) begin wbin=0; wptr=0; end else begin wbin=wbnext; wptr1)wbnext;/二进制码转换成格雷码always(posedge wclk or negedge afull_n)/写满标志的产生。用格雷码表示beg

23、in if(!afull_n) wfull,wfull2=2b11; else wfull,wfull2=wfull2,afull_n;endendmodulewptr_full2模块图如下:测试程序: module yibufifo_tb;/parameter DSIZE = 8;/parameter ASIZE = 4;wire 7:0 rdata;wire wfull;wire rempty;reg 7:0 wdata;reg wrep, wclk, wrst_n;reg rrep, rclk, rrst_n;initial beginwclk=0;rclk=0;wrst_n=0;rrs

24、t_n=0;wrep=1;rrep=0;wdata=0;#30;wrst_n=1;rrst_n=1;#300;wrep=0;rrep=1;endalways #5 wclk=!wclk;/10nsalways #10 rclk=!rclk;/20nsalways (negedge wclk)wdata=wdata+1;yibufifo i1 (.rdata(rdata),.wfull(wfull),.rempty(rempty),.wdata(wdata),.wrep(wrep),.wclk(wclk),.wrst_n(wrst_n),.rrep(rrep),.rclk(rclk),.rrst_n(rrst_n);endmodule在modelsim中的仿真结果如下:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1