FIFO设计

合集下载

高速环形FIFO的设计

高速环形FIFO的设计

高速环形FIFO的设计高速环形FIFO(First-In-First-Out)是一种存储器件,用于在数字电路中存储数据。

这种存储器的主要作用是在数据传输时帮助控制信号的流动,并确保信号的有序传输,以防止数据的丢失和混乱。

在这篇文章中,我们将讨论高速环形FIFO的设计。

设计原理高速环形FIFO是一种存储数据的方式,它使用一个环形的缓存来存储数据。

当数据到达时,它被写入环的末端,然后在每个时钟周期内向前移动一个位置。

当数据被读取时,它从环的开头被读取,并在每个时钟周期内向前移动一个位置。

由于这种存储器结构使数据的流动非常有序,所以它可以用于高速数据传输。

高速环形FIFO的设计需要考虑以下几个方面:1. 吞吐量高速环形FIFO的吞吐量取决于它的容量和读写速度。

容量增加时,吞吐量也会相应增加,但是读写速度也会减慢。

因此,需要在容量和速度之间取得平衡。

2. 数据保护在数据传输过程中,需要确保数据的安全和完整性。

因此,在高速环形FIFO的设计中,需要考虑如何保护数据。

一种常见的保护方式是添加一个校验和,以确保数据的完整性。

此外,还可以使用冗余数据来纠正错误,并确保数据的准确性。

3. 数据处理在高速环形FIFO的设计中,还需要考虑如何处理数据。

数据可以通过添加一个处理单元来处理。

该单元可以对数据进行解码、检测和修整等操作,从而提高数据的质量和准确性。

4. 流水线高速环形FIFO的设计可以采用分步处理的流水线方式。

流水线可以加速处理速度,并使处理过程更加高效。

在流水线的每个阶段中,可以添加一个处理单元来处理数据。

这样可以大大提高数据的处理效率。

设计步骤在进行高速环形FIFO的设计时,需要按照下面的步骤进行:1. 确定FIFO的容量和速度要求在开始设计高速环形FIFO之前,需要确定FIFO的容量和速度要求。

容量取决于需要存储的数据量,速度取决于数据传输的速度。

在FIFO的设计中,需要平衡容量和速度,以获得最佳效果。

一般工程上fifo的深度

一般工程上fifo的深度

一般工程上fifo的深度标题:从理论到实际——一般工程中FIFO的深度探究引言:FIFO(First In, First Out)是一种常见的数据存储和传输方式,即先进入队列的数据首先被处理。

在工程应用中,FIFO的深度是一个重要的参数,它决定了存储能力和数据传输的效率。

本文将一步一步回答“一般工程上FIFO的深度”这一主题,介绍FIFO深度的概念、计算方法以及实际应用中的相关考虑因素。

一、认识FIFO的深度FIFO深度是指FIFO队列中可以同时存储的数据数量。

它与队列的大小直接相关,通常以寄存器或存储单元的个数表示。

在设计FIFO深度时,需要考虑数据传输速率、处理要求和缓冲需求等因素。

二、计算FIFO深度的方法1. 根据数据传输速率:FIFO深度应该能够满足数据传输速率的需求。

根据数据传输频率和每个数据包的大小,可以通过以下公式来计算FIFO深度:FIFO深度= (数据传输速率×数据包延迟) / 数据包大小2. 根据处理要求:如果数据需要进行处理或加工,FIFO深度应能够存储足够长的时间,以便处理完成。

此时,可以通过以下公式计算FIFO深度:FIFO深度= 处理时间/ 数据传输周期3. 根据缓冲需求:FIFO深度还可以根据缓冲需求来计算。

如果需要缓冲一定数量的数据,以平衡生产者和消费者之间的速率差异,可以采用以下公式计算FIFO深度:FIFO深度= 缓冲区数据量/ 数据传输速率三、实际应用中的考虑因素1. 数据流量波动性:如果数据流量具有明显的波动性,FIFO深度应能够适应最高峰值,以防止数据丢失。

因此,在设计FIFO深度时,应考虑到流量的峰值和波动范围。

2. 系统延迟要求:如果系统对延迟有严格要求,FIFO深度应足够大,以防止数据在传输过程中发生堆积,导致发送和接收之间的延迟增加。

3. 成本和资源限制:FIFO深度的增加会带来成本和资源的增加,包括电路面积、功耗以及芯片上可用的存储单元数量等。

一种读写深度可配置的异步FIFO设计

一种读写深度可配置的异步FIFO设计

