新闻中心

EEPW首页 > EDA/PCB > 设计应用 > 基于Verilog HDL的异步FIFO设计与实现

基于Verilog HDL的异步FIFO设计与实现

作者:山东大学 | 信息科学与工程学院 魏 芳 刘志军 马克杰时间:2008-05-26来源:电子技术应用

  通过比较读写指针ptr以及读写指针的最高两位 进行判断,产生两个的空/满标志信号(aempty/afull)送入读写模块进行同步,最后向外部输出两个同步的空/满信号(rempty/wfull)。空/满信号的产生过程:如图5所示,对于深度是2n的,按照其读指针rptr[n:0]和写指针wptr[n:0]最高两位的不同取值,可把地址空间分为四个像限[4]。当写指针比读指针落后一个像限时,意味着写指针即将从后面追上读指针,处于“可能将满”状态,在图6所示的空满信号产生逻辑框图中声明一个 direction信号并把它置为1;当读写指针完全相等并且direction为1时,则处于满状态并且把满信号afull置为0(低电平有效);当读指针比写指针落后一个像限时,意味着读指针即将追上写指针,FIFO处于“可能将空”状态,或者当写操作复位信号wrst有效时,再进行读操作,则FIFO也处于“可能将空”状态,此时把direction信号置为0;当读写指针完全相等并且direction为0时,则FIFO处于空状态,空标志信号aempty置为0。

本文引用地址:http://www.eepw.com.cn/article/83024.htm

        

       
  读写地址异步相比较产生低电平有效的空/满标志,其中异步满信号(afull)要同步到写时钟域 (wclk),异步空信号(aempty)要同步到读时钟域(rclk),以消除的影响,并向外界输出同步的空/满信号。下面以满信号 (wfull)为例说明同步信号的产生过程:满信号afull是因为写地址追上了读地址并比读地址多循环一次所产生,此时不能再向FIFO中写入数据,否则会造成FIFO写溢出。由于写地址(wptr)的变化产生FIFO满标志afull,即afull的下降沿与wptr同属于写时钟域。当读地址增加时,表明已经从FIFO中读走了一个数据,afull由有效的低电平变为无效的高电平,即afull的上升沿与rptr同属于读时钟域。可见,afull由高变低与写时钟(wclk)同步,而由低变高则与读时钟(rclk)同步。由于满标志afull只影响FIFO的写入,故将其同步到写时钟域。如图6所示,采用双锁存器法将afull过渡到写时钟域,最后得到的满信号wfull就属于写时钟域。同理可以得到空标志信号rempty。用Verilog代码实现如下:
  wire dirset=~((wptr[n]^rptr[n-1]) & ~(wptr[n-1]^rptr[n]));
  wire dirrst=~((~(wptr[n]^rptr[n-1]) & (wptr[n-1]^rptr[n])) |~wrst);
  always @(posedge high or negedge dirset or negedge dirrst)
  if (!dirrst) direction <= 1′b0;
  else if (!dirset) direction <= 1′b1;
  else direction <= high;
  assign aempty=~((wptr==rptr) && !direction);
  assign afull=~((wptr==rptr) && direction);
  always @(posedge rclk or negedge aempty)
  if (!aempty) {rempty,rempty2} <= 2′b11;
  else {rempty,rempty2} <= {rempty2,~aempty};
  always @(posedge wclk or negedge afull)
  if (!afull) {wfull,wfull2} <= 2′b11;
  else {wfull,wfull2} <= {wfull2,~afull };

  异步比较法的关键是用异步比较结果的信号的下降沿作为最终比较结果的复位信号,而其上升沿则用传统的双锁存器法进行同步[5]。最终得到的信号的上升沿与下降沿都属于同一个时钟域。与传统的先将地址信号同步再进行同步比较的方法相比,异步比较法避免了使用大量的同步寄存器,而效率则更高,实现也更简单。

  2.3 保守的空/满标志

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

  虽然空/满标志的设置是保守的,但这并不影响FIFO功能的正确性,经验证保守的空/满标志能够满足FIFO的设计要求。

  3 仿真验证和综合

  根据以上分析,以深度为16、数据宽度为8位的异步FIFO为例,用编写了各个模块,并采用Synopsys公司的仿真工具VCS进行了仿真验证。设写时钟(wclk)周期为100MHz,读时钟(rclk)周期为 133MHz,FIFO写、读时序仿真结果分别如图7、图8所示。当FIFO写满时,满标志wfull马上由0变1,禁止写数据并且写地址也不再增加, FIFO只读不写;当FIFO读空时,空标志rempty马上由0变1,禁止读数据并且读地址也不再增加,FIFO只写不读。空/满信号的变化情况满足设计要求。

        

  仿真验证通过后,采用Synopsys公司的Design Compiler工具进行综合。把采用异步比较法设计的FIFO与传统的先将地址信号同步再进行比较设计的FIFO相比较,在中芯国际0.35μm库上 DC综合结果如表1所示。可见相对于传统的异步FIFO,改进后的异步FIFO电路速度快、面积小,从而降低了功耗,提高了系统的稳定性。

       

  为了解决数据在不同时钟域间传递所产生的问题,本文讨论了一种新颖的异步FIFO设计方案。采用以及由顶向下的模块设计方法实现了这种方案。经验证该方案能安全地实现数据跨时钟域的传递,并且性能比传统方案有了明显的改善。

  参考文献

  1 Ciletti MD. Advanced digital design with the verilog HDL[M].影印版.北京:电子工业出版社,2004:1l5~ll9
  2 朱永峰,陆生礼,茆邦琴.SoC设计中的多时钟域处理[J].电子工程师,2003;(11):60~61
  3 Cummings C E, Alfke P. Simulation and synthesis techniques for asynchronous FIFO design with asynchronous pointer comparisons [Z]. SNUG, 2002;1~18
  4 Cummings C E. Synthesis and scripting techniques for designing multi-asynchronous clock designs[Z]. SNUG,2001:1~26
  5 杨宗凯.数字专用集成电路的设计与验证[M].北京:电子工业出版社,2004:214~225


上一页 1 2 下一页

评论

技术专区

关闭