异步FIFO设计_第1页
异步FIFO设计_第2页
异步FIFO设计_第3页
异步FIFO设计_第4页
异步FIFO设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、异步FIFO设计 摘要本文采用格雷码设计了一个异步FIFO,经过DC综合的结果如下:时钟频率:1.1GHz面积: 10744.447um2功耗: 7.791mw目 录1. 异步FIFO的设计21.1 异步FIFO简介21.2 FIFO的参数21.3 FIFO的设计原理21.4 FIFO的设计模块61.5 用modelsim仿真FIFO111.6 用DC对FIFO进行综合132.参考文献151. 异步FIFO的设计1.1 异步FIFO简介FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就

2、是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生读写操作。异步FIFO是指读写时钟不一致,读写时钟是互相独立的。异步FIFO(Asynchronous FIFO),一般用于不同时钟域之间的数据传输,比如FIFO的一端连接频率较低的AD数据采样信号,另一端与计算机的频率较高的PCI总线相连。另外,对于不同宽度的数据接口也可以用AFIFO,例如单片机为8位数据输出,而DSP可

3、能是16位数据输入,在单片机与DSP连接时就可以使用AFIFO来达到数据匹配的目的。由于实际中,异步FIFO比较常见。为了便于描述,在后面的章节中将异步FIFO简称为FIFO.1.2 FIFO的参数FIFO的宽度: 进行一次读写操作的数据的位宽。FIFO的深度: 双口存储器中能容纳的数据的总数。满标志: FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出。 空标志: FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出。 读时钟: 读操作所遵循的时钟,在每个时钟

4、沿来临时读数据。 写时钟: 写操作所遵循的时钟,在每个时钟沿来临时写数据。 读指针: 指向下一个读出地址。读完后自动加1。 写指针: 指向下一个要写入的地址的,写完自动加1。 读写指针其实就是读写memory的地址,只不过这个地址不能任意选择,而是连续的。1.3 FIFO的设计原理整体的框图如下:图1.1 FIFO的整体电路图 FIFO的读写指针FIFO可以看成是先进新出的缓冲区,它不像普通的存储器那样,有专门的地址信号。它只能根据地址,顺序地读写缓冲区。所以需要有两个读写指针。这里定义如下:wptr: 写数据的指针rptr: 读数据的指针每读/写完一个数据,读/写指针就会加1,指向下一个待读

5、/写的位置。1.3.2 同步器的设计为了产生空/满标志,需要对2个读/写指针进行比较。由于FIFO的读/写时钟信号,来自2个不同的时钟域,所以先要将这2个指针同步到一个时钟域。这里采用两级D触发器级联来构成同步器。1.3.3 格雷码计数器 采用二进制码对地址指针进行计数时,从一个计数值变到下一个计数值时,可能有多位发生跳变,如从7à8变化时,低位由0111à1000,这样同步器在采样数据时,可能会发生错误。由于采用格雷码计数时,每次只有1位发生跳变,这样使亚稳态发生错误的可能性大大减小了。1.3.4 空标志的产生由于读/写指针,总是指向FIFO的memory中下一个要读/写

6、的位置。只有在读/写复位的时候,读/写指针才回到0位置。复位后,随着数据的读出/写入,读/写指针指向的地址逐渐增加。如果读的速度比较快,当读指针赶上写指针,即读指针与写指针指向同一个位置时,输出的空标志有效。如下图所示:图1.2 FIFO的空/满标志1.3.5 满标志的产生满标志的产生,基于这样的原理:即“写指针比空指针多绕了一圈”后,又指向了空指针所指向的位置。由上可知,空标志的产生,也是由于读/写指针指向了同一位置。那怎么来区分,当读/写指针指向同一位置时,FIFO是满,还是空呢?这里,采用增加一位地址位的方法,来区分满标志和空标志。假设FIFO的深度为16,那么采用5位的读/写地址指针。

7、地址的低4位,用来对寻址memory,读/写指针的最高位用来判断FIFO为空还是为满。当读/写指针的低4位相同时,如果最高位也相同,那么空标志有效,否则满标志有效。 由于格雷码具有一个特性:关于中间的计数值对称。如果从格雷码的中间划开,把它分成2段。分别从上往下看,会发现在对应的位置,只有最高的2位是完全相反,而其余的低位部分则是相同的。因此,当读/写指针的最高2位完全相反,而其余的低位完全相同时,满标志有效(“读指针比写指针多绕了一圈”)。具体如下图所示:图1.3 格雷码的对称特性1.3.6 格雷码计数器如果读/写数据的使能信号(rinc/winc)有效,在下一个读/写时钟的上升沿到来时,会

