0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

跨时钟设计:异步FIFO设计

sanyue7758 来源:IC的世界 2023-07-31 11:10 次阅读

1、异步FIFO

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

2、afifo接口信号说明

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

信号名称 位宽 必要性 含义
almost_full 1 非必须 将满信号,1表示afifo快满了,当afifo的有效数量大于配置时,置1
full 1 非必须 afifo满信号,1表示afifo已满
empty 1 非必须 1表示
rd_data [DATA_WIDTH-1:0] 必须 有效数据
ovf_int 1 非必须 1表示上溢出,即afifo满了还有数据写入
udf_int 1 非必须 1表示下溢出,即afifo空了外部逻辑还产生了读使能
data_count [ADDR_WIDTH:0] 非必须 afifo存储的数据量
cfg_almost_full_value [ADDR_WIDTH:0] 非必须 将满配置信号,一般由配置寄存器模块提供驱动
wr_rst_n 1 必须 写侧复位
wr_clk 1 必须 写侧时钟
wr_en 1 必须 写使能,1表示有数据写入
wr_data [DATA_WIDTH-1:0] 必须 写数据
rd_rst_n 1 必须 读时钟与复位
rd_clk 1 必须 读时钟
rd_en 1 必须 读使能

3、设计原理

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

7cc25bde-2ee5-11ee-815d-dac502259ad0.png

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

7cedfa82-2ee5-11ee-815d-dac502259ad0.png

7d12f972-2ee5-11ee-815d-dac502259ad0.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) if(~wr_rst_n) full <= 1'b0; else full <= (!(|wr_gap)) || ((wr_gap==1)&wr_en);
always @(posedge wr_clk or negedge wr_rst_n) if(~wr_rst_n) begin almost_full <= 1'b0; end else begin if( wr_data_cnt>=cfg_almost_full_value ) almost_full <= 1'b1; else almost_full <= almost_full; end

(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) if(~rd_rst_n) empty <= 1'b1; else empty <= (!(|rd_gap)) || ((rd_gap==1)&rd_en);

4、重点说明

(1)格雷码的优势

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

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

Binary Gray

0 0000 0000

1 0001 0001

2 0010 0011

3 0011 0010

4 0100 0110

5 0101 0111

6 0110 0101

7 0111 0100

8 1000 1100

9 1001 1101

10 1010 1111

11 1011 1110

12 1100 1010

13 1101 1011

14 1110 1001

15 1111 1000

0 0000 0000

