异步FIFO的FPGA实现

EDN电子技术设计 2020-04-29 00:00

本文大部分内容来自Clifford E. Cummings的《Simulation and Synthesis Techniques for Asynchronous FIFO Design》,同时加上一些自己的一些理解。


FIFO简介


FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。


用途1:

异步FIFO读写分别采用相互异步的不同时钟。在现代集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个时钟,多时钟域带来的一个问题就是,如何设计异步时钟之间的接口电路。异步FIFO是这个问题的一种简便、快捷的解决方案,使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据。


用途2:

对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。


分类

同步FIFO是指读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作;

异步FIFO是指读写时钟不一致,读写时钟是互相独立的。


FIFO的常见参数

  • FIFO的宽度:即FIFO一次读写操作的数据位;

  • FIFO的深度:指的是FIFO可以存储多少个N位的数据(如果宽度为N)。

  • 满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。

  • 空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。

  • 读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。

  • 写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。


 

1.读写指针的工作原理


读指针:总是指向下一个将要被写入的单元,复位时,指向第1个单元(编号为0)。

写指针:总是指向当前要被读出的数据,复位时,指向第1个单元(编号为0)


2.FIFO的“空”/“满”检测


FIFO设计的关键:产生可靠的FIFO读写指针和生成FIFO“空”/“满”状态标志。

当读写指针相等时,表明FIFO为空,这种情况发生在复位操作时,或者当读指针读出FIFO中最后一个字后,追赶上了写指针时,如下图所示:

          

当读写指针再次相等时,表明FIFO为满,这种情况发生在,当写指针转了一圈,折回来(wrapped around)又追上了读指针,如下图:

        

为了区分到底是满状态还是空状态,可以采用以下方法:


方法1:在指针中添加一个额外的位(extra bit),当写指针增加并越过最后一个FIFO地址时,就将写指针这个未用的MSB加1,其它位回零。对读指针也进行同样的操作。此时,对于深度为2n的FIFO,需要的读/写指针位宽为(n+1)位,如对于深度为8的FIFO,需要采用4bit的计数器,0000~1000、1001~1111,MSB作为折回标志位,而低3位作为地址指针。


    • 如果两个指针的MSB不同,说明写指针比读指针多折回了一次;如r_addr=0000,而w_addr = 1000,为满。

    • 如果两个指针的MSB相同,则说明两个指针折回的次数相等。其余位相等,说明FIFO为空;



3.二进制FIFO指针的考虑


将一个二进制的计数值从一个时钟域同步到另一个时钟域的时候很容易出现问题,因为采用二进制计数器时所有位都可能同时变化,在同一个时钟沿同步多个信号的变化会产生亚稳态问题。而使用格雷码只有一位变化,因此在两个时钟域间同步多个位不会产生问题。所以需要一个二进制到gray码的转换电路,将地址值转换为相应的gray码,然后将该gray码同步到另一个时钟域进行对比,作为空满状态的检测。

    


4.使用gray码进行对比,如何判断“空”与“满”


使用gray码解决了一个问题,但同时也带来另一个问题,即在格雷码域如何判断空与满。


对于“空”的判断依然依据二者完全相等(包括MSB);


而对于“满”的判断,如下图,由于gray码除了MSB外,具有镜像对称的特点,当读指针指向7,写指针指向8时,除了MSB,其余位皆相同,不能说它为满。因此不能单纯的只检测最高位了,在gray码上判断为满必须同时满足以下3条:


  • wptr和同步过来的rptr的MSB不相等,因为wptr必须比rptr多折回一次。

  • wptr与rptr的次高位不相等,如上图位置7和位置15,转化为二进制对应的是0111和1111,MSB不同说明多折回一次,111相同代表同一位置。

  • 剩下的其余位完全相等。

      

5.总体实现


系统的总体框图如下:

        

1)顶层模块 

  module AsyncFIFO
#(parameter ASIZE = 4,    //地址位宽
  parameter DSIZE = 8)    //数据位宽 (    input  [DSIZE-1:0] wdata,    input              winc, wclk, wrst_n,  //写请求信号,写时钟,写复位
   input              rinc, rclk, rrst_n,  //读请求信号,读时钟,读复位
   output [DSIZE-1:0] rdata,    output             wfull,    output             rempty
);wire [ASIZE-1:0] waddr, raddr;wire [ASIZE:0]   wptr, rptr, wq2_rptr, rq2_wptr;        /************************************************************
* In order to perform FIFO full and FIFO empty tests using
* this FIFO style, the read and write pointers must be
* passed to the opposite clock domain for pointer comparison
*************************************************************//*在检测“满”或“空”状态之前,需要将指针同步到其它时钟域时,使用格雷码,可以降低同步过程中亚稳态出现的概率*/sync_r2w I1_sync_r2w(
   .wq2_rptr(wq2_rptr),
   .rptr(rptr),
   .wclk(wclk),
   .wrst_n(wrst_n));