8、从(对)memory读出/写入一个数据,并且相应的读/写指针会加1。由于习惯上用二进制码来寻址memory,而且用二进制码能很方便地进行累积操作,所以这里以二进制码为主,并将二进制码转换为格雷码,以比较读/写指针来产生空/满标志位。二进制码可以通过以下方式转换成格雷码:gray = (bin >> 1) bin其中,gray表示格雷码,bin表示二进制码。如,设一个5位的二进制码为B4:0,它对应的格雷码为G4:0,则G4 = B4G3 = B3 B3G2 = B2 B2G1 = B1 B1G0 = B0 B0具体如下图所示: 图1.4 比较指针和寻址指针的产生电路1.4 FIFO

9、的设计模块整个FIFO包括1个顶层模块和5个子模块。1.4.1 子模块fifomem这个子模块,主要实现对FIFO的memory进行操作。如果写使能信号(winc)有效,且FIFO满标志(wfull)无效,则在下一个写时钟(wclk)的上升沿到来时,将数据(wdata)写入到memory中写地址(waddr)指针所指向的位置。同时,只要给出读地址(raddr),就可以从memory中读出数据(rdata),与读时钟(rclk)无关。相应的代码如下所示:module fifomem #(parameter DATASIZE = 8, / Memory data word width parame

10、ter 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); / RTL Verilog memory model localparam DEPTH = 1<<ADDRSIZE; reg DATASIZE-1:0 mem 0:DEPTH-1; assign rdata = memraddr; always (posedge

11、wclk) if (wclken && !wfull) memwaddr <= wdata;endmodule1.4.2 子模块sync_r2w这个子模块,通过2个D触发器的级联,将格雷码表示的读指针,同步到写时钟域中。相应的代码如下: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 neg

12、edge wrst_n) if (!wrst_n) wq2_rptr,wq1_rptr <= 0; else wq2_rptr,wq1_rptr <= wq1_rptr,rptr;endmodule1.4.3 子模块sync_w2r这个子模块,也采用2个D触发器的级联,将格雷码表示的读指针,同步到写时钟域中。相应的代码如下:module sync_w2r #(parameter ADDRSIZE = 4) (output reg ADDRSIZE:0 rq2_wptr, input ADDRSIZE:0 wptr, input rclk, rrst_n); reg ADDRSIZE

13、:0 rq1_wptr; always (posedge rclk or negedge rrst_n) if (!rrst_n) rq2_wptr,rq1_wptr <= 0; else rq2_wptr,rq1_wptr <= rq1_wptr,wptr;Endmodule1.4.4 子模块rptr_empty这个子模块的输入包括:读使能信号(rinc)、读时钟(rclk)、读复位信号(rrst_n,低电平有效)。输出包括:读寻址指针(raddr)、读比较指针(rptr)。其中读寻址指针为二进制码,读比较指针为格雷码,且读寻址指针比读比较指针少一位。可以参照图1.4,相关的代码

14、如下: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; always (posedge rclk or negedge rrst_n) if (!rrst_n) rbin, rptr

15、<= 0; else rbin, rptr <= rbinnext, rgraynext; / Memory read-address pointer (okay to use binary to address memory) assign raddr = rbinADDRSIZE-1:0; assign rbinnext = rbin + (rinc & rempty); assign rgraynext = (rbinnext>>1) rbinnext; /- / FIFO empty when the next rptr = synchronized w

16、ptr or on reset /- assign rempty_val = (rgraynext = rq2_wptr); always (posedge rclk or negedge rrst_n) if (!rrst_n) rempty <= 1'b1; else rempty <= rempty_val;endmodule1.4.5 子模块rptr_empty这个子模块的输入包括:写使能信号(winc)、写时钟(wclk)、写复位信号(wrst_n,低电平有效)。输出包括:写寻址指针(waddr)、写比较指针(wptr)。其中读寻址指针为二进制码,读比较指针为格雷

