同步FIFO设计详解及代码分享_第1页
同步FIFO设计详解及代码分享_第2页
同步FIFO设计详解及代码分享_第3页
同步FIFO设计详解及代码分享_第4页
同步FIFO设计详解及代码分享_第5页
已阅读5页,还剩2页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

同步FIFO设计详解及代码分享1.FIFO简介FIFO(先入先出,FirstInFirstOut)存储器,在FPGA和数字IC设计中非常常用。根据接入的时钟信号,可以分为同步FIFO和异步FIFO。**FIFO底层基于双口RAM**,同步FIFO的读写时钟一致,异步FIFO读时钟和写时钟不同。同步时钟主要应用于速率匹配(数据缓冲),类似于乒乓存储提高性能的思想,可以让后级不必等待前级过多时间;异步FIFO主要用于多bit信号的跨时钟域处理。本文讨论同步FIFO的结构及控制逻辑设计,并给出代码。2.同步FIFO接口对于同步FIFO,包含必要的接口如下图所示:(1)clk:时钟信号,读写共用;(2)rst_n:复位信号,视具体设计和芯片采用同步复位还是异步复位,此处默认使用异步低电平复位;(3)wdata:写数据信号,信号后带“\\”表示是多bit信号;(4)rdata:读数据信号,信号后带“\\”表示是多bit信号;(5)wfull:满信号,指示FIFO写满了,不能再写了,如果再写会覆盖掉还没读出的写入数据,造成数据丢失;(6)rempty:空信号,指示FIFO读空了,不能在读了,如果再读相当于有的数据重复读了第二遍,造成数据错误;(7)winc:写使能信号,写使能有效时表示希望能写入数据;(8)rinc:读使能信号,读使能有效时表示希望能读出数据;3.双口RAM接口在实现FIFO时,无论是同步FIFO还是异步FIFO,通常会通过双口RAM(DualPortRAM)并添加一些必要的逻辑来实现。双口RAM的接口如下图所示。**左侧全部是写时钟域的,包括写时钟、写数据、写地址和写使能信号;**右侧全部是读时钟域的,包括读时钟、读数据、读地址和读使能信号;4.基于双口RAM的同步FIFO结构根据同步FIFO的接口和双口RAM的接口,在借助双口RAM实现同步FIFO时,如下图所示结构,只需要加入读、写控制逻辑即可。在写逻辑中,用于产生写地址和写满信号;在读逻辑中,用于产生读地址和读空信号。读写控制逻辑还需要受到读写使能信号的控制。5.读写地址产生逻辑读写地址什么时候能够递增?显然,对于写地址必须满足:(1)写使能有效(要写入);(2)没写满(能写入);即:always@(posedgeclkornegedgerst_n)beginif(~rst_n)beginwaddr<='b0;endelsebeginif(winc&&~wfull)beginwaddr<=waddr+1'b1;endelsebeginwaddr<=waddr;endendend对于读地址必须满足:(1)读使能有效(要读出);(2)没读空(能读出);即:always@(posedgeclkornegedgerst_n)beginif(~rst_n)beginraddr<='b0;endelsebeginif(rinc&&~rempty)beginraddr<=raddr+1'b1;endelsebeginraddr<=raddr;endendend6.空满信号产生逻辑搞定了读写地址的控制逻辑,还差最后一步也是最关键的信号:空满信号如何产生。空:读空,读地址追上写地址;满:写满,写地址追上读地址。问题来了:怎么判地址断追上了呢?如果地址相等那应该是追上了,即raadr==waddr或者wddr==raddr。如果按照这种判断,显然这两个地址追上对方的判断是等效的,无法区分出来到底是写追上读还是读追上写。可以考虑:使用1个标志位flag来额外指示写追上读还是读追上写。参考前人的文献,判断空满的方式有多种,非常常用的一种是CliffordE.Cummings文章中提到的扩展1bit的读写地址方法,也就是说,将前面提到的flag指示信号和原本N位的读写地址结合,使用N+1位的读写地址,其中最高位用于判断空满信号,其余低位还是正常用于读写地址索引。以一个4深度的FIFO实例来说明,4深度原本需要2bit的读写地址,现在扩展成3bit。使用低2位来进行双口RAM的地址索引,高位用于判断空满。对于空信号,可以知道当FIFO里没有待读出的数据时产生。**也就是说,此时读追上了写,把之前写的数据刚刚全部都出,读地址和写地址此时指向相同的位置,读地址-写地址=0**,即raddr==waddr对于写满信号,**当写入后还没被读出的数据恰好是FIFO深度的时候,产生满信号,即写地址-读地址=FIFO深度=4**。对照下图可以发现,此时对于双口RAM的2bit的地址来说,读写地址一致;对于最高位来所,写是1而读是0。再考虑下图所示的一种情况,写入待读出的数据仍然是4个,此时也是4深度的FIFO已经满了。读写地址的低位相同,高位是写0读1。对于写满的2种情况,总结下来,都是低位相同,最高位相反。即:raddr[N]==~waddr[N]raddr[N-1:0]==waddr[N-1:0]也就是:raddr=={~waddr[N],waddr[N-1:0]}所以,空满逻辑产生的代码为:always@(posedgeclkornegedgerst_n)beginif(~rst_n)beginwfull<='b0;rempty<='b0;endelsebeginwfull<=(raddr=={~waddr[ADDR_WIDTH],waddr[ADDR_WIDTH-1:0]});rempty<=(raddr==waddr);endend7.全部代码`timescale1ns/1ns/****************************///FPGA探索者/****************************/modulesfifo#(parameterWIDTH=8,parameterDEPTH=16)(inputclk,inputrst_n,inputwinc,inputrinc,input[WIDTH-1:0]wdata,outputregwfull,outputregrempty,outputwire[WIDTH-1:0]rdata);//用localparam定义一个参数,可以在文件内使用localparamADDR_WIDTH=$clog2(DEPTH);reg[ADDR_WIDTH:0]waddr;reg[ADDR_WIDTH:0]raddr;always@(posedgeclkornegedgerst_n)beginif(~rst_n)beginwaddr<='b0;endelsebeginif(winc&&~wfull)beginwaddr<=waddr+1'b1;endelsebeginwaddr<=waddr;endendendalways@(posedgeclkornegedgerst_n)beginif(~rst_n)beginraddr<='b0;endelsebeginif(rinc&&~rempty)beginraddr<=raddr+1'b1;endelsebeginraddr<=raddr;endendendalways@(posedgeclkornegedgerst_n)beginif(~rst_n)beginwfull<='b0;rempty<='b0;endelsebeginwfull<=(raddr=={~waddr[ADDR_WIDTH],waddr[ADDR_WIDTH-1:0]});rempty<=(raddr==waddr);endend//带有parameter参数的例化格式dual_port_RAM#(.DEPTH(DEPTH),.WIDTH(WIDTH))dual_port_RAM_U0(.wclk(clk),.wenc(winc),.waddr(waddr[ADDR_WIDTH-1:0]),.wdata(wdata),.rclk(clk),.renc(rinc),.raddr(raddr[ADDR_WIDTH-1:0]),.rdata(rdata));endmodule/**************RAM子模块*************/moduledual_port_RAM#(parameterDEPTH=16,parameterWIDTH=8)(inputwclk,inputwenc,input[$clog2(DEPTH)-1:0]waddr//深度对2取对数,得到地址的位宽。,input[WIDTH-1:0]wdata//数据写入,inputrclk,inputrenc,input[$clog2(DEPTH)-1:0]ra

温馨提示

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

评论

0/150

提交评论