一种新型异步fifo的设计

上传人:kms****20 文档编号:40228985 上传时间:2018-05-24 格式:DOC 页数:5 大小:42.50KB
返回 下载 相关 举报
一种新型异步fifo的设计_第1页
第1页 / 共5页
一种新型异步fifo的设计_第2页
第2页 / 共5页
一种新型异步fifo的设计_第3页
第3页 / 共5页
一种新型异步fifo的设计_第4页
第4页 / 共5页
一种新型异步fifo的设计_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《一种新型异步fifo的设计》由会员分享,可在线阅读,更多相关《一种新型异步fifo的设计(5页珍藏版)》请在金锄头文库上搜索。

1、一种新型异步一种新型异步 FIFO 的设计的设计摘要:摘要:本文详细说明了一种新型异步 FIFO 的设计方法。该异步 FIFO 的宽度为 8 位,深度为 16,支持深度为 1 的 buffer 模式。水位可编程。它具有四种 FIFO 状态,对于 DMA 和中断的支持非常有用。关键词关键词: 异步 FIFO;水位;Verilog 引言引言FIFO (先入先出队列)是一种在电子系统中得到广范应用的器件。FIFO 可以分为同步 FIFO和异步 FIFO。同步 FIFO 只在一个时钟域里工作,比较简单。而异步 FIFO 是工作在两个时钟域里的FIFO。两个时钟域的频率和相位不同,在一个时钟域里向 FI

2、FO 写数据,在另一个时钟域里把 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。增加

3、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 模式下可以输出四

4、种 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 为读使能信号,高电平有效。emp

5、ty 和 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 将写时钟域

6、里的信号同步到读时钟域里。 异步异步 FIFO 的关键部分设计的关键部分设计空满状态的判断空满状态的判断对于异步 FIFO 来说,空满状态的设计非常重要。要防止在 FIFO 已经满的情况下还对 FIFO 进行写操作,同时也要注意不要在 FIFO 已经空的情况下还对其进行读操作。采用将写指针和读指针相比较的方法可以更有效地判断 FIFO 的空满状态。写指针表示将要对 FIFO 进行写操作的写地址,读指针表示正在对 FIFO 进行读操作时的读地址。由于本 FIFO 的深度为 16,所以可以将写指针和读指针设计为 5 位的位宽。其中低四位表示地址,最高位表示状态。为了能更及时地显示 FIFO 的空和

7、满状态,设定在 WCTL 模块进行满状态的判断,在 RCTL 模块进行空状态的判断。将 RCTL 模块输出的读指针 rptr 经 R2W 模块同步到写时钟域后为 rptr_r2w,将 rptr_r2w 和 WCTL 模块中的写指针比较,若两个指针的低四位相同而最高位不同,则 FIFO为满。将 WCTL 的读指针 wptr 经 W2R 模块同步到读时钟域后为 wptr_w2r,将 wptr_w2r 和 RCTL模块中的读指针比较,若两个指针相同,则 FIFO 为空。rptr 和 wptr 都用格雷码编码,由于相邻的两个格雷码之间只有一位不同,这样就可以避免在进行信号同步时,由于在同一个时钟沿有多

8、个信号变化而引起的问题。由于同步后的 rptr_r2w 比 rptr 有一定的延时,同步后的 wptr_w2r 比 wptr 也有一定的延时。因此,不会出现在 FIFO 已经满的情况下还对 FIFO 进行写操作和在 FIFO 已经空的情况下还对其进行读操作的情况。判断 FIFO 满的 Verilog 代码如下:parameter ASIZE=4; /addr sizealways (rptr_bin or waddr_tmp)beginif(rptr_binASIZE-1:0=waddr_tmpASIZE-1:0) elsefull_temp =1b0 ; endBuffer 模式下地址的控制

9、模式下地址的控制当 fifo_en 为低电平时,FIFO 工作在 Buffer 模式下,当此时写使能有效且 FIFO 非满(读使能有效且 FIFO 非空)时,只改变写指针(或读指针)的最高位。这样就可以保证 FIFO 的深度为 1,像一个 8 位的寄存器一样。产生 FIFO 读地址的 Verilog 代码如下:always (waddr_tmp or full_temp or fifo_en or write)beginif(full_temp=1b0 else /in buffer modewaddr_next=waddr_tmp+ 5b1_0000; endelsewaddr_next=w

10、addr_tmp; endFIFO 状态的确定状态的确定除了空和满状态外,在 FIFO 模式下还有 FIFO_NON_OVERMARK 和 FIFO_OVERMARK两种状态。判断这两种状态主要是根据 FIFO 中的数据量和 FIFO 的水位来判断的。FIFO 中的数据量是通过写指针减去读指针得到的。先判断 FIFO 是否处于空或满的状态,然后再判断当 FIFO 中的数据量达到或超过水位时,FIFO 的状态为 FIFO_OVERMARK;当 FIFO 中的数据量低于水位时,FIFO 的状态为 FIFO_NON_OVERMARK。判断 FIFO 状态的 Verilog 代码如下:/compute

11、 the data number in fifoparameter ASIZE=4; /addr sizealways (rptr_bin or waddr_next)begindata_num=waddr_next ASIZE:0+(rptr_binASIZE:0)+1b1;endalways (water_level)begincase (water_level)3b000: data_water_level=4 b0010; /1/83b001: data_water_level= 4b0100; /1/43b010: data_water_level= 4b1000; /1/23b01

12、1: data_water_level= 4b1100; /3/43b100: data_water_level= 4b1110; /7/8 default:data_water_level=4b1000; /1/2endcaseend/set the fifo_statesalways (full_temp or empty_temp or data_num or data_water_level)beginif(empty_temp=1b1) fifo_states=FIFO_EMPTY;else if(full_temp=1b1) fifo_states=FIFO_FULL;else i

13、f(data_num = data_water_level) fifo_states=FIFO_OVERMARK;else fifo_states= FIFO_NON_OVERMARK; end同步模块的设计同步模块的设计设计中 W2R 模块和 R2W 模块为同步模块。把信号连续通过两个触发器可实现同步,这种同步方法十分简单,且准确性比较高。 仿真验证仿真验证本设计用 Mentor Graphics 公司的 ModelSim 进行仿真。当 FIFO 为空的时候,向 FIFO 连续写入 16 个数据,然后再将数据连续读出的仿真如图 3 所示。 结语结语本文讨论了一种异步 FIFO 的设计方法,它支持 Buffer 模式,水位可以编程,有四种 FIFO 状态。经验证,该异步 FIFO 能够安全地实现数据的跨时钟域传递,有数据缓冲作用,可以应用到UART、SPI 等通讯外设中

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号