sync_w2r I2_sync_w2r (
   .rq2_wptr(rq2_wptr),
   .wptr(wptr),
   .rclk(rclk),
   .rrst_n(rrst_n));/**  DualRAM
*/DualRAM #(DSIZE, ASIZE) I3_DualRAM(
   .rdata(rdata),
   .wdata(wdata),
   .waddr(waddr),
   .raddr(raddr),
   .wclken(winc),
   .wclk(wclk));    /**  空、满比较逻辑*/rptr_empty #(ASIZE) I4_rptr_empty(
   .rempty(rempty),
   .raddr(raddr),
   .rptr(rptr),
   .rq2_wptr(rq2_wptr),
   .rinc(rinc),
   .rclk(rclk),
   .rrst_n(rrst_n));
wptr_full #(ASIZE) I5_wptr_full(
   .wfull(wfull),
   .waddr(waddr),
   .wptr(wptr),
   .wq2_rptr(wq2_rptr),
   .winc(winc),
   .wclk(wclk),
   .wrst_n(wrst_n));endmodule

 

2)DualRAM模块

module DualRAM
#(    parameter DATA_SIZE = 8,   // 数据位宽
   parameter ADDR_SIZE = 4   // 地址位宽)
(    input                       wclken,wclk,    input      [ADDR_SIZE-1:0]  raddr,     //RAM read address
   input      [ADDR_SIZE-1:0]  waddr,     //RAM write address
   input      [DATA_SIZE-1:0]  wdata,    //data input
   output     [DATA_SIZE-1:0]  rdata      //data output);    localparam RAM_DEPTH = 1 << ADDR_SIZE;   //RAM深度 = 2^ADDR_WIDTH
       reg [DATA_SIZE-1:0] Mem[RAM_DEPTH-1:0];        always@(posedge wclk)begin
    if(wclken)
        Mem[waddr] <= wdata;endassign rdata =  Mem[raddr];endmodule


3)同步模块

module sync_r2w
#(parameter ADDRSIZE = 4)
(    output reg [ADDRSIZE:0] wq2_rptr,    input      [ADDRSIZE:0] rptr,    input                       wclk, wrst_n
);reg [ADDRSIZE:0] wq1_rptr;always @(posedge wclk or negedge wrst_n)    if (!wrst_n)
       {wq2_rptr,wq1_rptr} <= 0;    else
       {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};endmodule


4)同步模块2


module sync_w2r
#(parameter ADDRSIZE = 4)
(    output reg  [ADDRSIZE:0] rq2_wptr,    input         [ADDRSIZE:0] wptr,    input         rclk, rrst_n
);        reg [ADDRSIZE:0] rq1_wptr;always @(posedge rclk or negedge rrst_n)    if (!rrst_n)
       {rq2_wptr,rq1_wptr} <= 0;    else
       {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};endmodule


5)空判断逻辑

module rptr_empty
#(parameter ADDRSIZE = 4)
(    output reg rempty,    output     [ADDRSIZE-1:0] raddr,    output reg [ADDRSIZE :0]  rptr,    input       [ADDRSIZE :0] rq2_wptr,    input       rinc, rclk, rrst_n);

reg  [ADDRSIZE:0] rbin;wire [ADDRSIZE:0] rgraynext, rbinnext;wire  rempty_val;//-------------------// GRAYSTYLE2 pointer: gray码读地址指针//-------------------always @(posedge rclk or negedge rrst_n)    if (!rrst_n)
       begin
           rbin <= 0;
           rptr <= 0;        end
   else
       begin
           rbin <= rbinnext ;
           rptr <= rgraynext;        end// gray码计数逻辑assign rbinnext = !rempty ? (rbin + rinc) : rbin;assign rgraynext = (rbinnext>>1) ^ rbinnext;      //二进制到gray码的转换
       assign raddr = rbin[ADDRSIZE-1:0];//---------------------------------------------------------------// FIFO empty when the next rptr == synchronized wptr or on reset//---------------------------------------------------------------/**   读指针是一个n位的gray码计数器,比FIFO寻址所需的位宽大一位
*   当读指针和同步过来的写指针完全相等时(包括MSB),说明二者折回次数一致,FIFO为空
*    
*/assign rempty_val = (rgraynext == rq2_wptr);        always @(posedge rclk or negedge rrst_n)if (!rrst_n)
   rempty <= 1'b1;else
   rempty <= rempty_val;endmodule


6)满判断逻辑

module wptr_full
#(    parameter ADDRSIZE = 4)
(    output reg                wfull,    output     [ADDRSIZE-1:0] waddr,    output reg [ADDRSIZE :0]  wptr,    input      [ADDRSIZE :0]  wq2_rptr,    input                     winc, wclk, wrst_n);        