引 言
随着设计复杂度 的不断 提高 , 现 代 电子信 息设计 中,
单 一 时 钟 驱 动 已无 法 满 足 设 计 与 应 用 的 需 求 。 基 于 多 时 钟 驱 动 的设 计 已经 越 来 越 普 遍 , 在异 步 时钟域 的设计 中,
Байду номын сангаас
模 块 和读 地址 逻 辑 模 块 是 两 个 相 互 独 立 的 时 钟 域模 块 。 F I F O的空/ 满状态 的 判断 是 F I FO 设 计 中 的 一 个 关 键部分 , 主要 通 过对 读 / 写地 址 的 比较 来 实 现 。鉴 于 读 / 写
状态标 志 的产 生 , 同 时 通
F I F O 的存 储 资 源 没 有 使 用 , 造 成 硬件 资 源 的 浪 费 。
针对这一现状, 本 文 提 出 一 种 读 写 深 度 可 配 置 的 FI F O 设 计 。通 过 对 寄 存 器 的配 置 , 来设定产生有效 F I F O
地 址 的控 制 逻 辑 分 别 工 作 在 各 自 的 时 钟 域 下 , 进 行 比 较
时, 通常将二进制码 的地址 转换 为格雷 码 的编码 方式 , 传 输 到 异 步 时 钟 域 再 进 行 比较 , 以使 亚 稳 态 的 产 生 处 于 可 以
跨 时钟 域 数 据 信 号 传 输 是 必 须 考 虑 的 一 个 问题 。控 制 信 号一般使用握手协议来 实现异步传输 , 对 于 异 步 时 钟 域 大
态时就开始读操作 , 防 止 写 满 后 禁 止 写 操 作 再
图 1 通用异步 F l F O原 理 结构 图
进 行 读 取 造 成 数 据 的 丢失 。
敬请登录网站在线投稿

FPGA异步fifo设计完整报告

FPGA异步fifo设计完整报告

FPGA异步fifo设计完整报告1、名目一、技术规范31、设计完成的功能:32、系统整体框图:33、I/O管脚的描述:34、验证和测试工具选择:45、说明关键模块:46、拟选用的FPGA类型:4二、FIFO总体设计方案5系统功能描述:5电路结构图:5系统的总体输入输出设定6系统时序分析:6关键模块设计分析:7三、FIF0验证方案8FIFO功能:81、概述:82、预确认:83、模块运行确认:94、系统运行确认:9四、仿真激励代码10五、电路设计FIFO源代码11六、FPGA设计FIF0综合布局布线报告:16综合引脚安排:16电路布局布线:16七、时序仿真报告17时序仿真波形:17八、FIFO下载代码和引脚分布17系统输入输出引 2、脚分布:21九、心得体会21技术规范1、设计完成的功能:本试验完成的是8位异步FIFO的设计,其中写时钟100MHz,读时钟为5MHz,其中RAM的深度为256。

当写时钟脉冲上升沿到来时,推断写信号是有效,则写一个八位数据到RAM中;当读时钟脉冲上升沿到来时,推断读信号是有效,则从RAM中把一个八位数据读出来。

当RAM中数据写满时产生一个满标志,不能再往RAM再写数据;当RAM 中数据读空时产生一个满标志,不能再从RAM读出数据。

2、系统整体框图:3、I/O管脚的描述:管脚名称方向H/L电平位宽功能描述rst_ninput3.3V/01全局复位信号rd_eninput3.3V/01读使能低有3、效wr_eninput3.3V/01写使能低有效rd_emptyoutput3.3V/01读空标志高有效wr_fuIIoutput3.3V/01写满标志高有效rd_dataoutput3.3V/08数据输出wr_datainput3.3V/08数据写入cIk_1OOMinput3.3V/01写数据时钟cIk_5Minput3.3V/01读数据时钟4、验证和测试工具选择:ModelsimSE6.If进行前仿真和后仿。

基于FPGA的FIFO存储器设计

基于FPGA的FIFO存储器设计

基于FPGA的FIFO存储器设计一.FIFO的设计原理FIFO(First In First Out)是先进先出存储器的缩写,它是一种实现数据先进先出的存储器件,通常用作数据缓冲器。

FIFO一般用于不同时钟之间的数据传输,比如FIFO的一端是AD数据采集,另一端是计算机的PCI总线,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。

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

在实际工作中,对FIFO的数据操作是靠其满/空标志来实现的。

所谓满标志,指的是当对FIFO写数时,如果数据足够多,多到FIFO的内存已经装满了,此时便由FIFO内部状态电路送出一个表示内存已满的信号以阻止对FIFO的写操作。

同理,所谓空标志,指的是当从FIFO读数时,如果数据被读完了,便有FIFO内部状态电路送出一个空标志信号以阻止对FIFO的读操作。

总之,在控制FIFO的读写操作时,必须把握一个原则:写满不溢出,读空不多读。

根据FIFO工作的时钟域不同,可以将FIFO分为同步FIFO和异步FIFO两大类。

同步FIFO是指读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作;异步FIFO是指读写时钟不一致,读写时钟是互相独立的。

和同步时钟相比,特别是在网络接口、图像处理等方面,异步FIFO应用空间更为广泛。

二.FIFO设计功能及系统框图FIFO的整个系统可分为写地址产生逻辑、度地址产生逻辑、双端口存储器、满/空标志产生逻辑4大部分。

其中,FIFO的存储介质为一块双端口存储器,可以同时进行读写操作。

在写地址产生逻辑部分,由写地址产生逻辑产生写控制信号和写地址;在读地址产生逻辑部分,由读地址产生逻辑产生读控制信号和读地址。

在满/空标志产生部分,由读写地址相互比较产生满/空标志。

具体模块结构如下图所示:本实验完成的是8位FIFO的设计。

异步FIFO设计

异步FIFO设计

