位置:51电子网 » 技术资料 » 接口电路

一种新型异步FIFO的设计

发布时间:2008/5/28 0:00:00 访问次数:703

  摘要:本文详细说明了一种新型异步fifo的设计方法。该异步fifo的宽度为8位,深度为16,支持深度为1的buffer模式。水位可编程。它具有四种fifo状态,对于dma和中断的支持非常有用。

  关键词: 异步fifo;水位;verilog

引言

  fifo (先入先出队列)是一种在电子系统中得到广范应用的器件。fifo可以分为同步fifo和异步fifo。同步fifo只在一个时钟域里工作,比较简单。而异步fifo是工作在两个时钟域里的fifo。两个时钟域的频率和相位不同,在一个时钟域里向fifo写数据,在另一个时钟域里把fifo中的数据读走。本文设计的异步fifo包含buffer模式和水位可编程等新的想法,能够满足使用需求。

异步fifo的主要特性

  本文设计的异步fifo的深度为16,宽度为8位。可以根据具体的应用而改变。

  该异步fifo有两种工作模式:fifo模式和buffer模式。当fifo使能(fifo_en 置为1)时工作在fifo模式,当fifo不使能(fifo_en 置为0)时工作在buffer模式。在fifo模式时,fifo的深度为16;在buffer模式时,fifo的深度为1。增加buffer模式可以使该异步fifo的应用范围更加广泛,使用时更加灵活。

  该异步fifo的水位是可编程的,支持1/8,1/4,1/2,3/4和7/8五种水位。水位的具体含义是:当fifo中的数据量达到或超过水位时,fifo的状态为overmark。例如:在水位配置为1/2的情况下,当fifo中的数据个数大于或等于8(8为水位与fifo深度的乘积)时,fifo的状态为overmark。这样,dma就可以根据fifo的状态一次在fifo中取走一定量的数据。对于支持dma的外设,该项特性非常有用。

  该异步fifo在fifo模式下可以输出四种fifo状态,即fifo_empty、fifo_non_overmark、fifo_overmark和fifo_full。其中fifo_non_overmark是当fifo中的数据量低于水位时的fifo状态。在buffer模式下只有两种fifo状态,即fifo_empty和fifo_full。

异步fifo的接口设计

  wclk为写时钟,wreset_n为写时钟域里的复位信号,低电平有效。rclk为读时钟,rreset_n为读时钟域里的复位信号,低电平有效。write为写使能信号,高电平有效。read为读使能信号,高电平有效。empty和full为fifo的空满状态。water_level为fifo的水位。fifo_states为fifo的状态。wdata和rdata分别为写数据线和读数据线。

异步fifo模块的划分

  本文采用自顶向下的方法,将设计划分为5个模块:dpram模块、wctl模块,rctl模块、w2r模块和r2w模块。

  其中dpram模块、wctl模块和r2w模块在写时钟(wclk)域里;rctl模块和w2r模块在读时钟(rclk)域里。r2w模块和w2p模块为同步模块,r2w将读时钟域里的信号同步到写时钟域里,w2p将写时钟域里的信号同步到读时钟域里。

异步fifo的关键部分设计

空满状态的判断

  对于异步fifo来说,空满状态的设计非常重要。要防止在fifo已经满的情况下还对fifo进行写操作,同时也要注意不要在 fifo已经空的情况下还对其进行读操作。

  采用将写指针和读指针相比较的方法可以更有效地判断fifo的空满状态。写指针表示将要对fifo进行写操作的写地址,读指针表示正在对fifo进行读操作时的读地址。由于本fifo的深度为16,所以可以将写指针和读指针设计为5位的位宽。其中低四位表示地址,最高位表示状态。

  为了能更及时地显示fifo的空和满状态,设定在wctl模块进行满状态的判断,在rctl模块进行空状态的判断。将rctl模块输出的读指针rptr经r2w模块同步到写时钟域后为rptr_r2w,将rptr_r2w和wctl模块中的写指针比较,若两个指针的低四位相同而最高位不同,则fifo为满。将wctl的读指针wptr经w2r模块同步到读时钟域后为wptr_w2r,将wptr_w2r和rctl模块中的读指针比较,若两个指针相同,则fifo为空。

  rptr和wptr都用格雷码编码,由于相邻的两个格雷码之间只有一位不同,这样就可以避免在进行信号同步时,由于在同一个时钟沿有多个信号变化而引起的问题。

  由于同步后的rptr_r2w比rptr有一定的延时,同步后的wptr_w2r比wptr也有一定的延时。因此,不会出现在fifo已经满的情况下还对fifo进行写操作和在 fifo已经空的情况下还对其进行读操作的情况。

  判断fifo满的verilog代码如下:
parameter asize=4; //addr size
always @(rptr_bin or waddr_tmp)
  begin
   if((rptr_bin[asize-1:0]==waddr_tmp[asize-1:0]) &&(rptr_bin[asize]==(~waddr_tmp [asize])))
   full_temp =1'b1 ;
   else
   full_temp =1'b0 ;
   end

