异步FiFO原理及实现

[FPGA深度解析]异步FIFO原理及使用 FIFO是一种数据缓冲器,用来实现数据先入先出的读/写方式。异步FIFO的一种实现方式 阅读详情

异步FIFO主要用作跨时钟域的数据缓存,设计时的要点在于判断FIFO的空满状态。

一、代码中的重要参数
1、FIFO:First Input First Output,即先入先出队列,本质是RAM。
2、wr_clk:写时钟,所有与写有关的操作都是基于写时钟;
3、rd_clk:读时钟,所有与读有关的操作都是基于读时钟;
4、FIFO_WIDTH: FIFO的位宽,即FIFO中每个地址对应的数据的位宽;
5、FIFO_DEPTH: FIFO的深度,即FIFO中能存入多少个(位宽为FIFO_WIDTH的)数据;
6、full:FIFO发出的满信号,当FIFO满了之后,将full拉高;
7、empty:FIFO发出的空信号,当FIFO空了之后,将empty拉高;
8、wr_en:主机发送给FIFO的写使能,一般受制于FIFO发出的full信号,若full信号为高,一般主机会拉低写使能信号,防止新数据覆盖原来的数据;
9、rd_en:主机发送给FIFO的读使能,一般受制于FIFO发出的empty信号,若empty信号为高,一般主机会拉低读使能信号,防止从FIFO中读出不确定的数据。
二、判断空满状态

空:读快于写时,读指针追上写指针时,写入的数据被读完,写指针和读指针相同,FIFO为空。
满:当写快于读时,当写指针追上读指针,写入的数据比读出的数据多FIFO_DEPTH个,即写指针比读指针大一个FIFO_DEPTH时,此时FIFO为满。

格雷码:格雷码是一种安全码,因为相邻的格雷码只有一位不同,和二进制不同,二进制一般相邻的都有多位不同。格雷码在传输中,因为相邻只有一位不同,所以其误码率比二进制低得多。在同步时,出现亚稳态的概率也比二进制低。
二进制数转化为格雷码时最高位保留,其余从右到左相邻两位进行异或运算。
1、设计fifo时,让读写指针比读写地址多一位,称为标志位。对读写地址有没有影响。
2、使用格雷码的好处
当读写指针完全一样时为空,当读指针写指针除标志位之外完全一样为满。
3、空满信号的同步
因为空信号是对读操作有影响,所以,将空信号在rd_clk下同步(多采用两级寄存器)
因为满信号是对写操作有影响,所以,将满信号在wr_clk下同步(多采用两级寄存器)

跨时钟处理常见问题及解决方案
一般会遇到亚稳态、数据丢失等问题,简单介绍亚稳态及其解决办法。

  1. 单比特信号

当时钟信号上升沿到来的时候正好采样的数据也在发生变化,但是对于采样的时钟信号,如果想要采样得到一个稳定值,在clk的上升沿的前一段时间有一个建立时间TSU和在clk的上升沿的后一段时间有一个保持时间Th,如果在这两个时间段内采样的信号D发生跳变的话,输出的信号Q就会出现0,1之间跳变的不稳定、不确定状态,从而对采样结果产生干扰,这就是亚稳态。
1、从慢时钟到快时钟
采用打两拍,也就是两级锁存器。
第一级寄存器即使出现亚稳态,也会在一个时钟周期内稳定下来,这样第二级寄存器就会采到的就是一个稳定的值。并不是说第二级寄存器所输出的第一个状态 就是输入的第一个状态,只能说第二个寄存器输出第一个的状态是稳定的,之后的状态是跟输入的状态保持一致的。从而将第二个寄存器输出的结果进行处理,这样可以消除亚稳态的影响。
2、快时钟到慢时钟
快时钟域的数据到慢时钟域,如果信号只有一个脉冲宽度,那信号可能会采集不到,此时采用握手协议来解决。
所谓握手,即通信双方使用了专用控制信号进行状态指示。
握手协议:这个控制信号既有发送域给接收域的,也有接收域给发送域的,使用握手协议方式处理跨时钟域数据传输,只需要对双方的握手信号(req和ack)分别使用打两拍进行同步。在具体实现中,假设req、ack总线在初始化时都处于无效状态,当发送域检测到脉冲信号pulse_a,使req信号有效,随后发送有效的req信号给接收域。
接收域在检测到有效的req信号后锁存数据总线,然后回送一个有效的ack信号表示读取完成应答。发送域在检测到有效ack信号后撤销当前的req信号,接收域在检测到req撤销后也相应撤销ack信号,此时完成一次正常握手通信。