异步FIFO设计2011.6.22摘要本文采用格雷码设计了一个异步FIFO,经过DC综合的结果如下:时钟频率:1.1GHz面积:10744.447um2功耗:7.791mw目录1. 异步FIFO的设计 (2)1.1 异步FIFO简介 (2)1.2 FIFO的参数 (2)1.3 FIFO的设计原理 (2)1.4 FIFO的设计模块 (6)1.5 用modelsim仿真FIFO (11)1.6 用DC对FIFO进行综合 (13)2.参考文献 (15)1. 异步FIFO的设计1.1 异步FIFO简介FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。

根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。

同步FIFO是指读时钟和写时钟为同一个时钟。

在时钟沿来临时同时发生读写操作。

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

异步FIFO(Asynchronous FIFO),一般用于不同时钟域之间的数据传输,比如FIFO 的一端连接频率较低的AD数据采样信号,另一端与计算机的频率较高的PCI总线相连。

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

由于实际中,异步FIFO比较常见。

为了便于描述,在后面的章节中将异步FIFO 简称为FIFO.1.2 FIFO的参数FIFO的宽度:进行一次读写操作的数据的位宽。

FIFO的深度:双口存储器中能容纳的数据的总数。

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

FIFO设计

FIFO设计

• 4) FULL信号控制进程 • 如何判断FULL信号为‘1’;
• 1、当前没有读/写数据有效信号,FIFO数 据已满 • 2、当前没有读有效信号,有写有效信号, 而且FIFO还差一个就满了。
• 4) FULL信号控制进程

Process(clk,reset) begin if reset='1' then full_mid<='1'; elsif rising_edge(clk) then if (rd_enable='0' and (fifo_cnt(8 downto 1) = "11111111") and ((fifo_cnt(0)='1') or (wr_enable='1'))) then full_mid<='1'; else full_mid<='0'; end if; end if; end process;
同步FIFO的操作
1、 同步FIFO的操作 当FIFO不满且wr_en有效时,向FIFO写数据,并 置写使能wr_enable有效; 当FIFO不空且rd_en有效时,从FIFO从读出数据 并置读使能rd_enable有效; 当FIFO满且wr_en有效时,置写使能wr_enable
无效且作废此次写操作; 当FIFO空且rd_en有效时,置读使能rd_enable 无效且作废此次读操作。
异步FIFO的设计
• 异步FIFO的数据读、写受不同时钟的控制; • 异步FIFO的空、满状态不能依靠计数的方 式进行,因为读、写均需要对计数器进行 操作; • 如何判断异步FIFO的空、满情形?如何操 作?

异步FIFO的设计文档

异步FIFO的设计文档

异步FIFO的设计版本v1.02011-05-06异步FIFO的设计一.功能描述本设计用16*8 RAM实现一个异步FIFO,具体功能定义如下:1. 异步复位。

2. FIFO不为满时,当写使能有效时,在写时钟的上升沿向FIFO中写入数据。

3. FIFO不为空时,当读使能有效时,在读时钟的上升沿从FIFO中读出数据。

4. 当FIFO写满的时候,产生满信号;当FIFO读空的时候,产生空信号。

5. FIFO一旦空或者满时候,复位FIFO;二.输入输出信号描述信号名输入/输出目标/源功能描述Rclk Input Pin 读时钟频率,10M ,占空比1:1。

Wclk Input Pin 写时钟,频率10M ,占空比1:1。

data_in[7:0] Input Pin 8位的输入数据rd_en Input Pin 读使能,高电平有效,在FIFO非空时,CLK上升沿读入数据;wr_en Input Pin 写使能,高电平有效,在FIFO非满时,CLK上升沿写入数据;Rst Input Pin 异步清零,低电平有效,低电平时读地址,写地址,计数器都清零。

三顶层划分图1 系统框图顶层模块说明:1.RAM :存储器模块,用于存放及输出数据;2.Waddr_Reg : 保存访问RAM的写地址;3.Raddr_Reg : 保存访问RAM的写地址;4.Wbin_addr : 计算RAM下一个写地址;5.Rbin_addr : 计算RAM下一个读地址;6.Gwaddr_reg : 将写地址的二进制编码转换成格雷码,并保存;7.Graddr_reg : 将读地址的二进制编码转换成格雷码,并保存;8.Syn_Rfield : 将写地址同步到读时钟域,并产生空标志;9.Syn_Wfield : 将读地址同步到写时钟域,并产生满标志;10、Reset_Unit : 复位信号产生单元设计思想说明:1、由于实现的异步FIFO,分别用不同的读、写时钟产生读写地址,因此FIFO 的判空和判满是本设计中的一个难点。

高速异步FIFO设计-

高速异步FIFO设计-

课程设计报告高速异步FIFO设计目录技术规范 (3)FIFO的功能描述 (3)FIFO的引脚定义 (3)总体方案设计 (4)电路设计方框图 (4)电路设计连接图 (4)电路模块及其功能简介 (4)电路设计思想 (5)仿真方案及其仿真激励源代码 (8)仿真方案 (8)仿真激励源代码 (8)电路描述代码 (9)功能仿真 (14)分块仿真 (14)双口RAM仿真 (14)读数据控制电路仿真 (15)写数据控制电路仿真 (16)锁存器电路仿真 (16)满空标志电路仿真 (17)总体仿真 (18)综合与布局布线 (18)综合布局布线报告 (19)报告数据分析 (19)时序仿真 (19)实验心得 (20)一、技术规范1、FIFO的功能描述高速异步FIFO(First In First out)深度为256,数据宽度为8位(最大可存储256byte),可实时给出FIFO的满空标志,并可实现数据的平滑输出,其写时钟为带间隔的100MHz,读时钟为5MHz,从而实现了FIFO的异步数据传输。