buffer模式下地址的控制

  当fifo_en为低电平时,fifo工作在buffer模式下,当此时写使能有效且fifo非满(读使能有效且fifo非空)时,只改变

  摘要:本文详细说明了一种新型异步fifo的设计方法。该异步fifo的宽度为8位,深度为16,支持深度为1的buffer模式。水位可编程。它具有四种fifo状态,对于dma和中断的支持非常有用。

  关键词: 异步fifo;水位;verilog

引言

  fifo (先入先出队列)是一种在电子系统中得到广范应用的器件。fifo可以分为同步fifo和异步fifo。同步fifo只在一个时钟域里工作,比较简单。而异步fifo是工作在两个时钟域里的fifo。两个时钟域的频率和相位不同,在一个时钟域里向fifo写数据,在另一个时钟域里把fifo中的数据读走。本文设计的异步fifo包含buffer模式和水位可编程等新的想法,能够满足使用需求。

异步fifo的主要特性

  本文设计的异步fifo的深度为16,宽度为8位。可以根据具体的应用而改变。

  该异步fifo有两种工作模式:fifo模式和buffer模式。当fifo使能(fifo_en 置为1)时工作在fifo模式,当fifo不使能(fifo_en 置为0)时工作在buffer模式。在fifo模式时,fifo的深度为16;在buffer模式时,fifo的深度为1。增加buffer模式可以使该异步fifo的应用范围更加广泛,使用时更加灵活。

  该异步fifo的水位是可编程的,支持1/8,1/4,1/2,3/4和7/8五种水位。水位的具体含义是:当fifo中的数据量达到或超过水位时,fifo的状态为overmark。例如:在水位配置为1/2的情况下,当fifo中的数据个数大于或等于8(8为水位与fifo深度的乘积)时,fifo的状态为overmark。这样,dma就可以根据fifo的状态一次在fifo中取走一定量的数据。对于支持dma的外设,该项特性非常有用。

  该异步fifo在fifo模式下可以输出四种fifo状态,即fifo_empty、fifo_non_overmark、fifo_overmark和fifo_full。其中fifo_non_overmark是当fifo中的数据量低于水位时的fifo状态。在buffer模式下只有两种fifo状态,即fifo_empty和fifo_full。

异步fifo的接口设计

  wclk为写时钟,wreset_n为写时钟域里的复位信号,低电平有效。rclk为读时钟,rreset_n为读时钟域里的复位信号,低电平有效。write为写使能信号,高电平有效。read为读使能信号,高电平有效。empty和full为fifo的空满状态。water_level为fifo的水位。fifo_states为fifo的状态。wdata和rdata分别为写数据线和读数据线。

异步fifo模块的划分

  本文采用自顶向下的方法,将设计划分为5个模块:dpram模块、wctl模块,rctl模块、w2r模块和r2w模块。

  其中dpram模块、wctl模块和r2w模块在写时钟(wclk)域里;rctl模块和w2r模块在读时钟(rclk)域里。r2w模块和w2p模块为同步模块,r2w将读时钟域里的信号同步到写时钟域里,w2p将写时钟域里的信号同步到读时钟域里。

异步fifo的关键部分设计

空满状态的判断

  对于异步fifo来说,空满状态的设计非常重要。要防止在fifo已经满的情况下还对fifo进行写操作,同时也要注意不要在 fifo已经空的情况下还对其进行读操作。

  采用将写指针和读指针相比较的方法可以更有效地判断fifo的空满状态。写指针表示将要对fifo进行写操作的写地址,读指针表示正在对fifo进行读操作时的读地址。由于本fifo的深度为16,所以可以将写指针和读指针设计为5位的位宽。其中低四位表示地址,最高位表示状态。

  为了能更及时地显示fifo的空和满状态,设定在wctl模块进行满状态的判断,在rctl模块进行空状态的判断。将rctl模块输出的读指针rptr经r2w模块同步到写时钟域后为rptr_r2w,将rptr_r2w和wctl模块中的写指针比较,若两个指针的低四位相同而最高位不同,则fifo为满。将wctl的读指针wptr经w2r模块同步到读时钟域后为wptr_w2r,将wptr_w2r和rctl模块中的读指针比较,若两个指针相同,则fifo为空。

  rptr和wptr都用格雷码编码,由于相邻的两个格雷码之间只有一位不同,这样就可以避免在进行信号同步时,由于在同一个时钟沿有多个信号变化而引起的问题。

  由于同步后的rptr_r2w比rptr有一定的延时,同步后的wptr_w2r比wptr也有一定的延时。因此,不会出现在fifo已经满的情况下还对fifo进行写操作和在 fifo已经空的情况下还对其进行读操作的情况。

  判断fifo满的verilog代码如下:
parameter asize=4; //addr size
always @(rptr_bin or waddr_tmp)
  begin
   if((rptr_bin[asize-1:0]==waddr_tmp[asize-1:0]) &&(rptr_bin[asize]==(~waddr_tmp [asize])))
   full_temp =1'b1 ;
   else
   full_temp =1'b0 ;
   end

buffer模式下地址的控制

  当fifo_en为低电平时,fifo工作在buffer模式下,当此时写使能有效且fifo非满(读使能有效且fifo非空)时,只改变

相关IC型号

热门点击

 

推荐技术资料

耳机放大器
    为了在听音乐时不影响家人,我萌生了做一台耳机放大器的想... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!