首先将快时钟域的信号A进行展宽处理A.zhankuan,当收到握手结束时的反馈时结束展宽。
当收到慢时钟的脉冲信号pulse_a,A.zhankuan信号采用打两拍的方式传送到慢时钟域B.zhankuan。
B.zhankuan打两拍后传送到快时钟域,作为握手结束的反馈信号,此时结束A信号的展宽。
最后输出B.zhankuan。
缺点:就是将aclk的信号进行了扩展,两次的同步也增加了延时。

  1. 多bit信号多位数据传输一般采用异步FIFO和格雷码。
FPGA开发——使用verilog实现异步FIFO 1、FIFO的分类FIFOFirst In First Out)先进先出存储器。根据接入的时钟信号,可以分为同步FIFO和异步FIFO。FIFO底层是基于双口RAM,同步FIFO的读写时钟一致,异步FIFO 读时钟和写时钟不同。作用: 阅读详情

相关推荐

异步fifo的实现

异步FIFO的实现以及拓展的一些问题

m0_47220307的博客 1040

【Verilog】手撕异步FIFO

在上一篇同步FIFO中已经介绍过,FIFO是一种先进先出的数据缓存器,它与普通存储器的区别是没有读写外部地址,这样使用起来非常简单,但缺点就是只能顺序写入数据。FIFO分为同步FIFO和异步FIFO两种,其中同步FIFO的输入与输出采用相同的时钟,而异步FIFO的读写时钟是互相独立的。

S_Wiper的博客 9321

Asynchronous FIFO异步FIFO 原理及RTL代码实现

在异步FIFO中,数据读取和写入操作使用不同的时钟频率。由于写入和读取时钟不同步,因此称为异步FIFO。通常,这些用于数据需要从一个时钟域传递到另一个时钟域的系统中,这通常被称为“跨时钟域”。因此,异步FIFO有助于同步在不同时钟下工作的两个系统之间的数据流。

qq_46264636的博客 1926

异步FIFO的实现

异步FIFO涉设计

路漫漫其修远兮,吾将上下而求索 1204

单时钟同步 FIFO 和二时钟异步 FIFO 的基本原理和实现

学习目的: 1.给大家介绍FIFO的基本原理和组成。 2.学习同步单时钟FIFO、二时钟异步FIFO的分析以及编写。 3.以实例体验如何将实际需求分析转换成代码。 FIFO(First In First Out)队列通常在数字系统中实现两个模块间数据的暂存,达到减少两模块之间的速度依赖,使得两个模块能够相互相对独立的运行。 FIFO是FPGA设计的一个非常基本的单元。FIFO一般用一个双口RAM和分别指示...

学渣的博客 2713

异步FIFO位宽转换设计:从原理到FPGA/ASIC工程实现

在数字电路与芯片设计中,数据流缓冲与时钟域交叉是核心基础技术。FIFO作为先进先出队列,通过内部存储阵列和读写指针管理,实现了数据的安全暂存与异步传输,其核心价值在于解决数据生产与消费速率不匹配问题,保障系统时序完整性。该技术广泛应用于FPGA、ASIC的数据接口、图像处理流水线及高速通信链路等场景。本文聚焦于异步FIFO的位宽转换功能,深入剖析其如何通过格雷码指针同步与双端口RAM的非对称读写,可靠地完成如8位至32位等数据宽度转换,并涵盖深度计算、验证策略等工程实践要点。

weixin_33744854的博客 392

异步FIFO原理及其实现