2、FIFO的应交定义(3)写数据控制器引脚对照表:(4)读数据控制器引脚对照表:二、总体设计方案1、电路设计方框图(如图2.1所示)图2.12、电路设计连接图(如图2.2所示)3、电路模块及其功能简介双口256*8bit的RAM:用于存储FIFO的缓冲数据写数据控制器:用于控制FIFO中数据的写时序操作FIFO 读数据控制器:用于控制FIFO数据中的读时序操作锁存器:用于锁存上一个clock时的读写地址指针FIFO满空标志电路:用于实时标志FIFO的满空状态4、电路设计思想设计高速异步FIFO,首先,考虑如何实现数据的先进先出问题;为了解决这个问题,设计中就必须有一个可用于随机存取的存储器,又要实现异步,即异步读写,所以本设计中存储器选择采用双口RAM;其次,考虑如何实现在不同时钟下,实现读数据和写数据,在设计中,使用独立电路模块,分别控制读写操作;最后,一个要考虑的问题也是本设计中的难点,即对于高速异步FIFO来说,如何高速、实时判断FIFO的满和空。

高速异步FIFO的设计和实现

高速异步FIFO的设计和实现

万方数据路中,这一信号最终会朝着0和1两个稳态转换,变成稳定的信号。

这一变换所需的时间取决于寄存器的结构和参数,通常在一个时钟周期内可以完成这一从亚稳态到稳态的转换。

所以,在设计中普遍采用两级寄存器串接的同步器来对信号进行同步,如图1所示。

图1解决亚稳态的同步器电路2.2毛刺单根信号的同步采用图1所示的同步电路即可消除亚稳态问题。

然而,对多位总线信号的同步,除了亚稳态外,还有一个重要的问题就是毛刺现象。

如果需要同步的总线的多位同时发生变化,由于在实际电路中各位的延时不可能完全一致,因此中间就可能会产生毛刺现象。

而用另一个频率相位完全不同的时钟采样的时候就有可能采样到毛刺信号,造成错误的同步。

例如,FIFO的读写指针是一个二进制计数器,当它从l计数到2时,位0从1变成0,位l从0变成1。

如果位0从1变成0的延时比位1从0变1要大,就会在1和2中间多出一个毛刺3,而如果直接用图l的同步电路同步,就有可能错误地在另一个时钟域得到一个3的结果。

对于FIFO的设计来说,这样的同步错误是致命的,会造成空满判断的失误。

解决这一问题就是需要采用无毛刺的电路结构,无毛刺电路要求信号同步前必须被寄存器锁存,并且每次只有一位发生变化。

例如,文献[2]中设计的FIFO就采用格雷码来避免这一问题。

3高速异步FIFO结构3.1基本结构本文设计的高速异步FIFO结构如图2所示,主要包括数据通路reg—file和控制模块fifo—eft两个部分。

reg—file模块是FIFO的存储器部分;fifo_eft模块负责FIFO的读写控制,如读写指针的产生和空满信号的产生。

图2高速异步FWO结构框图本设计的外部端口如表l所示。

3.2reg__file模块设计FIFO的存储器部分可以采用双端口SRAM或者用DFF寄存器搭建存储部分。

由于本设计为32×32的FIFC,存储器容量不大,采用双端口SRAM由于powerring等因素,面积会比用寄存器搭建要大,速度也不容易达86到500MHz的高速。

同步fifo的设计原理

同步fifo的设计原理

同步fifo的设计原理同步FIFO的设计原理概述同步FIFO(First-In-First-Out)是一种常用的数据缓存器,用于在数据的产生与消费之间进行数据传输。

本文将从浅入深,分步骤地介绍同步FIFO的设计原理。

设计目标同步FIFO的设计旨在解决数据产生与消费之间的速度差异问题。

具体来说,它需要实现以下目标: - 确保数据的顺序性:数据按照进入FIFO的顺序被读取,保持“先进先出”的特性 - 确保数据的完整性:数据不会在传输过程中丢失或损坏 - 处理不匹配的产生和消费速度:当数据的传输速度不匹配时,FIFO能够进行适当的流量控制,以确保数据的稳定传输和存储基本原理同步FIFO的设计基于以下几个基本原理:写入过程1.写指针(Write Pointer):用于指示下一个数据写入的位置2.存储单元(Storage Element):用于存储数据的内部单元3.信号控制线(Control Signal Line):用于控制写入操作的时序,如写使能信号(Write Enable)读取过程1.读指针(Read Pointer):用于指示下一个数据读取的位置2.信号控制线:用于控制读取操作的时序,如读使能信号(ReadEnable)同步机制为了确保数据的顺序性和完整性,同步FIFO采用了以下同步机制:1. 读写指针同步:读取操作与写入操作之间存在同步关系,保证数据按照正确的顺序被读取 2. 写使能同步:写使能信号与写指针同步,确保只有在正确的时刻写入数据 3. 读使能同步:读使能信号与读指针同步,确保只有在正确的时刻读取数据流控制为了处理数据产生与消费速度不匹配的情况,同步FIFO采用了流控制机制: 1. 读写时钟同步:读写操作在同一个时钟周期内完成,通过同步读写时钟,确保数据传输的稳定性和一致性 2. FIFO空闲状态检测:通过判断FIFO的存储区是否为空,进行流量控制,避免数据丢失或溢出 3. 推、拉操作:当数据产生速度快于消费速度时,FIFO可以通过推操作将多余的数据推出;当消费速度快于产生速度时,FIFO可以通过拉操作补充数据总结同步FIFO是一种常用的数据缓存器,可以解决数据产生与消费速度不匹配的问题。