(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 input [ADDR_WIDTH:0] gray_in; //input gray code reg [ADDR_WIDTH:0] gray_code; //reg gray reg [ADDR_WIDTH:0] bin_code; //bin code result integer i,j; //integer reg tmp; //tmp begin gray_code = gray_in; for(i=0;i<=ADDR_WIDTH;i=i+1) begin tmp=1'b0; for(j=i;j<=ADDR_WIDTH;j=j+1) tmp=gray_code[j]^tmp; bin_code[i]=tmp; end gray2bin= bin_code; end endfunction

(5)二进制转格雷码

always @(posedge rd_clk or negedge rd_rst_n) if(~rd_rst_n) raddr_gray <= {(ADDR_WIDTH + 1){1'b0}}; else raddr_gray <= raddr ^ {1'b0,raddr[ADDR_WIDTH:1]};

5、结束语

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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1620

    文章

    21474

    浏览量

    598081
  • asic
    +关注

    关注

    34

    文章

    1172

    浏览量

    119874
  • 接口
    +关注

    关注

    33

    文章

    8157

    浏览量

    149719
  • fifo
    +关注

    关注

    3

    文章

    382

    浏览量

    43342
  • 时钟
    +关注

    关注

    10

    文章

    1652

    浏览量

    130855

原文标题:

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于FPGA器件实现异步FIFO读写系统的设计

    异步 FIFO读写分别采用相互 异步的不同 时钟。在现代集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个 时钟,多
    发表于07-16 17:41 1161次阅读
    基于FPGA器件实现<b class='flag-5'>异步</b><b class='flag-5'>FIFO</b>读写系统的设计

    关于异步fifo的安全问题:

    由于,如果 异步 fifo的双口ram真的空了,而 时钟域延迟造成的rdempty仍然非空,则读 fifo的逻辑,就有可能根据rdempty信号(
    发表于03-05 10:40

    使用Xilinx异步FIFO常见的坑

    FIFO是FPGA处理 时钟和数据缓存的必要IP,可以这么说,只要是任意一个成熟的FPGA涉及,一定会涉及到 FIFO。但是我在使用 异步
    发表于02-04 06:23

    异步FIFO的设计分析及详细代码

    (每个数据的位宽) FIFO有同步和 异步两种,同步即读写 时钟相同, 异步即读写 时钟不相同 同步 FIFO
    发表于11-15 12:52 8369次阅读
    <b class='flag-5'>异步</b><b class='flag-5'>FIFO</b>的设计分析及详细代码

    基于FPGA的异步FIFO设计方法详解

    在现代电路设计中,一个系统往往包含了多个 时钟,如何在 异步 时钟间传递数据成为一个很重要的问题,而使用 异步 FIFO可以有效地解决这个问题。
    发表于07-17 08:33 8192次阅读
    基于FPGA的<b class='flag-5'>异步</b><b class='flag-5'>FIFO</b>设计方法详解

    基于异步FIFO结构原理

    在现代的集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个 时钟。多 时钟域带来的一个问题就是,如何设计 异步 时钟之间的接口电路。 异步
    发表于02-07 14:22 0次下载
    基于<b class='flag-5'>异步</b><b class='flag-5'>FIFO</b>结构原理

    关于一种面向异步FIFO的低开销容错机制研究

    异步 FIFO(Fist-In-First-Out)是一种先入先出的数据缓冲器[1]。由于可以很好地解决 时钟域问题和不同模块之间的速度匹配问题,而被广泛应用于全局
    的头像 发表于06-19 15:34 3041次阅读
    关于一种面向<b class='flag-5'>异步</b><b class='flag-5'>FIFO</b>的低开销容错机制研究

    如何解决异步FIFO时钟域亚稳态问题?

    时钟域的问题:前一篇已经提到要通过比较读写指针来判断产生读空和写满信号,但是读指针是属于读 时钟域的,写指针是属于写 时钟域的,而 异步
    的头像 发表于09-05 14:29 5845次阅读

    Xilinx异步FIFO的大坑

    FIFO是FPGA处理 时钟和数据缓存的必要IP,可以这么说,只要是任意一个成熟的FPGA涉及,一定会涉及到 FIFO。但是我在使用 异步
    发表于03-12 06:01 12次下载
    Xilinx<b class='flag-5'>异步</b><b class='flag-5'>FIFO</b>的大坑

    异步FIFO之Verilog代码实现案例

    同步 FIFO的意思是说 FIFO的读写 时钟是同一个 时钟,不同于 异步 FIFO
    发表于11-01 09:58 1409次阅读

    异步fifo详解

    和写入数据(对于大型数据存储,在性能上必然缓慢),其数据地址是由内部读写指针自动加一完成的,不能像普通的存储器一样,由地址线决定读取或者写入某个特定地址的数据,按读写是否为相同 时钟域分为同步和 异步 FIFO,这里主要介绍
    的头像 发表于12-12 14:17 3691次阅读

    Verilog电路设计之单bit时钟域同步和异步FIFO

    FIFO用于为匹配读写速度而设置的数据缓冲buffer,当读写 时钟 异步时,就是 异步 FIFO。多bit的数据信号,并不是直接从写
    发表于01-01 16:48 1171次阅读

    FIFO设计—异步FIFO

    异步 FIFO主要由五部分组成:写控制端、读控制端、 FIFOMemory和两个 时钟同步端
    发表于05-26 16:17 1401次阅读
    <b class='flag-5'>FIFO</b>设计—<b class='flag-5'>异步</b><b class='flag-5'>FIFO</b>

    同步FIFO异步FIFO的区别 同步FIFO异步FIFO各在什么情况下应用

    简单的一种,其特点是输入和输出都与 时钟信号同步,当 时钟到来时,数据总是处于稳定状态,因此容易实现数据的传输和存储。 而 异步 FIFO则是在波形的上升沿和下降沿上进行处理,在输入输出端口处
    的头像 发表于10-18 15:23 1387次阅读

    同步FIFO异步FIFO区别介绍

    ,并且间隔时间长,也就是突发写入。那么通过设置一定深度的 FIFO,可以起到数据暂存的功能,且使得后续处理流程平滑。 时钟域的隔离:主要用 异步 FIFO。对于不同
    的头像 发表于06-04 14:27 569次阅读
    同步<b class='flag-5'>FIFO</b>和<b class='flag-5'>异步</b><b class='flag-5'>FIFO</b>区别介绍