棋子 · 2023年08月21日

跨时钟设计:异步FIFO设计

1、异步FIFO

在ASIC设计或者FPGA设计中,我们常常使用异步fifo(first in first out)(下文简称为afifo)进行数据流的跨时钟,可以说没使用过afifo的Designer,其设计经历是不完整的。废话不多说,直接上接口信号说明。

2、afifo接口信号说明  

如下表格为常见的afifo接口信号,非必须指的部分场景的afifo可能不存在此信号。不同公司对afifo接口的设计可能不一样,但是基本都包含了如下接口:wr表示write,写侧时钟域信号,rd表示read,读侧时钟域信号。

image.png

3、设计原理

为了方便描述,本章节将以深度为8的afifo进行讲解,其中读写地址位宽为3,格雷码地址位宽为4。

image.png

图1 afifo结构图(来自eetop ThinkSpark)

image.png
image.png

图2:读写地址计算图

(1)存储模块:  

中间区域为memory存储模块,用于存储数据data,要么是1R1W的ram,要么是普通的寄存器。项目自研代码中,存储模块通常使用1R1W的ram,其需要memory生成器生成,需要与制造工艺匹配。而在soft IP中,针对小规格的afifo,为了方便,常常使用寄存器作为afifo的存储。

(2)写地址产生逻辑  

写地址waddr在wr_clk时钟域产生,有两个作用,作为存储模块的写地址并且产生格雷码waddr_gray。此种需要注意:waddr是递增的,且会翻转。如果afifo深度为8(n),则waddr位宽为3(log2(n) ),waddr计数到7后,再次写入则翻转为0。

(3)读地址产生逻辑  

读地址raddr在rd_clk时钟域产生,有两个作用,作为存储模块的读地址并且产生格雷码raddr_gray。此种需要注意:raddr是递增的,且会翻转。如果afifo深度为8(n),则raddr位宽为3(log2(n) ),raddr计数到7后,再次读出则翻转为0。

(4)读地址同步  

使用2级或者3级单bit同步器Synchronizer将读地址格雷码raddr_gray同步到wr_clk时钟域得到raddr_gray_sync,raddr_gray_sync进行格雷码逆转成二进制编码得到raddr_sync,用于产生将满信号和满信号。

在fpga设计中,2级单bit同步器Synchronizer就是2个串联的寄存器,在ASIC设计中,通常是定制的cell(会将两个/三个寄存器摆放靠得很近)。

(5)写地址同步器  

使用2级或者3级单bit同步器Synchronizer将写地址格雷码waddr_gray同步到rd_clk时钟域得到waddr_gray_sync,waddr_gray_sync进行格雷码逆转成二进制编码得到waddr_sync,用于产生将空信号和空信号。

(6)满信号产生逻辑  

此模块首先计算在wr_clk时钟域的剩余可写afifo深度,即wr_gap[3:0]=raddr_sync[2:0]+4’d8(FIFO深度)-waddr[2:0],然后根据wr_gap[3:0]产生amost_full和full信号

always @(posedge wr_clk or negedge wr_rst_n)
always @(posedge wr_clk or negedge wr_rst_n)

         

(7)空信号产生逻辑  

此模块首先计算在rd_clk时钟域的可读afifo深度,即assign {ovf_nc1,rd_gap} = waddr_sync - raddr,然后根据rd_gap[3:0]产生empty信号。

always @(posedge rd_clk or negedge rd_rst_n)

4、重点说明  

(1)格雷码的优势  

格雷码的特点就是在递增,递减,或者翻转过程中,只会有1个bit位发生变化。因此单bit同步器Synchronizer同步后,只有存在变化的那一个bit可能会发生亚稳态。即使发生了亚稳态,体现的结果要么是0,要么是1,在格雷码上的同步效果就是当前clk周期没有同步(相当于delay了一个目的周期)到或者当前周期已采样到。

同时它也有自己的局限性,那就是循环计数深度必须是2的n次幂(也可以不是2的n次幂哦),否则就失去了每次只变化一位的特性。深度为16的二进制及格雷码递变表如下:

image.png

(2)空信号计算方法的妙处  

在rd_clk时钟域计算可读数据量以及empty信号,看图2会发现,实际rd_gap永远小于等于真实可读数据量,能够保证empty为0时永远不会发生空读现象,即afifo没有数据,也进行了读操作。

(3)满信号计算方法的妙处  

在wd_clk时钟域计算可写数据量以及full信号,看图2会发现,实际wr_gap永远小于等于真实可写数据量,能够保证full为0时永远不会发生写溢出现象,即full为0时,afifo可能存在空闲位置。

(4)格雷码转二进制代码  

function       [ADDR_WIDTH:0]   gray2bin;    //to change the gray code to bin code

         

(5)二进制转格雷码  

always @(posedge rd_clk or negedge rd_rst_n)

5、结束语  

Afifo代码写出来还不够,还需要设置约束条件,后期我们会再讲讲afifo的格雷码如何约束。

作者:IC小鸽
文章来源:IC的世界

推荐阅读

更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
20186
内容数
1307
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息