4.异步FIFO的设计

4.异步FIFO的设计

利用异步FIFO在跨时钟域中降低亚稳态发生概率在数字电路设计中,时钟是整个电路最重要、最特殊的信号,系统内大部分器件的操作都是在时钟的跳变沿上进行,如果时序不满足要求,就可能造成逻辑状态出错甚至整个系统设计的失败。

随着SOC技术的不断发展,数字系统设计的复杂度也在日益增加,经常需要跨时钟域的数据传输,通信技术等异步设计才能实现特定的功能需求。

本文设计的异步FIFO就是为了解决将数据从一个时钟域同步的读/写到另一个时钟域,并且能很好的避免亚稳态的发生。

1.异步系统任意的两个系统如果满足以下条件之一,如图1-2所示,就可称其为异步的:(1)工作在不同的时钟频率上;(2)工作在相同频率上,但相位不同图1-2 异步系统时钟当两个不同时钟域的系统进行数据传输,由于接口处是异步的,就可能会违反建立时间和保持时间规则导致亚稳态以及不可靠的数据传输,因此处理起来较同步逻辑复杂困难。

在同步系统中,输入信号必须总是满足寄存器时序要求,所以亚稳态不会发生。

亚稳态问题通常发生在当一个信号在无关的线路中或异步时钟域中传输。

在所有的异步系统中,亚稳态是不可避免的。

1.1亚稳态所有的数字器件寄存器都定义了一个信号时序要求,满足了这个要求寄存器才可以正确地在输入端获取(capture)数据在输出端产生数据。

为了确保数据的可靠与正确性,在数据传输过程中必须满足寄存器的建立时间和保持时间,如图1-1,即输入数据在时钟沿之前必须稳定一段时间(寄存器建立时间Tsu)并且在时钟沿之后稳定一段时间(寄存器保持时间Th),然后寄存器输出经过一个特定的时钟到输出延时(clock to output ,Tco)后有效。

图1-1 建立时间与保持时间如果一个数据信号在翻转中违反了一个寄存器的建立和保持时间的要求,寄存器的输出可能就会出现亚稳态。

在亚稳态中,寄存器的输出值在高和低之间徘徊一段时间,这就意味着输出翻转到一个确定的高或低的延时会超过固定的时钟到输出延时。

异步FIFO的设计与实现

异步FIFO的设计与实现

摘要随着数字系统规模的不断增大,单时钟域设计会极大地限制数字系统性能,现代数字系统为了提升性能,常采用多时钟域的设计。

跨时钟域的信号在传输时会遇到亚稳态现象,如何保持系统稳定地传输数据是多时钟域系统设计者重点关注的问题,在跨时钟域传递数据的系统中,常采用异步FIFO(First In First Out,先进先出队列)口来缓冲传输的数据,以克服亚稳态产生的错误,保证数据的正确传输。

常规的异步FIFO 设计采用先同步读写指针后比较产生空/满标志和用先比较读写指针产生空/满标志,再同步到相应时钟域的方法,但由于常规异步FIFO 模块中的RAM 存储器读写寻址指针常采用格雷码计数器以与“空满”控制逻辑的存在,工作频率低,面积大,将使通过这两个模块的信号通路延时对整个模块的工作频率造成制约。

本文提出了一种新型异步FIFO 的设计方法,该方法省略“了满”信号产生模块和多余的存储器位深来简化常规的FIFO 模块,而只保留“空”信号产生模块,避免使用大量的同步寄存器,减少了面积空间。

FPGA 验证的结果表明,改进后的异步 FIFO 性能有了显著的提高。