FPGA(一):异步FIFO实现(包含源码和仿真文件) 一、异步FIFO的重要参数及其作用 1、FIFO:First Input First Output,即先入先出队列,本质是RAM。 FIFO有几个最重要的参数: 2、wr_clk:写时钟,所有与写有关的操作都是基于写时钟; 3、rd_clk:读时钟,所有与读有关的操作都是基于读时钟; 4、FIFO_WIDTH: FIFO的位宽,即FIFO中每个地址对应的数据的位宽; 5、FIFO_DEPTH: FIFO的深度,即FIFO中能存入多少个(位宽为FIFO_

qq_40483920的博客 9541

基于AT6000 FPGA的异步FIFO设计:从原理到实现的跨时钟域数据缓冲方案

在数字系统设计中,数据缓冲是解决模块间速率不匹配和时钟域隔离的核心技术。FIFO(先进先出队列)作为一种经典的缓冲机制,其原理是通过独立的读写指针管理存储空间,实现生产者和消费者之间的解耦。在FPGA工程实践中,异步FIFO因其能安全处理跨时钟域数据传递而具有重要技术价值,尤其适用于高速数据采集、通信接口等场景。通过使用格雷码编码和同步器链,可有效抑制亚稳态风险,确保指针同步的可靠性。本文以安路科技AT6000系列FPGA为硬件平台,详细探讨了如何利用其Block RAM资源,设计并实现一个位宽16bit、

weixin_33168937的博客 368

关于异步fifo的实现原理

说起 异步fifo,底层是由异步RAM来实现的。我们先看一RAM的底层单元,下面例化的是台积电的RAM的底层单元。1、对于异步RAM的底层单元:SYT28HPCPHHD2PRFXXXX_wrapper  a_ram(.QB( QB),.ADDRA(AA),.DA(DA),.WEA(WEA),.MEA(CSA),.CLKA(w_clk),.LS(1’h0),.CLKB(r_clk), .ADDRB(...

视频拼接器 2582

Qwen3.5在昇腾910B上的vLLM Ascend高性能部署实战

大语言模型推理优化是AI工程落地的核心环节,其本质是计算、内存与通信三者的协同调度。vLLM作为主流推理框架,通过PagedAttention和Continuous Batching显著提升GPU利用率;而昇腾NPU凭借高带宽HBM与专用AI算子,在国产化算力平台中展现出独特优势。当vLLM深度适配昇腾(即vLLM Ascend),不仅保留动态批处理、流式输出等关键能力,更实现KV Cache的HBM感知管理与HCCL直通优化,使中小尺寸模型(如Qwen3.5-35B)在单台Atlas A3服务器上达成百并

weixin_30558697的博客 433

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

异步FIFO原理与实现

近期参与了一项流片项目,里面用到了FIFO,但是只给我们ram的IP,只能自己写一个FIFO了,趁此机会好好学习一下。 本文参考了一篇重要文献:Simulation and Synthesis Techniques for Asynchronous FIFO Design 貌似是FIFO的经典好文了,把异步FIFO的原理讲得很透彻。话不多说,上代码。 `timescale 1ns / 1ps //////////////////////////////////////////////////////

weixin_42415266的博客 1412

UniApp实战:5分钟搞定极光推送(JG-JPush)从配置到消息测试全流程

本文详细介绍了如何在UniApp中快速集成极光推送(JG-JPush),从基础配置到核心代码实现,再到双端调试技巧和高级功能扩展。通过5分钟全流程指南,开发者可以轻松实现消息推送功能,提升应用的用户触达率。

sat99的博客 682

实现异步FIFO的基本原理总结

实现异步FIFO的基本原理总结一、概述二、基本原理1、写满与读空2、格雷编码三、FIFO实现方案1、整体模块划分2、读写FIFO控制子模块内部框图 一、概述 前文中我们通过调用XILINX提供的FIFO IP核熟悉了FIFO的具体功能,后续我们将用verilog HDL自己实现一个异步FIFO,更彻底地搞懂FIFO的基本原理。我们知道整体设计是具体实现的前提,因此在用HDL实现异步FIFO前,将后续实现FIFO中涉及的基本知识和FIFO内部组成模块设计等内容总结如下。 二、基本原理 1、写满与读空 在上文中

weixin_39789553的博客 1533

vue + video.js 加载多种视频流(HLS、FLV、RTMP、RTSP)

由于需要在一个项目内接入多种常用的视频流,所以接触到video.js,这里就做个记录。vue安装就不讲了,直接从项目开始了。RTSP格式已测试,无法成功播放,浏览器就识别不了STSP协议(提供两个解决方案:第一个是通过后端去转格式。第二个方案就是安装插件/中间件。目前想用浏览器直接播放RTSP格式流,没有其他更好的解决方法。

qq_17627195的博客 1万+

YOLO11多个点组合创新:GC10-DET缺陷检测 | DCNv4结合SPPF+11Detect创新性结合

DCNv4结合SPPF+11Detect创新性结合,原始mAP50为0.633 提升至0.651

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1290

异步FIFO原理与Verilog简单实现

这里写自定义目录标题异步FIFO读和写使用格雷码传输指针 异步FIFO 本文代码参考Simulation and Synthesis Techniques for Asynchronous FIFO Design Clifford E. Cummings, Sunburst Design, Inc 异步FIFO是读写时钟频率不同的先入先出数据缓存器。一个系统往往有多个时钟,跨时钟域数据传输由异步FIFO实现。异步FIFO实现时必须考虑跨时钟域问题。跨时钟域问题,是指输入触发器的信号没有满足触发器的建立和保持

helrori 1043

多体动力学分析软件:SIMPACK_(17).SIMPACK高级编程与脚本

自定义力和约束可以用于模拟更复杂和现实的物理场景。SIMPACK 提供了接口,允许用户通过 Python 脚本来实现自定义力和约束。以下是一个示例,展示如何定义一个自定义力函数并应用于模型。# 定义自定义力函数"""自定义力函数:param t: 时间:param position: 位置:param velocity: 速度:return: 力"""# 创建一个新的 SIMPACK 模型# 添加一个刚体# 添加一个关节# 添加一个自定义力# 设置仿真参数# 运行仿真。

kkchenjj的博客 1424

异步FIFO的Verilog实现:从原理到参数化设计

本文深入探讨了异步FIFO的Verilog实现,从跨时钟域数据缓冲的核心原理出发,详细解析了格雷码同步、空满判断等关键设计挑战。重点介绍了参数化双口RAM的设计,以支持灵活的数据位宽转换,并最终构建了一个完整、可靠且高度可复用的参数化异步FIFO模块,为多时钟域SoC设计提供了即插即用的解决方案。

h6j7k8l9p0的博客 402

代谢组数据分析(一):生成代谢组数据SummarizedExperiment对象

本文介绍了基于Zeybel 2022年发布的多组学数据集的分析脚本,该数据集包含微生物组、宿主人体学指标、临床学指标、血浆代谢组和免疫因子等多维度数据,涵盖56位患者的横截面数据和22位患者的纵向时间序列数据。脚本旨在生成适用于下游分析的数据对象,主要包括phyloseq和SummarizedExperiment两类。phyloseq对象用于整合微生物群落数据,支持多数据整合、可视化、丰富分析功能和便捷的数据处理;SummarizedExperiment对象则广泛应用于基因组学和转录组学研究,便于数据整合、

专注生信领域 2990

set_input_delay/set_output_delay介绍

针对这一类的情况,在做block时,cts之后,便需要将update_io_latency给关闭。那么,计算的timing就是错误的了。对于hier flow来讲,切分block,进行timing budget的时候,clock tree还未长。计算block端口上的timing,通常需要用到set_input_delay和set_output_delay告知工具外部电路的延迟信息,以方便工具计算端口上的timing。此时,工具在计算in2reg的timing时,便会将2.67ns的delay带进来。

芯冰乐 320

深入解析FIFO设计:同步与异步FIFO原理、Verilog实现与深度计算

在数字电路与片上系统(SoC)设计中,数据缓冲是处理生产与消费速率不匹配的核心技术。其基本原理是通过队列结构隔离读写操作,利用指针管理实现先进先出,从而确保数据流的正确性与系统稳定性。这一技术的核心价值在于解决跨时钟域通信与数据流控问题,是构建高可靠数字系统的基石。在实际工程中,FIFO(先进先出存储器)作为关键组件,广泛应用于FPGA开发、数据流水线及接口设计等场景。本文聚焦于FIFO的两种主要类型——同步FIFO与异步FIFO,详细剖析其设计原理与Verilog实现,并深入探讨FIFO最小深度计算这一工

weixin_29195217的博客 269

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

异步FIFO的原理及verilog实现(循环队列、读写域数据同步、Gray Code、空满标志、读写域元素计数)

在FPGA开发中,我们经常会遇到数据跨时钟域的情况,在不需要缓存的情况下,直接对clk1域下的数据,使用clk2打两拍以消除亚稳态,即可实现数据的跨时钟域,而如果遇到需要数据缓存的情况,一般会使用**异步FIFO**。 本文首先对异步FIFO的跨时钟域同步原理进行介绍,然后给出异步FIFO的verilog实现。

qq_43557686的博客 3395

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

异步FIFO基本原理(基于Verilog的简单实现)

异步FIFO的原理学习总结(方便下次再看) 参考文献:[1]彭莉, 秦建业, 付宇卓. 异步FIFO的设计与验证[J]. 计算机工程与应用, 2005, 41(3):4. [2]魏芳, 刘志军, 马克杰. 基于Verilog HDL的异步FIFO设计与实现[J]. 电子技术应用, 2006, 32(7):4.

NJUzzf98的博客 1803

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

FPGA的Verilog设计(二)——异步FIFO

在上篇文章同步FIFO中简要介绍了FIFO的基本概念以及同步FIFO的实现。本篇文章将重点介绍异步FIFO的工作原理以及硬件实现。

weixin_51116586的博客 3590
上一篇: FPGA基础(数字电路)
下一篇: 数电基础一:原码、反码和补码
Dypypp
博客等级 码龄7年 691粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值