17、码,且读寻址指针比读比较指针少一位。可以参照图1.4,相关的代码如下:module 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 pointer always (posed

18、ge 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 = wbinADDRSIZE-1:0; assign wbinnext = wbin + (winc & wfull); assign wgraynext = (wbinnext>>1) wbinnext;

19、/- / Simplified version of the three necessary full-tests: / assign wfull_val=(wgnextADDRSIZE !=wq2_rptrADDRSIZE ) && / (wgnextADDRSIZE-1 !=wq2_rptrADDRSIZE-1) && / (wgnextADDRSIZE-2:0=wq2_rptrADDRSIZE-2:0); /- assign wfull_val = (wgraynext=wq2_rptrADDRSIZE:ADDRSIZE-1, wq2_rptrADDRSI

20、ZE-2:0); always (posedge wclk or negedge wrst_n) if (!wrst_n) wfull <= 1'b0; else wfull <= wfull_val;endmodule1.4.6 顶层模块afifo这个顶层模块,主要完成5个子模块例化和互联。可以参照图1.1,相关的代码如下:module afifo #(parameter DSIZE = 8, parameter ASIZE = 4) (output DSIZE-1:0 rdata, output wfull, output rempty, input DSIZE-1:0

21、 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 sync_r2w (.wq2_rptr(wq2_rptr), .rptr(rptr), .wclk(wclk), .wrst_n(wrst_n); sync_w2r sync_w2r (.rq2_wptr(rq2_wptr), .wptr(wptr), .rclk(rclk), .rrst_n(rrst_n)

22、; fifomem #(DSIZE, ASIZE) fifomem (.rdata(rdata), .wdata(wdata), .waddr(waddr), .raddr(raddr), .wclken(winc), .wfull(wfull), .wclk(wclk); rptr_empty #(ASIZE) rptr_empty (.rempty(rempty), .raddr(raddr), .rptr(rptr), .rq2_wptr(rq2_wptr), .rinc(rinc), .rclk(rclk), .rrst_n(rrst_n); wptr_full #(ASIZE) wp

23、tr_full (.wfull(wfull), .waddr(waddr), .wptr(wptr), .wq2_rptr(wq2_rptr), .winc(winc), .wclk(wclk), .wrst_n(wrst_n); endmodule1.5 用modelsim仿真FIFO 编写测试代码根据前面的顶层模块afifo,编写测试代码如下:timescale 1ns/1nsmodule test; reg 7:0 wdata; reg winc; reg wclk; reg wrst_n; reg rinc; reg rclk; reg rrst_n; wire 7:0 rdata;

24、wire wfull; wire rempty; integer i; always begin #50 wclk = 1; #50 wclk = 0; end always begin #100 rclk = 1; #100 rclk = 0; end initial begin wrst_n = 0; rrst_n = 0; rinc = 0; winc = 0; wclk = 0; rclk = 0; wdata = 0; i = 0; #400; wrst_n = 1; rrst_n = 1; for (i = 0; i < 16; i = i + 1) begin repeat

25、 (1) (posedge wclk) #20 winc = 1; wdata = i; end repeat (1) (posedge wclk) #20 winc = 0; for (i = 0; i < 16; i = i + 1) begin repeat (1) (posedge rclk) #20 rinc = 1; end repeat (1) (posedge rclk) #20 rinc = 0; end afifo afifo (.rdata(rdata), .wdata(wdata), .wclk(wclk), .rclk(rclk), .wrst_n(wrst_n

26、), .rrst_n(rrst_n), .wfull(wfull), .rempty(rempty), .winc(winc), .rinc(rinc) );endmodule1.5.2仿真波形当写时钟(wclk)和读时钟(rclk)的周期相同,且都为50ns时,波形如下:图1.5 仿真波形-读写时钟的周期都为50ns当写时钟(wclk)周期为100ns,读时钟(rclk)周期为50ns时,波形如下:图1.6 仿真波形-读/写时钟的周期都为50ns/100ns当写时钟(wclk)周期为50ns,读时钟(rclk)周期为100ns时,波形如下:图1.6 仿真波形-读/写时钟的周期都为100ns/

27、50ns仿真结果根据前面的3种仿真波形,可以看出所设计的FIFO,能满足功能要求。1.6 用DC对FIFO进行综合编写DC的启动文件#.synopsys_dc.setup for afifo#modified by He Zhongzhu#June 22nd, 2011set search_path ". $search_path lib rtl scripts mapped unmapped"set target_library "tt_1v20_25c.db" set link_library " * $target_library dw_

28、foundation.sldb"set symbol_library " smic13g.sdb "#set synthesis_library "dw_foundation.sldb standard.sldb"set cache_write /set cache_read $cache_write# specify directory for intermediate files from analyzedefine_design_lib DEFAULT -path ./analyzed# suppress Driving cell war

29、ningsuppress_message UID-401 DDB-24set verilogout_no_tri truedefine_name_rules BORG -allowed A-Za-z0-9_ -first_restricted "_" -last_restricted "_" -max_length 30set verilogout_no_tri true# specify variblesset dw_prefer_mc_inside trueset sh_enable_line_editing true编写DC的约束文件#top.con for afifo#created by zzhe#June 22th, 2011reset_design#create_clock -period 5 -name vclk;#virtual clockcreate_clock -period 0.9 get_ports wclkcreate_clock -period 0.9 get_ports rclk#set_uncertain_delay -setup get_clocks vclk#set_clock_latency -source -max get_clocks vclk#set_clock_transi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论