关键词:现场可编程门阵列(FPGA )亚稳态空/满标志产高速FIFOABSTRACTWith the increasing of digital system size, a single clock domain designwill greatly limit the digital system performance. To enhance the performance of modern digital systems, multiple clock domain design is conventionally adopted. While being transmitted, Cross-clock domain signals will come across the phenomenon of metastability, hence it will be a major concern for the multi -clock domain system designers to probe how to maintain the system stability and to have data transmission conducted smoothly. As to the bus system data transmission in the system where the two data interface clocks don’t match, one of super and effective solutions is to use asynchronous FIFO buffer memory. How To solve the key and difficult issue that metastability and how to generate empty and full flag correctly in asynchronous FIFO design. Traditional FIFO design often synchronizes write/read address first, then compares them to generate empty/full signals or empty / full flag first compare the read and write pointer, and then synchronized to the clock domain, This design takes on too much area and can only work at a low frequency,this will allow the signaling pathways of these two modules delay caused by constraints of the operating frequency of the entire module. A new method of asynchronous FIFO is proposed to overcome these problems,omit the "full" signal generator module and redundant memory bit depth to simplify the conventional FIFO module, leaving only the "empty" signal generation module,avoid the use of a large number of synchronization registers, reducing the area of space. FPGA verification results show that the asynchronous FIFO improved performance has been significantly improved.Keywords: Field Programmable Gate Array (FPGA); Metastable; Mmpty / Full Flag production; High-speed FIFO目录摘要 (I)ABSTRACT (I)第一章绪论 (1)1.1研究背景和意义 (1)1.2研究现状 (1)1.3本文的主要工作 (3)1.4论文结构 (3)第二章跨时钟域设计的挑战与实现方法 (3)2.1跨时钟域设计的挑战 (4)2.1.1亚稳态问题 (4)2.1.2亚稳态产生的原因 (5)2.1.3亚稳态的危害 (5)2.2 跨时钟域的实现方法 (6)2.2.1同步器 (6)2.2.2握手机制 (9)第三章开发环境 (11)3.1硬件平台 (11)3.2软件平台 (11)第四章异步FIFO的设计与实现 (13)4.1异步FIFO (13)4.1.1异步FIFO工作原理 (13)4.1.2异步FIFO设计的难点 (14)4.2常见异步 FIFO 的设计 (16)4.2.1 读写地址产生逻辑 (18)4.2.2空/满标志的产生与代码的实现 (19)4.3.3改进的异步 FIFO 设计方法分析 (22)4.4高速异步FIFO的设计与实现 (23)4.4.1常见FIFO模块分析 (23)4.4.2高速异步FIFO 设计 (25)第五章结论 (28)第六章参考文献 (29)致谢 (30)附录高速异步FIFO设计仿真分析 (31)附1. 设计工作流程 (31)附.1.1 设计输入 (31)附.1.2 设计编译 (35)附.1.3 设计仿真 (36)第一章绪论1.1研究背景和意义作为21 世纪最重要的科学领域之一,超级计算机是体现科技竞争力和综合国力的重要标志。

一个异步FIFO的设计示例

一个异步FIFO的设计示例

一、异步FIFO 技术规范1. 总体描述1.1. 功能定义异步FIFO ( First In First Out)指的是在两个相互独立的时钟域下, 数据从一个时钟域写入FIFO 而另一个时钟域又从这个FIFO 中将数据读出。

本设计用8*256的RAM 实现异步FIFO 。

具体功能:1. 写使能有效,且FIFO 不为满时,在写时钟的上升沿向FIFO 中写入数据。

2. 读使能有效,且FIFO 不为空时,在读时钟的上升沿从FIFO 中读出数据。

3. 当FIFO 写满时产生满信号,当FIFO 读空时产生空信号。

1.2. 应用范围异步FIFO 是用来作为缓冲的存储器, 它能对数据进行快速、顺序的存储和发送, 主要用来解决不同速率器件间的速率匹配问题。

2. 引脚描述8*256异步FIFO rst r_clkr_en data_in[7:0]full empty w_clkw_endata_out[7:0]图12.1. 引脚功能描述 信号名输入/输出 功能描述r_clk输入 读数据时钟信号 w_clk 输入 写数据时钟信号data_in[7:0] 输入8位的输入数据r_en 输入读使能,高电平有效,在FIFO非空时,clk上升沿读入数据;w_en 输入写使能,高电平有效,在FIFO非满时,clk上升沿写入数据;rst 输入异步清零,低电平有效,低电平时读地址,写地址,计数器都清零。

empty 输出空信号,高电平有效,当FIFO读空时其值为1full 输出满信号,高电平有效,当FIFO写满时其值为1 data_out[7:0] 输出8位的输出数据2.2.引脚时序描述当写满时full由低变高,当读空时empty由低变高。

只要不为满full就为低,不为空empty就为低。

3.顶层模块划分。

异步FIFO设计

异步FIFO设计

【转】/s/blog_6592e7700100x68n.html异步FIFO是一种先进先出电路,用在需要实时数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。

异步FIFO与同步FIFO最大的不同在于异步FIFO读写时钟不同,通常异步FIFO用来做数据的时钟域转换,FIFO设计中难度最大的地方在FIFO的空满标识的产生,对同步FIFO来说,由于读写指针的增加时钟频率相同,因此读写指针可以直接进行比较产生出空满标志,而异步FIFO某由于读写两端时钟频率不同,读写指针需要进行时钟域转换后才能进行比较,也就是读时钟域的读地址要先转到写时钟域,然后与写时钟域的写地址进行比较,而实际这种比较时存在一定风险的。

异步FIFO设计一般的结构有:双口存储器、读地址产生逻辑、写地址产生逻辑、空/满标志产生逻辑四部分构成。

图1是一种常用的异步FIFO设计方案,其中,读地址(rptr)和空标志(rempty)由读时钟(rclk)产生,而写地址(wptr)和满标志(wfull)由写时钟(wclk)产生。

把写地址与读地址相互比较以产生空/满标志。

由于读写地址的变化由不同的时钟产生,所以对FIFO 空或满的判断是跨时钟域的。

如何避免异步传输带来的亚稳态以及正确地产生空/满标志是设计异步FIFO的难点。

图1在设计时,需要弄清楚以下几个方面:1.首先确定输入输出接口,异步FIFO在一个时钟域中进行写数据操作,而在另一个时钟域中进行读数据操作,所以在写数据模块,需要有写数据wdata,写时钟wclk,写复位wrst_n,写请求wreq,写满标志wfull;在读数据模块,需要有读数据rdata,读时钟rclk,读复位rrst_n,读请求rreq,读空标志rempty。