reg  [ADDRSIZE:0] wbin;wire [ADDRSIZE:0] wgraynext, wbinnext;wire wfull_val;// GRAYSTYLE2 pointeralways @(posedge wclk or negedge wrst_n)    if (!wrst_n)
   begin
       wbin <= 0;
       wptr <= 0;    end
   else
   begin
       wbin <= wbinnext;
        wptr <= wgraynext;    end//gray 码计数逻辑    assign wbinnext  = !wfull ? wbin + winc : wbin;assign wgraynext = (wbinnext>>1) ^ wbinnext;        assign waddr = wbin[ADDRSIZE-1:0];        /*由于满标志在写时钟域产生,因此比较安全的做法是将读指针同步到写时钟域*//**///------------------------------------------------------------------// Simplified version of the three necessary full-tests:// assign wfull_val=((wgnext[ADDRSIZE] !=wq2_rptr[ADDRSIZE] ) &&// (wgnext[ADDRSIZE-1] !=wq2_rptr[ADDRSIZE-1]) &&// (wgnext[ADDRSIZE-2:0]==wq2_rptr[ADDRSIZE-2:0]));//------------------------------------------------------------------assign wfull_val = (wgraynext=={~wq2_rptr[ADDRSIZE:ADDRSIZE-1],
                   wq2_rptr[ADDRSIZE-2:0]});always @(posedge wclk or negedge wrst_n)if (!wrst_n)
   wfull <= 1'b0;else
   wfull <= wfull_val;endmodule


P.S :在quartus中有异步FIFO IP核,为安全起见推荐使用IP核定制FIFO,本文的目的只是作为思路参考。


-END-
资源介绍了LCD1602字符显示设计,4位加减法设计,三位二进制乘法器设计,序列检测器设计,变模计数器设计,流水灯设计,简易电子时钟设计,简易计算器设计共8个小白入门常用的实验。


《写给小白们的FPGA入门(打包合集资料)


点击阅读原文可直接下载完整资料,如果您的手机下载出错,请使用电脑访问网站下载,下载链接:https://mbb.eet-china.com/download/19252.html

EDN电子技术设计 EDN China电子技术设计为电子设计工程师和设计经理人提供前沿深度的电子资讯、设计实例应用方案。
评论
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 60浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 104浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 72浏览
  • 【萤火工场CEM5826-M11测评】OLED显示雷达数据本文结合之前关于串口打印雷达监测数据的研究,进一步扩展至 OLED 屏幕显示。该项目整体分为两部分: 一、框架显示; 二、数据采集与填充显示。为了减小 MCU 负担,采用 局部刷新 的方案。1. 显示框架所需库函数 Wire.h 、Adafruit_GFX.h 、Adafruit_SSD1306.h . 代码#include #include #include #include "logo_128x64.h"#include "logo_
    无垠的广袤 2024-12-10 14:03 74浏览
  • 我的一台很多年前人家不要了的九十年代SONY台式组合音响,接手时只有CD功能不行了,因为不需要,也就没修,只使用收音机、磁带机和外接信号功能就够了。最近五年在外地,就断电闲置,没使用了。今年9月回到家里,就一个劲儿地忙着收拾家当,忙了一个多月,太多事啦!修了电气,清理了闲置不用了的电器和电子,就是一个劲儿地扔扔扔!几十年的“工匠式”收留收藏,只能断舍离,拆解不过来的了。一天,忽然感觉室内有股臭味,用鼻子的嗅觉功能朝着臭味重的方向寻找,觉得应该就是这台组合音响?怎么会呢?这无机物的东西不会腐臭吧?
    自做自受 2024-12-10 16:34 163浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 81浏览
  • 智能汽车可替换LED前照灯控制运行的原理涉及多个方面,包括自适应前照灯系统(AFS)的工作原理、传感器的应用、步进电机的控制以及模糊控制策略等。当下时代的智能汽车灯光控制系统通过车载网关控制单元集中控制,表现特殊点的有特斯拉,仅通过前车身控制器,整个系统就包括了灯光旋转开关、车灯变光开关、左LED前照灯总成、右LED前照灯总成、转向柱电子控制单元、CAN数据总线接口、组合仪表控制单元、车载网关控制单元等器件。变光开关、转向开关和辅助操作系统一般连为一体,开关之间通过内部线束和转向柱装置连接为多,
    lauguo2013 2024-12-10 15:53 93浏览
  • 全球知名半导体制造商ROHM Co., Ltd.(以下简称“罗姆”)宣布与Taiwan Semiconductor Manufacturing Company Limited(以下简称“台积公司”)就车载氮化镓功率器件的开发和量产事宜建立战略合作伙伴关系。通过该合作关系,双方将致力于将罗姆的氮化镓器件开发技术与台积公司业界先进的GaN-on-Silicon工艺技术优势结合起来,满足市场对高耐压和高频特性优异的功率元器件日益增长的需求。氮化镓功率器件目前主要被用于AC适配器和服务器电源等消费电子和
    电子资讯报 2024-12-10 17:09 95浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 104浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-10 16:13 113浏览
  • 近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言交流体验。 INMO GO2内置的W517芯片,是紫光展锐4G旗舰级智能穿戴平台,采用四核处理器,具有高性能、低功耗的优势,内置超微高集成技术,采用先进工艺,计算能力相比同档位竞品提升4倍,强大的性能提供更加多样化的应用场景。【视频见P盘链接】 依托“
    紫光展锐 2024-12-11 11:50 65浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 75浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 61浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 68浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