异步FIFO的设计
quartus 异步fifo用法 -回复
quartus 异步fifo用法-回复quartus异步FIFO用法引言:在数字电路设计中,FIFO(First In First Out)是一种常见的数据存储器,它允许数据以先进先出的顺序进出。
在使用Quartus进行FPGA设计时,异步FIFO是一种非常有用的工具,它可以帮助我们处理不同速度的数据流,并实现数据的缓冲和流量控制。
本文将介绍Quartus异步FIFO的基本概念和使用方法,并给出一些实例。
第一部分:Quartus异步FIFO概述1.1 什么是异步FIFO?异步FIFO是一种数据存储器,在其中数据可以以不同速度进入和退出。
与同步FIFO不同,异步FIFO的读写时钟可以是不同的,这使得它可以处理速度不匹配的数据流。
Quartus提供了异步FIFO的库函数和IP核,使得它可以在FPGA设计中方便地使用。
1.2 Quartus异步FIFO的特点Quartus异步FIFO具有以下特点:- 可以使用不同的时钟频率进行读写操作。
- 可以配置不同的缓冲深度来满足特定的设计需求。
- 可以实现流量控制和数据的重排序。
- 可以支持并行读写和读写使能信号。
- 可以适应不同的数据宽度和时钟域要求。
第二部分:Quartus异步FIFO的使用方法2.1 创建异步FIFO在Quartus中创建异步FIFO的方式有两种:使用库函数和使用IP核。
使用库函数创建异步FIFO的步骤如下:- 首先,在Quartus中打开设计工程,并创建一个新的源文件。
- 然后,将异步FIFO的库函数导入到源文件中,以便在设计中调用它。
- 接着,实例化异步FIFO,并通过参数配置其属性,例如宽度,深度,时钟域等。
- 最后,将异步FIFO连接到其他逻辑模块,完成设计。
使用IP核创建异步FIFO的步骤如下:- 首先,在Quartus中打开设计工程,并创建一个新的IP核。
- 然后,在IP核的界面中选择合适的FIFO类型和配置参数。
- 接着,将异步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进行前仿真和后仿。
异步FIFO的VHDL设计
异步FIFO的VHDL设计下面是一个异步FIFO的VHDL设计示例:```vhdllibrary ieee;use ieee.std_logic_1164.all;entity AsyncFIFO isgenericDATA_WIDTH : natural := 8; -- 数据宽度FIFO_DEPTH : natural := 16 -- FIFO深度portclk : in std_logic; -- 时钟信号rst : in std_logic; -- 复位信号read_en : in std_logic; -- 读使能write_en : in std_logic; -- 写使能read_data : out std_logic_vector(DATA_WIDTH-1 downto 0); -- 读数据write_data : in std_logic_vector(DATA_WIDTH-1 downto 0); -- 写数据full : out std_logic; -- FIFO满标志empty : out std_logic -- FIFO空标志end AsyncFIFO;architecture Behavioral of AsyncFIFO istype buffer_array is array (FIFO_DEPTH-1 downto 0) ofstd_logic_vector(DATA_WIDTH-1 downto 0);signal buffer : buffer_array; -- 数据缓冲区signal wr_ptr : natural range 0 to FIFO_DEPTH-1; -- 写指针signal rd_ptr : natural range 0 to FIFO_DEPTH-1; -- 读指针signal count : natural range 0 to FIFO_DEPTH-1; -- 缓冲区中数据个数beginprocess (clk)beginif rising_edge(clk) thenif rst = '1' thenwr_ptr <= 0;rd_ptr <= 0;count <= 0;elseif write_en = '1' and full = '0' then -- 写使能且FIFO非满buffer(wr_ptr) <= write_data;wr_ptr <= wr_ptr + 1;count <= count + 1;end if;if read_en = '1' and empty = '0' then -- 读使能且FIFO非空read_data <= buffer(rd_ptr);rd_ptr <= rd_ptr + 1;count <= count - 1;end if;end if;end if;end process;full <= '1' when count = FIFO_DEPTH-1 else '0';empty <= '1' when count = 0 else '0';end Behavioral;```在上面的代码中,`DATA_WIDTH`和`FIFO_DEPTH`是异步FIFO的泛型参数,可以根据实际需求进行配置。
异步先进先出fifo设计报告
异步先进先出FIFO设计报告一、设计目的介绍FIFO的定义,工作原理,对其管脚进行详细的阐述,并对其功能实现进行具体操作和演示。
通过本次设计为以后数字电路设计中处理连续数据流和信号同步、减少CPU 负担等问题打下良好基础。
二、实验器材和工具软件PC机一台、ISE13.1软件、Modelsim软件三、设计内容及原理1、内容(1)FIFO模块的读时钟周期20ns,写时钟周期40ns,前20ns复位信号有效。
(2)FIFO模块的写使能信号前95ns无效,持续1285ns有效后又无效;读使能信号前1600ns无效,持续1880ns有效后又无效。
(3)40ns后读入数据,数据从0开始每隔40ns加1,直至累加到32为止。
2、异步先进先出FIFO原理该设计就是使用Xilinx公司提供的块RAM资源和IP核生成器产生的FIFO (First In First Out)队列,即先进先出的队列,其结构如图1所示。
图1 异步FIFO结构在FIFO具体实现时,数据存储的部分是采用简单双端口模式操作的,一个端口只写数据而另一个端口只读数据,另外在RAM(块RAM和分布式RAM)周围加一些控制电路来输出知识信息。
FIFO最重要的特征是具有满(FULL)和空(EMPTY)的指示信号,当FULL信号有效时(高电平),就不能再往FIFO 中写入数据,否则会造成数据丢失;当EMPTY信号有效时(高电平),就不能从FIFO中读取数据,此时输出端口处于高阻态。
图1给出了本次设计所用到的异步FIFO的结构图,其接口信号描述如下。
DIN[N:0]:数据输入端,当写FIFO时使用该总线。
WR_CLK:写时钟,所有写相关的信号与该时钟同步。
WR_EN:写使能,如FIFO不满,当该信号有效时,数据写入到FIFO中。
RD_CLK:读时钟,所有读相关的信号与该时钟同步。
RD_EN:读使能,如FIFO不空,当该信号有效时,数据从FIFO中读出。
DOUT[N:0]:数据输出端,当读FIFO时使用该总线。
异步fifo设计及时序约束设置
一、前言跨时钟域的同步处理,使用异步FIFO是常用的方式之一,对于异步FIFO的设计,网上的大部分资料来源于《Simulation and Synthesis Techniques for Asynchronous FIFO Design》一文其异步FIFO的结构如下图所示本文不是介绍上图描述的设计。
我从基本的数字电路时序开始,介绍异步FIFO的相关问题。
最后介绍如何用时序约束保证设计的正确性二、数字电路时序对于数字电路来讲,我们的信号在时钟边沿发生变化,Dat1信号是一种理想情况,而Dat2是实际情况,其特点是一、相对时钟边沿有延时二、信号变化有一段时间(电平转换时间),在这段时间就是亚稳态在亚稳态期间进行数据采样,不能获得稳定的值。
数字电路中经过时序约束,在T1产生的信号,在T2一定稳定(否则就是不满足时序),所以对于只有一个时钟的数字电路来说,它在T1和T2都能获得稳定的信号(T1时刻的值为0、T2时刻的值为1)三、跨时钟域时序问题对于异步时钟而言(相位不同),对于CLK1产生的信号,CLK2有可能在任意时刻进行数据采样在FIFO的设计中,将会产生2种信号,一种是数据本身(用Data表示),另外一种是指示数据是否有效(用valid表示),注意(valid不一定是一个比特的寄存器,可以是由FIFO中的读写指针产生而来,例如fifo的full或empty状态)异步FIFO的问题在于,如果CLK2在时钟T2进行采样,那么有可能得到valid有效,而数据无效的情况。
这样在CLK2采样取得的设计就是错误的数据。
四、处理异步FIFO的valid和data(理论基础)我们假设valid为低电平表示没有数据,高电平为有数据,解决的办法就是,当CLK对valid进行采样时,即使valid处于亚稳态期间,数据信号也是稳定的如上图所以,在T1时刻进行上升沿采样,虽然valid是一个亚稳态状态,但是此时Data 是一个稳定的值,如果在T1时刻采样的valid为1,那么可以得到稳定的Data信号,如果在T1时刻采样的valid为0,那么控制逻辑认为在T1无法获得数据,从而在下一个时钟获取注意:T2时刻是在下降沿进行采样,而此时的Data信号也是稳定的五、如何实现为了让valid和Data处于上面的状态,我们可以对valid进行延时处理,即使用时钟对其进行采样,必须使用2个寄存器依次采样,才能保证至少有一个时钟的延时valid1是CLK2对valid进行采样产生的,如果采样的时机不好,那么valid1相对valid只有一点点延时,valid2是CLK2对valid1的采样,这样valid2相对于valid至少有CLK2一个周期的延时,也就满足了第二节的条件。
一个异步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. 引脚描述图12.1. 引脚功能描述2.2.引脚时序描述当写满时full由低变高,当读空时empty由低变高。
只要不为满full就为低,不为空empty就为低。
3.顶层模块划分图2顶层模块说明:1.ram_fifo :存储器模块,用于存放及输出数据;2.w_addr_reg : 保存访问RAM的写地址;3.r_addr_reg : 保存访问RAM的读地址;4.w_addr_adder : 计算RAM下一个写地址;5.r_addr_adder: 计算RAM下一个读地址;6.cmp : 将读地址和写地址进行比较产生空满标志。
设计思想说明:FIFO满空的判定:当读地址的值加1之后等于写地址的值时,表明FIFO写满,当写地址的值加一之后等于读地址的值时,表明FIFO读空。
在初始状态时FIFO的读地址在RAM的中间位置,写地址在RAM的开始位置,所以初始状态FIFO不满也不空。
空满信号的产生由组合电路产生。
4.功能模块描述4.1.ram_fifo模块ram_fifo:RAM存储器。
用8*256双口RAM实现。
4.2.w_addr_reg模块w_addr_reg模块:写地址寄存器。
异步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的使用及设计难点根据FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。
同步FIFO是指读时钟和写时钟为同一个时钟。
在时钟沿来临时同时发生读写操作。
异步FIFO是指读写时钟不一致,读写时钟是互相独立的。
FIFO设计的难点在于怎样判断FIFO的空/满状态。
为了保证数据正确的写入或读出,而不发生溢出或读空的状态出现,必须保证FIFO在满的情况下,不能进行写操作。
在空的状态下不能进行读操作。
怎样判断FIFO的满/空就成了FIFO设计的核心问题。
由于同步FIFO 几乎很少用到,这里只描述异步FIFO的空/满标志产生问题。
在用到触发器的设计中,不可避免的会遇到亚稳态的问题(关于亚稳态这里不作介绍,可查看相关资料)。
在涉及到触发器的电路中,亚稳态无法彻底消除,只能想办法将其发生的概率将到最低。
其中的一个方法就是使用格雷码。
格雷码在相邻的两个码元之间只由一位变换(二进制码在很多情况下是很多码元在同时变化)。
这就会避免计数器与时钟同步的时候发生亚稳态现象。
但是格雷码有个缺点就是只能定义2^n的深度,而不能像二进制码那样随意的定义FIFO的深度,因为格雷码必须循环一个2^n,否则就不能保证两个相邻码元之间相差一位的条件,因此也就不是真正的格雷码了。
第二就是使用冗余的触发器,假设一个触发器发生亚稳态的概率为P,那么两个级联的触发器发生亚稳态的概率就为P的平方。
但这会导致延时的增加。
亚稳态的发生会使得FIFO出现错误,读/写时钟采样的地址指针会与真实的值之间不同,这就导致写入或读出的地址错误。
由于考虑延时的作用,空/满标志的产生并不一定出现在FIFO真的空/满时才出现。
可能FIFO还未空/满时就出现了空/满标志。
这并没有什么不好,只要保证FIFO不出现overflow or underflow 就OK了。
格雷码:在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。
异步FIFO设计
异步FIFO设计
摘要:本文介绍如何应用美国QUICKLOGIC 公司的QUICKRAM 器件设
计高速、高可靠异步FIFO(Asynchronous FIFO)。
异步FIFO 广泛地用于计算机网络工业中进行非同步数据传送,这里的非同步指按一种速率发送而按另一速率接收。
因此异步FIFO 有两个不同的时钟,
一个为读同步时钟,一个为写同步时钟。
当数据从一个时钟驱动的模块进入另一个时钟驱动的模块时,一个需仔细
解决的问题就出现了。
例如当写时钟比读时钟快时,未读走数据有可能被新数
据覆盖,因而导致数据丢失。
为了解决这个问题,就必须增加一些控制信号和
状态信号,控制信号如pusb、pop,状态信号如empty,almostempty,full,almost- full。
功能描述
典型的异步FIFO(AsynFIFO)都是由异步双端口RAM 和控制逻辑构成,控制逻辑包含读指针和写指针。
当FIFO 中有数据而非空时,POP 信号(同步于读时钟)用于控制数据的读出,所读数据来自读指针所指的(AUAL PORT RAM)中的存储单元,并且读指针加一。
当读指针赶上写指针时,FIFO 为空并且用empty 信号(同步于读时钟)来指示这种情况。
当FIFO 中有空间而非满时,PUSH 信号(同步于写时钟)用于控制数据的写入,所写数据写入写指针所指的双端口RAM 中的存储单元,并且写指针加一。
当写指针赶上读指针时,FIFO 为满足并且用full 信号(同步于写时钟)来指示这种情况。
当FIFO 中只剩不足三个数据时,almost-empty 有效(同步于读时钟)。
类似。
一个异步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设计
【转】/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(First-In First-Out)是一种常见的同步和异步信号之间的缓冲器。
由于FIFO是在不同的时钟域上操作,因此需要考虑时序约束以确保数据正确传输。
本文将介绍异步FIFO的时序约束及其重要性。
一、异步FIFO简介异步FIFO是一种存储器,它可以在不同的时钟域上读写数据。
在数字电路设计中,FIFO被广泛应用于解决不同时钟域之间的数据传输问题。
由于异步FIFO 涉及跨时钟域的操作,因此需要特别注意时序约束,以避免数据冲突和亚稳态问题。
二、异步FIFO时序约束异步FIFO的时序约束主要包括以下几个方面:1.读/写时钟域的约束:为了保证数据的正确传输,读/写时钟域必须满足一定的时序要求。
具体来说,写时钟域的频率应该高于读时钟域的频率,以避免数据在FIFO中溢出。
同时,两个时钟域之间的相位差也应该控制在一定的范围内,以避免数据读写时出现冲突。
2.读/写指针的约束:读/写指针是FIFO中用于追踪读写位置的变量。
为了保证数据的正确读写,读/写指针必须满足一定的时序要求。
具体来说,写指针的更新应该发生在写时钟域的上升沿,而读指针的更新应该发生在读时钟域的上升沿。
这样可以确保在正确的时钟周期内进行数据读写操作。
3.数据有效性的约束:由于异步FIFO涉及跨时钟域的操作,因此需要考虑数据的有效性。
具体来说,当读指针小于写指针时,FIFO中的数据是有效的;而当读指针大于或等于写指针时,FIFO中的数据是无效的。
因此,需要根据实际情况对数据的读写进行控制,以确保数据的正确性。
4.空/满标志的约束:空/满标志是用于指示FIFO是否为空或满的标志位。
为了保证数据的正确传输,空/满标志必须满足一定的时序要求。
具体来说,当FIFO为空或满时,相应的标志位应该被及时更新;而当FIFO不为空或满时,相应的标志位应该保持不变。
这样可以确保在正确的时钟周期内进行数据读写操作。
三、结论异步FIFO时序约束是数字电路设计中需要考虑的重要问题之一。
高速异步FIFO毕业设计思路与设计要求
一、原理及系统结构FIFO(First In First Out)是一种特殊的存储器件,它可以实现存储数据的先进先出,因而在接口电路中有着广泛的应用。
在多时钟电路系统中,它可以充当数据缓冲器,从而实现不同电路系统之间的数据交换。
我认为可以把FIFO理解为一块特殊的存储器,只不过它的读写指针严格遵循先进先出的原则,而不是像普通RAM一样可以指向任意存储单元。
在本次课设中所设计FIFO为异步FIFO,其规格为32X8,其大致框图如下各端口说明:输入:data_in:输入8位数据;rd_en: 读使能端,当rd_en=1时,可以读出数据;wr_en: 写使能端,当wr_en=1时,可以写入数据;wclk: 写时钟信号,在时钟的上升沿进行采样;rclk: 读时钟信号,在时钟的上升沿进行采样;rst: 复位信号,当rst=0时,计数器及读写都被清零(即:读写地址指针都指向0)输出:data_out:输出8位数据;full:FIFO状态信号,当full=1时,表明该FIFO存储器已经写满;empty:FIFO状态信号,当empty=1时,表明该FIFO存储器已经读空;halffull:FIFO状态信号,当halffull=1时,表明FIFO存储器已经处于半满状态。
Compare信号:输出FIFO的实时已使用容量。
二、设计思想:在进行异步FIFO设计时,主要有以下几个关键问题:1、如何表示32x8的FIFO存储体;2、如何进行数据的读写;3、如何判断空状态、满状态和半满状态乃至输出实时已使用容量;4、如何避免亚稳态的出现。
三、设计要求1、模块代码实现及仿真、波形分析2、电路综合。
异步FIFO
使用FIFO同步源自不同时钟域的数据是在数字IC设计中经常使用的方法,设计功能正确的FUFO会遇到很多问题,探讨了两种不同的异步FIFO的设计思路。
两种思路都能够实现功能正确的PIFO。
本文所研究的FIFO,从硬件的观点来看,就是一块数据内存。
它有两个端口,一个用来写数据,就是将数据存入FIFO;另一个用来读数据,也就是将数据从FIFO当中取出。
与FIFO操作相关的有两个指针,写指针指向要写的内存部分,读指针指向要读的内存部分。
FIFO控制器通过外部的读写信号控制这两个指针移动,并由此产生FIFO空信号或满信号。
对于异步FIFO而言,数据是由某一个时钟域的控制信号写入FIFO,而由另一个时钟域的控制信号将数据读出FIFO。
也就是说,读写指针的变化动作是由不同的时钟产生的。
因此,对FIFO空或满的判断是跨时钟域的。
如何根据异步的指针信号对FIFO的满状态或空状态进行正确的判断是本文研究的重点。
此外,设计过程中的一些细节问题也将在文中涉及到。
1 指针以及满空信号的产生为了更好地说明问题,先探讨一下同步FIFO指针移动以及满空信号的产生过程。
对于同步FIFO,读写指针都指向一个内存的初始位置,每进行一次读写操作,相应的指针就递增一次,指向下一个内存位置。
当指针移动到了内存的最后一个位置时,它又重新跳回初始位置。
在FIFO非满或非空的情况下,这个过程将随着读写控制信号的变化一直进行下去。
如果FIFO处于空的状态,下一个读动作将会导致向下溢出(underflow),一个无效的数据被读人;同样,对于一个满了的FIFO,进行写动作将会导致向上溢出(overflow),一个有用的数据被新写入的数据覆盖。
这两种情况都属于误动作,因此需要设置满和空两个信号,对满信号置位表示FIFO处于满状态,对满信号复位表示FIFO非满,还有空间可以写入数据;对空信号置位表示FIFO处于空状态,对空信号复位表示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的设计版本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设计的重点难点进行分析,最后给出详细代码。
一、F1FO简单讲解FIFO的本质是RAM,先进先出重要参数:fif。
深度(简单来说就是需要存多少个数据)fif。
位宽(每个数据的位宽)FIFO有同步和异步两种,同步即读写时钟相同,异步即读写时钟不相同同步F1FO用的少,可以作为数据缓存异步FIFO可以解决跨时钟域的问题,在应用时需根据实际情况考虑好fifo 深度即可本次要设计一个异步FIFO,深度为8,位宽也是&代码是学习Simu1ation andSynthesis Techniquesfor AsynchronousFIFODesignC1iffordE.Cu mmings,SunburstDesign,InC.这篇文章的,百度搜搜很容易找到,虽然是英文的但是写的酸值得研究。
下面我会对设计的要点进行分析,也是对自己学习过程的一个总结,希望能和大家交流共同进步。
二、设计要点解析1、读空值号如何产生?写满信号如何产生?读空信号:复位的时候,读指针和写指针相等,读空信号有效(这里所说的指针其实就是读地址、写地址)当读指针赶上写指针的时候,写指针等于读指针意味着最后一个数据被读完,此时读空信号有效写满信号:当写指针比读指针多一圈时,写指针等于读指针意味着写满了,此时写满信号有效我们会发现读空的条件是写指针等于读指针,写满的条件也是写指针等于读指针,到底如何区分呢?解决方法:将指针的位宽多定义一位举个例子说明:假设要设计深度为8的异步FIFO,此时定义读写指针只需要3位(2-3二8)就够用了,但是我们在设计时将指针的位宽设计成4位,最高位的作用就是区分是读空还是写满,具体理论1如下当最高位相同,其余位相同认为是读空当最高位不同,其余位相同认为是写满注意:理论1试用的是二进制数之间的空满比较判断。
但是这篇文章中确不是这样比较的,而是用的理论2,这里我解释一下由于文章在设计中判断是读指针是否等于写指针的时候,用的是读写指针的格雷码形式(为什么用格雷码后面解释),此时若用上面的理论1就会出问题,因为格雷码是镜像对称的,若只根据最高位是否相同来区分是读空还是写满是有问题的,详情我会慢慢说,请看图1绿色框起来的是0-15的格雷码,用红线将格雷码分为上下两部分通过观察格雷码相邻位每次只有1位发生变化,且上下两部分,除了最高位相反,其余位全都关于红线镜像对称,7—>8,格雷码从0100->1100,只有最高位发生变化其余位相同6->9,格雷码从0101->1101,只有最高位发生变化其余位相同以此类推,为什么要说镜像对称呢?试想如果读指针指向8,写指针指向7,我们可以知道此时此刻并不是读空状态也不是写满状态但是如果在此刻套用理论1来判断,看会出现什么情况,我们来套一下7的格雷码与8的格雷码的最高位不同,其余位相同,所以判断出为写满。
高速异步FIFO的设计与实现
高速异步FIFO的设计与实现2 异步FIFO的实现读时钟2.1 FIFO设计的难点如何同步异步信号,使触发器不产生亚稳态是设计异步FIFO的难点。
国内外解决此问题的较成熟方法是对写地址膜地址采纳格雷码,本文也挺直采纳格雷码。
异步FIFO设计的另一个难点是如何推断FIFO的空/满状态。
为了保证数据正确的写入或读出。
必需保证异步FIFO在满的状态下.不能举行写操作:在空的状态下不能举行读操作。
通常状况下将存储器组织成一个环形链表。
满/空标记产生的原则是:写满不溢出.读空不多读。
即无论在什么状况.都不应浮现读写地址同时对一个存储器地址操作的状况。
在读写地址相等或相差一个或多个地址的时候,满标记应当有效。
表示此时FIFO 已满,外部电路应停止对FIFO发数据。
在满信号有效时写数据应按照设计的要求,或保持、或抛弃重发。
同理,空标记的产生也是如此。
为了更好的推断满/空标记。
采纳在FIFO本来深度的基础上增强一位的办法,而由该位组成的格雷码并不代表新的地址。
也就是说3位格雷码可表示8位的深度,若再加一位最高位MSB,则这一位加其他三位组成的格雷码并不代表新的地址,也就是说格雷码的0100表示7,而1100仍然表示7,只不过格雷码在经过一个以0位MSB的循环后进入一个以1为MSB的循环,然后又进入一个以0位MSB的循环。
其他的三位码仍然是格雷码。
举例解释:一个深度为8字节的FIFO怎样工作(用法已转换为二进制的指针),N=3,指针宽度为N+I=4。
开头rd_ptr_bin和wr_ptr_bin均为“0000”。
此时FIFO中写入8个字节的数据。
wr_ptr_bin=“1000",rd_ptr_bin=“0000”。
固然,这就是满条件。
现在,假设执行了8次的读操作.使得rd_ptr_bin=“1000”,这就是空条件。
另外的8次写操作将使wr_ptr_bin等于“0000”,但rd_ptr_bin仍然等于“1000”,因此,FIFO为满条件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录题目要求 (1)实验内容 (1)设计工具 (1)1 Quartus 2.8 (1)1.1 Quartus28.的介绍 (1)1.2 Quartus28.的操作流程 (3)2 Modelsim 6.0 (5)功能设计实现 (7)3.1 异步FIFO简介 (7)3.2 FIFO的参数 (8)3.3 FIFO的设计原理 (8)3.4 FIFO的verlog源码 (14)3.5 用modelsim仿真FIFO (19)结果分析与结论 (22)仿真波形 (22)仿真结果 (23)题目要求:此异步FIFO的RAM大小为32*8 。
由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出。
写入和读出的操作由时钟的上升沿触发。
当FIFO的数据满和空的时候分别设置相应的高电平加以指示,读和写的时钟域不相同。
实验内容:一、设计工具1.Quartus2.81、1 Quartus2 8.0的介绍Max+plus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。
目前Altera已经停止了对Max+plus II 的更新支持。
Quartus II 是Altera公司继Max+plus II之后开发的一种针对其公司生产的系列CPLD/PGFA器件的综合性开发软件,它的版本不断升级,从4.0版到10.0版,这里介绍的是Quartus II 8.0版,该软件有如下几个显著的特点:1、1Quartus II 的优点该软件界面友好,使用便捷,功能强大,是一个完全集成化的可编程逻辑设计环境,是先进的EDA工具软件。
该软件具有开放性、与结构无关、多平台、完全集成化、丰富的设计库、模块化工具等特点,支持原理图、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl 脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
1、2 Quartus II对器件的支持Quartus II支持Altera公司的MAX 3000A系列、MAX 7000系列、MAX 9000系列、ACEX 1K系列、APEX 20K系列、APEX II系列、FLEX 6000系列、FLEX 10K系列,支持MAX7000/MAX3000等乘积项器件。
支持MAX II CPLD系列、Cyclone系列、Cyclone II、Stratix II 系列、Stratix GX系列等。
支持IP核,包含了LPM/MegaFunction宏功能模块库,用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
3、Quartus II对第三方EDA工具的支持对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。
Altera的Quartus II可编程逻辑软件属于第四代PLD开发平台。
该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。
Quartus平台与Cadence、ExemplarLogic、MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。
改进了软件的LogicLock模块设计功能,增添了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力.1.3 操作流程(1)建立工程1、在windows桌面上选择quartus||8.0图标,双击打开。
2、选择File→New Project Wizard 新建一项工程。
新建工程向导说明对话框如图所示QuartusⅡ基本操作流程一、打开QuartusⅡ软件并建立工程1、在Windows桌面上选择“开始”→“程序”→Altera→QuartusⅡ9.0,打开QuartusⅡ9.0软件。
2、选择File→New Project Wizard 新建一项工程。
3、单击Next进入下图所示对话框。
任何一项设计都是一项工程Project,必须首先为此工程建立一个放置与此工程相关的所有文件的文件夹,此文件夹将被QuartusⅡ默认为工作库(Work Library)。
注意文件夹不能用汉字,不要将文件夹设在安装目录中。
4、单击Next进入图示对话框。
由于是新建工程,暂无输入文件。
5、单击Next进入图示对话框。
在该对话框中指定目标器件6、单击Next进入图示对话框。
本实验利用QuartusⅡ的集成环境进行开发,不使用任何EDA工具,因此这里不做任何改动。
7、单击Next进入图示对话框。
从该对话框中,可以看到工程文件配置信息报告。
单击Finish,完成新建工程的建立。
需要注意的是,建立工程后,还可以根据设计中的实践情况对工程进行重新设置,可选择Assignments→Settings进行设置。
(2)新建文本设计文件1、在QuartusⅡ主界面中,选择File→New打开如图所示的对话框。
2、选择verilog HDL File,即建立了文本输入文件3、在文件中编写verilog程序,并保存在工程下(3)编译文件在QuartusⅡ主界面下选择Processing→Start Compilation进行全程编译,若在编译过程中发现错误,则造出并更正错误,直至编译成功为止。
在编译硬件系统时,状态窗口显示整个编译进程及每个编译阶段所用时间。
编译结果显示在Compilaation Report窗口中。
2、modelsim 6.0介绍Modelsim仿真工具是Model公司开发的。
它支持Verilog、VHDL以及他们的混合仿真,它可以将整个程序分步执行,使设计者直接看到他的程序下一步要执行的语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以在Dataflow窗口查看某一单元或模块的输入输出的连续变化等,比quartus自带的仿真器功能强大的多,是目前业界最通用的仿真器之一。
ModelSim为HDL仿真工具,我们可以利用该软件来实现对所设计的VHDL或Verilog程序进行仿真,支持IEEE常见的各种硬件描述语言标准。
可以进行两种语言的混合仿真,但推荐大家只对一种语言仿真。
ModelSim常见的版本分为ModelSim XE和ModelSim SE两种,ModelSim 版本更新很快,目前最新版本为5.8版本,该版本支持VHDL的2002标准以及Verilog的2001标准,此外,在该版本的Linux、HP和SUN工作站等平台支持VHDL、Verilog和SystemC的混合仿真,但在Windows平台上不支持SystemC的仿真。
1、Modelsim仿真方法Modelsim的仿真分为前仿真和后仿真,下面先具体介绍一下两者的区别。
1)前仿真前仿真也称为功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟,主要是验证电路与理想情况是否一致。
可综合FPGA代码是用RTL级代码语言描述的,其输入为RTL级代码与Testbench.2)后仿真后仿真也称为时序仿真或者布局布线后仿真,是指电路已经映射到特定的工艺环境以后,综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定时序条件下满足设计构想的过程,是否存在时序违规。
其输入文件为从布局布线结果中抽象出来的门级网表、Testbench和扩展名为SDO或SDF的标准时延文件。
SDO或SDF的标准时延文件不仅包含门延迟,还包括实际布线延迟,能较好地反映芯片的实际工作情况。
一般来说后仿真是必选的,检查设计时序与实际的FPGA运行情况是否一致,确保设计的可靠性和稳定性。
2、Modelsim仿真的基本步骤Modelsim的仿真主要有以下几个步骤:建立库并映射库到物理目录;编译原代码(包括Testbench;执行仿真。
1)建立工程2)编写Verilog代码,生成.v文件。
3)编写测试代码4)编译仿真,生成时序图.二、功能设计实现3.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.3.2 FIFO的参数FIFO的宽度:进行一次读写操作的数据的位宽。
FIFO的深度:双口存储器中能容纳的数据的总数。
满标志: FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出。
空标志: FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出。
读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。
写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。
读指针:指向下一个读出地址。
读完后自动加1。
写指针:指向下一个要写入的地址的,写完自动加1。
读写指针其实就是读写memory的地址,只不过这个地址不能任意选择,而是连续的。
3.3 FIFO的设计原理整体的框图如下:图1.1 FIFO的整体电路图3.3.1 FIFO的读写指针FIFO可以看成是先进新出的缓冲区,它不像普通的存储器那样,有专门的地址信号。
它只能根据地址,顺序地读写缓冲区。