其中rdata,rempty,wfull为输出信号,其余为输入信号。

其FIFO用来存储16*8数据(数据宽为8,数据深度为16)的顶层模块如下://异步FIFO缓存16*8数据,即数据宽度为8,深度为16//module yibufifo(rdata,rempty,rrep,rclk,rrst_n,wdata,wfull,wrep,wclk,wrst_n);input wclk,wrep,wrst_n;input rclk,rrep,rrst_n;input[7:0]wdata;output[7:0]rdata;output rempty,wfull;wire wclk,wrep,wrst_n;wire rclk,rrep,rrst_n;wire [7:0]wdata;wire [7:0]rdata;wire [3:0]wptr,rptr;wire [3:0]waddr,raddr;wire aempty_n,afull_n;ram i1(.wdata(wdata),//读写存储模块.rdata(rdata),.waddr(wptr),//地址与指针同步.raddr(rptr),//.wrep(wrep),.wclk(wclk));async_cmp i2(.aempty_n(aempty_n),//异步比较读写指针产生异步空满标志.afull_n(afull_n),.wptr(wptr),.rptr(rptr),.wrst_n(wrst_n));rptr_empty2 i3(.rempty(rempty),//根据rclk产生读指针rptr和空标志rempty.rptr(rptr),.aempty_n(aempty_n),.rrep(rrep),.rclk(rclk),.rrst_n(rrst_n));wptr_full2 i4(.wfull(wfull),//根据wclk产生写指针wptr和满标志wfull.wptr(wptr),.afull_n(afull_n),.wrep(wrep),.wclk(wclk),.wrst_n(wrst_n));endmodule顶层模块图:其中2.1 读写地址产生逻辑(本设计中读写地址与读写指针同步)读写地址线一般有多位,如果在不同的时钟域内直接同步二进制码的地址指针,则有可能产生亚稳态。

异步FIFO设计

异步FIFO设计

,异步FIFO设计文档一、概述在大规模ASIC或FPGA设计中,多时钟系统往往是不可避免的,这样就产生了不同时钟域数据传输的问题,其中一个比较好的解决方案就是使用异步FIFO 来作不同时钟域数据传输的缓冲区,这们既可以使相异时钟域数据传输的时序要求变得宽松,也提高了它们之间的传输效率。

此文内容就是阐述异步FIFO的设计。

二、设计原理结构框图Fig. 2.1.1如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的读指针rd_ptr采集到写时钟(wr_clk)域,然后和写指针wr_ptr进行比较从而产生或撤消写满标志位wr_full;类似地,同步模块synchronize to read clk 的作用是把写时钟域的写指针wr_ptr采集到读时钟域,然后和读指针rd_ptr 进行比较从而产生或撤消读空标志位rd_empty。

~另外还有写指针wr_ptr和写满标志位wr_full产生模块,读指针rd_ptr 和读空标志位rd_empty产生模块,以及双端口存储RAM模块。

二进制计数器存在的问题异步FIFO读写指针需要在数学上的操作和比较才能产生准确的空满标志位,但由于读写指针属于不同的时钟域及读写时钟相位关系的不确定性,同步模块采集另一时钟域的指针时,此指针有可能正处在跳变的过程中,如图Fig.2.2.1所示,那么采集到的值很有可能是不期望的值,当然,不期望的错误结果也会随之发生。

Fig. 2.2.1上图中,rd_ptr2sync 3和4以及4和5之间的中间态是由于到各寄存器的时钟rd_clk存在偏差而引起的。

二进制的递增操作,在大多数情况下都会有两位或者两以上的bit位在同一个递增操作内发生变化,但由于实际电路中会存在时钟偏差和不同的路径延时,二进制计数器在自增时会不可避免地产生错误的中间结果,如图Fig.2.2.2。

Fig.2.2.2…上图是Fig.2.2.1的电路原型以及局部波形的放大。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

