1、基于 FPGA 的异步 FIFO设计与实现Asynchronous FIFO Design and Implementation Based on FPGA(1.清华大学电子工程系;2.中国科学院电子学研究所)熊红兵 1 陈琦 2Xiong,Hongbing Chen,Qi 摘要:异步 FIFO 是用来适配不同时钟域之间的相位差和频率飘移的重要模块。本文设计的异步 FIFO 采用了格雷(GRAY)变换技术和双端口 RAM 实现 了不同时钟域之间的数据无损传输。该结构利用了 GRAY 变换的特点,使得整个系统可靠性高和抗干扰能力强,系统可以工作在读写时钟频率漂移达到正负 300PPM 的恶劣环境
2、。并且由于采用了模块化结构,使得系统具有良好的可扩充性。关键字:FIFO;双口 RAM;格雷码;指针解释;指针生成Abstract:Asynchronous FIFO is an important module which always used to absorb the phase and frequency offset between different clock domain in communication area .In this paper, an FIFO module is designed using Gray convert technology and dual
3、-port ram , which realizing scatheless transmit between different clock domain. The advances of Gray (Only one bit changes between neighboring two clock ) improves the reliability and anti-jamming capability of the system. And the system can work normally in the bad condition which the phase and fre
4、quency offset target to 300PPM. It is proved by work that the FIFO module can fulfill the demands of real-time of data transmitting system, and the module is powerful enough for more data process in the future.Key wards:FIFO;Dual-port RAM;Gray;Pointer interpreter;Pointer generator1引言FIFO(先进先出队列)是一种在
5、电子系统得到广泛应用的器件,通常用于数据的缓存和用于容纳异步信号的频率或相位的差异。该器件用在 SDH 设备上时,处于指针解释和指针生成之间,用来缓冲数据流,以实现不同时钟速度的匹配。经过指针解释(PI)的净荷数据流进入 FIFO 中,包括 8 位数据位和一位 J1 字节标志位;指针生成(PG)部分根据 PG部分的 payload 信号将数据从 FIFO 读出,并生成新的指针。FIFO 可以根据其内部数据的空满程度,决定是否向 PG 发出正/负调整申请信号。FIFO 主要实现如下功能: 处理 AU3 级数据流的缓冲; 提供级联模式; 给出指针正/负调整申请信号,阈值可设; 可以插入 full
6、scan,保证较高的可测试性。2 FIFO 工作原理 产 生 写地 址写 时 钟wck6双 端 口存 储 器写 数 据 读 数 据 读 时 钟rck6读 控 制写 控 制写 地 址 读 地 址空 /满 标 志产 生 逻 辑格 雷变 换写 地 址 同 步读 地 址 同 步读 时 钟rck6写 时 钟w 格 雷 反变 换 空 /满 判 决正 负 调 整软 硬 判 决 nj_hrqsFIO复 位 信 号 复 位复 位空 /满 标 志产 生 逻 辑 pFIO复 位 信 号产 生 写地 址图 1 FIFO 工作原理示意图2FIFO 的工作原理可用图 1 来表示。整个系统分为两个完全独立的时钟域,即读时钟
7、域和写时间域。FIFO 的存储介质为一块双端口 RAM,FIFO 深度为 64 个字节。可以同时进行读写操作。为避免对同一个地址进行读写操作,复位或者溢出时将读写地址错开。由图 1可以看出,写地址产生模块根据写时钟和写有效信号产生递增的写地址,读地址产生模块根据读时钟和读有效信号产生递增的读地址。FIFO 的操作如下:在写时钟 wr_clk 的升沿,当 wren 有效时,将 wr_data 写入双口 RAM 中写地址对应的位置中;始终将读地址对应的双口 RAM 中的数据输出到读数据总线上。这样就实现了先进先出的功能。由于空标志和满标志控制了 FIFO 的操作,因此标志错误会引起操作的错误。如上
8、所述,标志的产生是通过对读写地址的比较产生的,当读写时钟完全异步时,对读写地址进行比较时,可能得出错误的结果。例如,在读地址变化过程中,由于读地址的各位变化并不同步,计算读写地址的差值,可能产生错误的差值,导致产生错误的满标志信号。若将未满标志置为满标志时,可能降低了应用的性能,降低写数据速率;而将满置标志置为未满时,执行一次写操作,则可能产生溢出错误,这对于实际应用来说是绝对应该避免的。空标志信号的产生也可能产生类似的错误。从以上分析中可以看出,异步 FIFO 之所以会发生错误是国为在地址变化时,由于多位地址各位变化时间不同,异步时钟对其进行采样时数值可能为不同于地址变化丧后数值的其他值,异
9、步产生错误的空标志和满标志,以致于产生 FIFO 的操作错误。格雷码是一种在相邻计数值之间只有一位发生变化的编码方式。可以看出,若读写地址采用格雷码编码方式,就可以解决上面的问题。在空/满标志产生部分,采用格雷变换技术先把写地址进行格雷变换后同步到读侧时钟域,进行格雷反变换后,和读地址进行相互比较,产生正负、软硬判决。产生软硬正负调整信号,送往指针生成部分。该系统的技术特点主要有两点:1 是支持级联模式;2 是利用格雷码产生 FIFO 数据深度及判断是否溢出的电路。因为支持级联模式,所以级联地址在到达该模块是可能已经经过了很长时间,这样直接读写 RAM 将无法保证读写是否正确。所以在读写地址确
10、定后,需要再由时钟同步一拍,再送给 RAM 做为读写地址。利用格雷码产生 FIFO 数据深度时,需要注意的是 waddr_s 在 wck6 时钟域内转换成格雷码,之后直接由 rck6 把该格雷码同步到 rck6 时钟域,之后再反变换成正常的二进制地址与读地址进行比较。3硬件电路设计 wadr_out PIG_FORAMRAM写 地址 的 产 生逻 辑 RAM读 地址 的 产 生逻 辑FIO深 度 的 产 生 逻 辑 和 调 整 申 请 信 号 的产 生 逻 辑wadr_in rad_inpylo ewadr_srad_sj1_outnhrqj_sphrqj_s esck6ck6wck6 rck
11、6dinj1_doutj1_master mastrad_out图 2 R_FIFO 模块框图硬件电路设计框图如图 2 所示。该模块的逻辑部分主要有 3 部分,即:RAM 写地址的产生逻辑,RAM 读地址的产生逻辑,FIFO 数据深度的产生逻辑及调整申请逻辑。3.1 RAM 写地址的产生逻辑主要功能是根据从 PI 来的 pi_payload 信号(接该模块的 payload pin)生成写 RAM的本地地址,再根据 master 信号判断是否是及联模式,如果该数据流是主,则写 RAM 的地3址采用本地地址,如果该数据流是从,则写 RAM 的地址采用级联输入的地址 waddr_in。地址在提供给
12、 RAM 之前需要在由 wck6 同步一次。3.2 RAM 读地址的产生逻辑主要功能是根据从 PG 来的 pg_payload 信号(接该模块的 rden pin)生成读 RAM 的本地地址,再根据 master 信号判断是否是及联模式,如果该数据流是主,则读 RAM 的地址采用本地地址,如果该数据流是从,则读 RAM 的地址采用级联输入的地址 raddr_in。地址在提供给 RAM 之前需要在由 rck6 同步一次。3.3 FIFO 数据深度的产生逻辑及调整申请逻辑主要功能是根据提供给 RAM 的读写地址来判断 FIFO 中存储的字节个数,进而得到调整申请信号和溢出信号 ESE。具体过程是先
13、将 RAM 的写地址 waddr_s 通过格雷码从 wck6 时钟域转换到 rck6 时钟域。因为转换过程中,用了将近 2 个时钟周期,所以转换后的写地址需要与同步 2 次后的读地址比较,得到 FIFO 的深度。因为在两个时钟域之间进行转换,毕竟会有一定的时间误差,所以在判断 FIFO 是否溢出时,是只要 FIFO 深度为 0、1、62 或 63就认为 FIFO 已经溢出(FIFO 的总深度是 64 个字节) 。同时产生与 rck6 同步的 ESE 信号,用来复位 RAM 读地址的产生逻辑。同时利用该信号产生足够宽的同步复位信号去复位 RAM写地址的产生逻辑。当 FIFO 内的数据个数超过阈值
14、时,将产生 PG 指针调整的申请信号。下面的表格表明Esd 是如何控制调整阈值的。表 1 esd 阈值调整表Esd1:0 pj_h_num pj_s_num nj_s_num nj_h_num00 8 8 55 5501 10 10 53 5310 12 20 43 5111 14 26 37 49其中表内各信号定义为: 当 FIFO 内数据个数小于 pj_s_num 时,pipg_fifo 将申请 PG 进行软正调整,PG 将以每16 帧 1 次的速率产生正调整; 当 FIFO 内数据个数小于 pj_h_num 时,pipg_fifo 将申请 PG 进行硬正调整,PG 将以每4 帧 1 次的
15、速率产生正调整; 当 FIFO 内数据个数大于 nj_s_num 时,pipg_fifo 将申请 PG 进行软负调整,PG 将以每16 帧 1 次的速率产生负调整; 当 FIFO 内数据个数大于 nj_h_num 时,pipg_fifo 将申请 PG 进行硬负调整,PG 将以每4 帧 1 次的速率产生负调整。3.4 PIPG_FIFO_RAMPING_FIFO_RAM 为双口同步 RAM,其特点为 A64 字节深,9 位宽。具有写/读同步时钟WCLK/RCLK;高有效的写允许信号 WEN;相互独立的读写地址 AW/AR。PING_FIFO_RAM 的特性是 当 WEN1 时,WCLK 上升沿将
16、 D 上的数据写入 AW 对应的地址中。当 WEN0 时,禁止写入数据。每一个 RCLK 上升沿将 AR 地址中的数据读出到 Q 上。如果厂家的 RAM 有读允许信号,则应该将该信号始终置为有效。这样,使用者可以根据厂家 RAM 的实际情况,将其RAM 整合成 PING_FIFO_RAM 的这种特性。4软件设计系统的设计代码如下,采用 Verilog 语言设计。需要注意的是,在确定 FIFO 深度时,需要使用格雷码将写地址在两个时钟域之间进行转换,在转换过程中,注意将 wck6 时钟域的地址转换成格雷码后,应直接被 rck6 同步到 rck6 时钟域中,再进行格雷码的反变换,这样才能保证地址转
17、换的正确性。这是有别于传统的采用格雷码技术设计异步 FIFO 的关键技术。其中,产生 FIFO 数据深度的逻辑代码如下:4/*/ Elastic store deptch control /*always (esd) begincase (esd)2b00:beginpj_h_num=6d8;pj_s_num=6d8;nj_h_num=6d55;nj_s_num=6d55;end2b01:beginpj_h_num=6d10;pj_s_num=6d10;nj_h_num=6d53;nj_s_num=6d53;end2b10:beginpj_h_num=6d12;pj_s_num=6d20;nj
18、_h_num=6d51;nj_s_num=6d43;enddefault:beginpj_h_num=6d14;pj_s_num=6d26;nj_h_num=6d49;nj_s_num=6d37;endendcaseend利用 Candence 的 Verilog3.3 工具对代码进行仿真,功能完全正确。要注意的是,在对两个地址进行比较时,需要将转换到 rck6 时钟域的写地址与同步 2 拍后的读地址比较,得到 FIFO 的字节深度。在判断 FIFO 是否溢出时,是只要 FIFO 深度为 0、1、62 或 63 就认为 FIFO 已经溢出。5结束语为解决 FIFO 的异步操作问题,本文提出了一
19、种利用格雷码对地址进行编码的异步FIFO 的设计,并采用 Verilog 语言进行电路设计,该电路软件仿真和硬件实现已经通过验证,并被应用到芯片设计中。实践证明它可以解决由于异步产生的错误,同时增加了应用灵活性。能满足300PPM 的频漂下的 AU3 数据流的缓冲要求。5参考文献1 韦乐平,“同步光传输网络”,第二版,人民邮电出版社,1998.2 ITU_T Rec.G.783,“Characteristics of synchronous digital hierarchy (SDH)equipment functional blocks”,04/1997.3 ITU_T Rec.G.707
20、,“Network Node Interface for the synchronous digital hierarchy (SDH)”,10/2000.4 陈晓华、熊红兵、张志伟等,“ZX2513设计方案”.作者简介:熊红兵(1967),男,汉族,硕士研究生,研究方向为集成电路设计和信号处理。Email:;陈琦(1979) ,男,汉族,博士研究生,研究方向为合成孔径雷达信号处理。Email:chenq_;Resume:Xiong Hongbing,male,born in 1967,master,majoring in IC design and signal processing.Chenqi,male,born in 1979,doctor,majoring in SAR signal processing.(100084 清华大学电子工程系)熊红兵(100080 中国科学院电子学研究所)陈琦 (Electronic Engineering Department,QingHua University,100084)Xiong,Hongbing(Institude of Electronics,Chinese Academy of Sciences, 100080)Chen,Qi通讯地址:(528000 深圳市南山区后海路招商名仕花园 1 栋 4 单元 608)熊红兵