异步FIFO的设计
FIFO体的描述
读指针被写时钟采样的模块
写指针被读时钟采样的模块
判 别 为 空 的 设 计 模 块
FIFO
判 别 为 满 的 设 计 模 块
FIFO
异 步 结 构
FIFO
关于异步FIFO设计更多的资料
//FIFO读操作 if ((Rreq==1’b1) && (Count >0)) begin RData <= FIFO[Rptr]; Rptr <= (Rptr +1 ) %N; REn <= 1’b1; end else REn <= 1’b0;
1. HDL设计描述是否存在问题?
//Count 计数 if ((Rreq==1) && (Wreq!=1) && Count >0) Count = Count -1; if ((Wreq==1) && (Rreq!=1) && Count <N) Count = Count +1;
同步FIFO的操作
FIFO 的初始化只进行一次,FIFO的读进程、 写进程、Count的计数进程相互之间并行。 如何将上述进程(算法)转化为相应的硬件 实现?
同步FIFO设计
• 根据FIFO的大小N,决定Count、Wptr、 Rptr的位宽log2N; • 设置寄存器分别保存Count、Wptr、Rptr的 值; • 同步FIFO必须有异步Reset; • 当FIFO复位时,Count=0,Wptr=0, Rptr=0; • FIFO正常操作时,受时钟控制。
异步FIFO的设计
• 异步FIFO的数据读、写受不同时钟的控制; • 异步FIFO的空、满状态不能依靠计数的方 式进行,因为读、写均需要对计数器进行 操作; • 如何判断异步FIFO的空、满情形?如何操 作?
如何判断异步FIFO的空、满?
异步FIFO为空条件: Reset情形下,异步FIFO为空; 在正常读、写情形,当读指针追上写指针, 异步FIFO为空。 异步FIFO为满条件: 在正常读、写情形,读、写指针相同,且 写指针追上读指针时。 读、写指针均相同时,FIFO到底是空还是满?
HDL 设计描述实例
----FIFO设计
国防科技大学计算机学院微电子研究所610室
曾献君
FIFO类型
• 同步控制的FIFO FIFO的读写时钟相同。 • 异步控制的FIFO 用于跨时钟域的数据交换; FIFO的读写时钟不同、读写时钟之间不一 定存在相位、周期方面的约束关系;
同步FIFO设计
同步FIFO存在3种状态: 空; 满; 非空非满 FIFO为空,不可从FIFO读数据,但可写; FIFO为满,不可向FIFO写数据,但可读; 非空非满时,FIFO可读、可写。 FIFO的读写受同一时钟控制; FIFO的大小为N字
同步FIFO的操作
1、 同步FIFO的外部接口信号
时钟信号clk:控制FIFO的读写; 写请求信号Wreq: 向FIFO发送写请求信号; 写数据WData[Size-1:0] : 写数据; 写有效信号WEn:WEn=1表示写有效,否则写无 效,作废写请求,并使写请求等待; 读请求信号Rreq: 向FIFO发送读请求信号; 读数据RData[Size-1:0] : 读数据; 读有效信号REn:REn=1表示读有效,否则读无 效,作废读请求,并使读请求等待;
同步FIFO的操作
• FIFO的操作可用下述几个进程表示: 1)初始化进程: Count = Wptr = Rptr =0; 2)FIFO读进程: if (Rreq ==1 && Count >0) begin RData = FIFO[Rptr]; Rptr = (Rptr +1 )mod N; REn = 1; end
always @(posedge clk or negedge Reset) if (~Reset) REn <= 1’b0; else //FIFO读操作 begin if ((Rreq==1’b1) && (Count >0)) begin RData <= FIFO[Rptr]; Rptr <= (Rptr +1 ) %N; REn <= 1’b1; end else REn <= 1’b0; end
module Synch_FIFO(clk, Reset, Wreq, WData, Rreq, RData, WEn, REn); parameter Size = 64; input clk; input Reset; input Wreq; input [Size-1] WData; input Rreq; output [Size-1] RData; output WEn; output REn;
end
2. 问题出现在哪里?
3. 如何改进设计描述?
always @(posedge clk or negedge Reset) if (~Reset) begin always @(posedge clk or negedge Reset) Count <= 0; if (~Reset) //初始化 Wptr <= 0; WEn = 1’b0; Rptr <= 0; else end begin // FIFO 写操作 else if ( (Wreq ==1’b1) && (Count < N)) begin //Count 计数 begin if ((Rreq==1) && (Wreq!=1) && Count >0) FIFO[Wptr] <= WData; Count = Count -1; Wptr <= (Wptr +1) % N; if ((Wreq==1) && (Rreq!=1) && Count <N) WEn <= 1’b1; Count = Count +1; end end else WEn <= 1’b0; end
同步FIFO的操作
3) FIFO 写进程
if (Wreq==1 && Count < N) begin FIFO[Wptr] = WData; Wptr = (Wptr +1) mod N; WEn = 1; end
4) Count 计数进程
if (Wreq ==1 && Count < N && Rreq !=1) Count = Count +1; if (Rreq == 1 && Count >0 && Wreq !=1) Count = Count -1;
同步FIFO的操作
1、 同步FIFO的操作
当FIFO不满且Wreq有效时,向FIFO写数据,并 置写使能WEn有效; 当FIFO不空且Rreq有效时,从FIFO从读出数据 并置读使能REn有效; 当FIFO满且Wreq有效时,置写使能WEn无效且 作废此次写操作; 当FIFO空且Rreq有效时,置读使能REn无效且作 废此次读操作。
同步FIFO的操作
问题: 1. 如何判断FIFO为空、满? 2. FIFO的读写操作的位置如设置一个Count计数器,用于计数FIFO中的 元素的个数,Count<=N; 设置FIFO的读指针Rptr,0<=Rptr <= N-1; 设置FIFO的写指针Wptr,0<=Wptr <= N-1; FIFO初始操作时,Count=0, Rptr = Wptr = 0.
parameter L = log2N ; reg [Size-1] RData; reg WEn, REn; reg [L-1:0] Count; reg [L-1:0] Wptr; reg [L-1:0] Rptr;
always @(posedge clk or negedge Reset) if (~Reset) //初始化 begin Count <= 0; Wptr <= 0; Rptr <= 0; end else begin // FIFO 写操作 if ( (Wreq ==1’b1) && (Count < N)) begin FIFO[Wptr] <= WData; Wptr <= (Wptr +1) % N; WEn <= 1’b1; end else WEn <= 1’b0;
相关文档
最新文档