FPGA异步fifo设计完整报告
异步FIFO设计(非常详细,图文并茂,值得一看!)

异步FIFO设计(非常详细,图文并茂,值得一看!)一、概述在大规模ASIC或FPGA设计中,多时钟系统往往是不可避免的,这样就产生了不同时钟域数据传输的问题,其中一个比较好的解决方案就是使用异步FIFO来作不同时钟域数据传输的缓冲区,这样既可以使相异时钟域数据传输的时序要求变得宽松,也提高了它们之间的传输效率。
此文内容就是阐述异步FIFO的设计。
二、设计原理2.1结构框图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模块。
2.2 二进制计数器存在的问题异步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的电路原型以及局部波形的放大。
基于FPGA的异步FIFO设计

目前 兀F O的 内部 结构是 由双 口 R M 加驱 动 双 口 R M 地 址 的计 数器 构成 ,异 步 F. A A I
F O是 由读 写信 号 使计 数 器翻 转 。我们 在 程序 设 计 时也采 用 这 一实 现 方式 ,调 用 F G 内 PA
部集成 的双 端 口 R M 存储 器 ,再加 一些 逻辑 电路来 实 现具 体的操 作 。 O
因此 ,对 FF IO空或 满 的判 断是 跨 时钟 域 的 。根 据异 步 的指针 信 号对 F F 的满状 态 或空 IO
状态 进行 正确 的判 断是实 现异 步 F F 的重 点 和核心 。如何 正 确设计 此 部分 的逻 辑 .直接 IO 影 响到 FF IO的性 能。
空/ 满标 志产 生 的原 则是 无论 在进 行 什么操 作 。都 不应 出 现读 写地址 同时对 一个 存储
FF IO ̄难 点 即空/ 满标 志组成 部分 。最后 给 出 了总的逻 辑仿 真 波形 图验 证本 次设
基于FPGA的异步FIFO设计

收稿日期:!""#$%"$!"作者简介:张维旭(%&’($),男,山东潍坊人,硕士研究生,研究方向为)*+;贺占庄,研究员,硕士生导师,研究方向为计算机控制技术。
基于!"#$的异步!%!&设计张维旭,贺占庄(西安微电子技术研究所,陕西西安’%"",#)摘要:在现代集成电路设计中,一个系统往往包含了多个时钟,如何在异步时钟间传递数据成为一个很重要的问题,而使用异步-.-*可以有效地解决这个问题。
异步-.-*是一种在电子系统中得到广泛应用的器件,文中介绍了一种基于-/012的异步-.-*设计方法。
使用这种方法可以设计出高速、高可靠的异步-.-*。
关键词:-.-*;亚稳态;格雷码;-/12中图分类号:3/4%%5%文献标识码:2文章编号:%,’4$,!&6(!"",)"’$"%,($"4$’()*+,-)-.’!%!&/0’12)34’05-)!"#$78291:;<0=>,8?7@A B 0C @>A B D(6<’A BE <F G H ;I ;F J G H B <F3;F @B H I H D K L;M ;A G F @.B M J <J >J ;,6<’A B ’%"",#,+@<B A )$6’7,4*7:.BN H O ;G B .+O ;M <D B M ,A M K M J ;NA I P A K M F H B J A <B M M ;Q ;G A I F I H F R M S 3G A B M N <J J <B D O A J A A N H B D A M K B F @G H B H >M F I H F R M T ;F H N ;A B <N U H G 0J A B J U G H T I ;N S V >J <J F A B M H I Q ;J @<M U G H T I ;NT K >M <B D A M K B F @G H B H >M -.-*S 2M K B F @G H B H >M -.-*<M A O ;Q <F ;J @A J P A M P <O ;I K >M ;O <B ;I ;F J G H B <F M K M J ;N S 3@<M U A U ;G <B J G H O >F ;M AN ;J @H O H W -.-*O ;M <D B T A M ;O H B-/12S +A B O ;M <D B @<D @M U ;;O A B O G ;I <A T <I <J K A M KB F @G H B H >M -.-*S 80(9-,5’:-.-*;N ;J A M J A T <I <J K ;1G A K +H O ;;-/12:异步!%!&介绍随着现代芯片设计规模的不断扩大,集成电路越来越复杂,一个系统中往往包含多个时钟。
异步FIFO设计

异步FIFO设计2011.6.22摘要本文采用格雷码设计了一个异步FIFO,经过DC综合的结果如下:时钟频率:1.1GHz面积: 10744.447um2功耗: 7.791mw目录1. 异步FIFO的设计 (22)1.1 异步FIFO简介 (22)1.2 FIFO的参数 (22)1.3 FIFO的设计原理 (22)1.4 FIFO的设计模块 (66)1.5 用modelsim仿真FIFO (1111)1.6 用DC对FIFO进行综合 (1313)2.参考文献 (1515)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中写数据而造成溢出。
基于FPGA的高速异步FIFO存储器的设计与实现

信息科技中国科技信息2009年第2期CHINASCIENCEANDTECHNOLOGYINFORMATIONJan.2009基于F1》GA的离述舞步FIFO存储器的设计与实现罗先哲1张仁吉吉2付大鹏21、贵州大学科技学院2、贵州大学电子科学与信息技术学院550025摘要本文在介绍异步FlF0基本原理及结构的基础上,采用VerilogHDL硬件描述语言对异步FIFO存储器进行了RTL级设计。
在设计中采用格雷码对读写地址进行编码,有效的避免了亚稳态的产生;并使用ALTEP,,A公司的集成开发环境quartusIl7.0对设计进行了编译仿真,最后在该公司的Cyclone系列器件EPlC3T100(36上通过了验证。
袭键词H。
蠕异步FIF0;FPGA;格雷码;亚稳态;VerilogHDL曲‰tr∞t-j:镬Thi9paperpresentedtheb;毗prfncip慨arldstrdctbl'eoftheasynchronousFIFOmemory,andgiventilegTLdesignwhichbasedtheVerilogHDLlanguage.InShisdesign,itissucceedineliminatingmetastabilitybyusingGraycodetocodingaddresscode.ThedesigncompiledandsimulatedbyALTERA’ssoftwareQuartusII7.0.Athst,itremindbythedeviceEP1CST100C6ofALTERA’SCyclonefamily.a删0胁脚u地showst『)at,t『Iedesign船succeed.黼word,,.‘罐A9ynchFIF0;FPGA;Greycode;metastabllity;VerilogHDL1引言随着集成电路工艺的不断发展,在同一个芯片上集成整个系统已成为可能,IC设计已进入SoC时代。
异步先进先出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时使用该总线。
基于FPGA的异步FIFO设计_毕业设计(论文)

江苏科技大学本科毕业设计(论文)基于FPGA的异步FIFO设计Asynchronous FIFO design based on FPGA摘要在现代集成电路芯片中,随着设计规模的不断扩大,一个系统往往包含多个时钟,如何进行异步时钟间的数据传输成为了一个很重要的问题。
异步FIFO (First In First Out)是一种先进先出电路,可以在两个不同的时钟系统间进行快速准确的数据传输,是解决异步时钟数据传输问题的简单有效的方案。
异步FIFO 在网络接口、数据采集和图像处理等方面得到了十分广泛的应用,由于国内对该方面研究起步较晚,国内的一些研究所和厂商开发的FIFO电路还远不能满足市场和军事需求。
由于在异步电路中,时钟间的周期和相位完全独立,以及亚稳态问题的存在,数据传输时的丢失率不为零,如何实现异步信号同步化和降低亚稳态概率以及正确判断FIFO的储存状态成为了设计异步FIFO电路的难点。
本课题介绍了一种基于FPGA的异步FIFO 电路设计方法。
课题选用Quartus II软件,在Cyclone II 系列的EP2C5T144C8N芯片的基础上,利用VHDL 硬件描述语言进行逻辑描述,采用层次化、描述语言和图形输入相结合的方法设计了一个RAM深度为128 bit,数据宽度为8 bit的高速、高可靠的异步FIFO电路,并对该电路功能进行时序仿真测试和硬件仿真测试。
关键词:异步FIFO;同步化;亚稳态;仿真测试AbstractIn modern IC chips, with the continuous expansion of the scale of design, a system always contains several clocks. How to transmit data between the asynchronous clocks become a very important problem.Asynchronous FIFO (First In First Out) is a first-in, first-out circuit, it can transmit data between two diffent clock systems fastly and accurately, it is also a simple and effective solution to solve the problem of asynchronous clock data transfer. The asynchronous FIFO has a very wide range of applications in network interface, data acquisition and image processing.But because of the aspect of a late start, some domestic research institutes and manufacturers which research the FIFO circuit also can not meet the needs of the market and the military.In the asynchronous circuit, because of that the clock cycle and phase is completely independent, and the presence of metastability problems, the loss rate of data transmission is not zero. How to implement asynchronous signal synchronization, reduce the probability of metastability and judge the state of the FIFO storage correctly become a difficult problem while designing the asynchronous FIFO circuit. This paper introduces a method of asynchronous FIFO circuit design based on FPGA. This topic selects Quartus II software, the Cyclone II family EP2C5T144C8N chip, based on the use of VHDL hardware description language for logical descriptions, using the method of combining hierarchical, description language and graphical input ,This topic designs a high-speed, highly reliable asynchronous FIFO circuit as the RAM depth is 128 bit and the data width is 8 bit, and tests the circuit function with timing and software simulation.Keywords:Asynchronous FIFO; Synchronization; Metastability; simulation testing目录第一章绪论 (1)1.1 FPGA简介 (1)1.2 异步FIFO简介 (1)1.3 国内外研究现状及存在的问题 (1)1.3.1 研究现状 (1)1.3.2 存在问题 (2)1.4 本课题主要研究内容 (3)第二章异步FIFO设计要求及基本原理 (4)2.1 设计要求 (4)2.2 异步FIFO基本原理 (5)2.3 异步FIFO设计难点 (5)2.4 系统设计方案 (6)2.5 异步FIFO验证方案 (7)2.5.1 验证复位功能 (7)2.5.2 验证写操作功能 (7)2.5.3 验证读操作功能 (7)2.5.4 验证异步FIFO电路整体功能 (7)第三章模块设计与实现 (8)3.1 格雷码计数器模块 (8)3.2 同步模块 (8)3.3 格雷码∕自然码转换模块 (9)3.4 空满标志产生模块 (10)3.5 双端口RAM (13)第四章时序仿真与实现 (15)4.1 模块整合 (15)4.2 时序仿真及功能测试 (17)4.2.1 复位功能软件仿真与测试 (17)4.2.2 写操作功能时序仿真与测试 (17)4.2.3 读操作功能时序仿真与测试 (18)4.2.4 异步FIFO电路整体功能软件仿真与测试 (18)4.2.5 时序仿真结果总结 (19)第五章硬件仿真与实现 (20)5.1 外部电路焊接 (20)5.2 引脚分配 (21)5.3 调试电路设计 (24)5.3.1 调试电路介绍 (24)5.3.2 异步时钟产生模块 (25)5.3.3 伪随机数据队列产生模块 (25)5.3.5 调试电路引脚分配 (26)5.3.6 调试电路硬件仿真 (27)5.4 异步FIFO电路硬件仿真 (28)5.4.1 复位功能硬件仿真与测试 (29)5.4.2 写操作功能硬件仿真与测试 (30)5.4.3 读操作功能硬件仿真与测试 (30)5.4.4 异步FIFO硬件电路整体功能软硬件仿真与测试 (31)5.4.5 硬件仿真结果总结 (32)结论 (33)致谢 (34)参考文献 (35)附录 (36)第一章绪论1.1 FPGA简介FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在CPLD、PAL、GAL等可编程器件的基础上进一步发展的产物[10]。
基于FPGA的帧级异步FIFO设计

2020年第 2 期 声学与电子工程 总第 138 期32基于FPGA的帧级异步FIFO设计水颖(第七一五研究所,杭州,310023)摘要为了解决 FIFO对整帧数据的缓存问题,文章设计完成了一种基于 FPGA 的帧级异步 FIFO,该异步FIFO是基于Verilog HDL高级可编程语言实现的,它可以很方便的用于互联网数据帧的中间缓存,保证互联网数据帧在大吞吐量情况下不易发生丢失。
采用 modelsim 10.6仿真验证该设计,并应用于实际项目中进行大规模测试,结果表明该方案工作性能可靠稳定。
关键词帧级;异步FIFO;存储目前,在传输业界中,网关、加扰机、编码机及调制解调设备等多采用千兆级以太网作为交互接口,要完成交互过程中大容量数据简单方便的缓存,通常采用板载FIFO、SRAM、SDRAM或DDR 颗粒芯片的方案。
在一些对存储资源要求不高但对存储速度要求高的应用中,大多使用FPGA内部的存储器资源。
FIFO 是一种在电子系统得到广泛应用的模块,通常用于数据的缓存和容纳异步信号的频率或相位的差异。
FIFO 的实现通常是利用双口RAM 和读写地址产生模块来实现的。
本文根据互联网帧的实际处理,提出了一种帧级FIFO的设计,从而完成整帧数据处理的异步FIFO[1],设计的 FIFO处理模块是针对每一帧而不是每一个数据。
根据FPGA提供BRAM块,搭建FIFO 的读写以及数据使能,最关键的设计是控制读写地址、产生空满信号以及校验。
此方式产生帧级的异步FIFO,既可以减少使用内部FIFO带来资源高的问题,又可以隔离异步时序减少亚稳态的产生。
1功能描述及组成传统的异步时序FIFO,当写入一个FIFO位宽的数据,FIFO的空信号(empty)置0,则可以进行读取数据。
本文设计的基于帧级异步时序FIFO,当一个正常数据包正在写入时,FIFO的空信号并不会置0;只有当正常数据包全部写入异步FIFO中,空信号才能置0,数据才能够被读取。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一、技术规范 (3)1、设计完成的功能: (3)2、系统整体框图: (3)3、I/O管脚的描述: (3)4、验证和测试工具选择: (4)5、说明关键模块: (4)6、拟选用的FPGA类型: (4)二、FIFO总体设计方案 (5)系统功能描述: (5)电路结构图: (5)系统的总体输入输出设定 (6)系统时序分析: (6)关键模块设计分析: (7)三、FIFO验证方案 (8)FIFO功能: (8)1、概述: (8)2、预确认: (8)3、模块运行确认: (9)4、系统运行确认: (9)四、仿真激励代码 (10)五、电路设计FIFO源代码 (11)六、FPGA设计FIFO综合布局布线报告: (16)综合引脚分配: (16)电路布局布线: (16)七、时序仿真报告 (17)时序仿真波形: (17)八、FIFO下载代码和引脚分布 (17)系统输入输出引脚分布: (21)九、心得体会 (21)技术规范1、设计完成的功能:本实验完成的是8位异步FIFO的设计,其中写时钟100MHz,读时钟为5MHz,其中RAM的深度为256。
当写时钟脉冲上升沿到来时,判断写信号是有效,则写一个八位数据到RAM中;当读时钟脉冲上升沿到来时,判断读信号是有效,则从RAM中把一个八位数据读出来。
当RAM中数据写满时产生一个满标志,不能再往RAM再写数据;当RAM中数据读空时产生一个满标志,不能再从RAM读出数据。
2、系统整体框图:3、I/O管脚的描述:管脚名称方向H/L电平位宽功能描述rst_n input 3.3V/01全局复位信号rd_en input 3.3V/01读使能低有效wr_en input 3.3V/01写使能低有效rd_empty output 3.3V/01读空标志高有效wr_full output 3.3V/01写满标志高有效rd_data output 3.3V/08数据输出wr_data input 3.3V/08数据写入clk_100M input 3.3V/01写数据时钟clk_5M input 3.3V/01读数据时钟4、验证和测试工具选择:Modelsim SE6.1f进行前仿真和后仿。
在软件QuartusII中进行综合。
5、说明关键模块:对控制输入的读写地址要进行设计,以便在写满或是读空只产生一个标志,以此来实现对FIFO的缓冲的控制。
也就是读地址加1与写地址相等则为读空,产生读空标志;写地址加1与读地址相等则为读空,产生写满标志6、拟选用的FPGA类型:ep1cq240c8nFIFO总体设计方案系统功能描述:本实验完成的是8位异步FIFO的设计,其中写时钟100MHz,读时钟为5MHz,其中RAM的深度为256。
当写时钟脉冲上升沿到来时,判断写信号是有效,则写一个八位数据到RAM中;当读时钟脉冲上升沿到来时,判断读信号是有效,则从RAM中把一个八位数据读出来。
当RAM中数据写满时产生一个满标志,不能再往RAM再写数据;当RAM中数据读空时产生一个满标志,不能再从RAM读出数据。
电路结构图:系统的总体输入输出设定管脚名称方向H/L电平位宽功能描述rst_n input 3.3V/01全局复位信号rd_en input 3.3V/01读使能低有效wr_en input 3.3V/01写使能低有效rd_empty output 3.3V/01读空标志高有效wr_full output 3.3V/01写满标志高有效rd_data output 3.3V/08数据输出wr_data input 3.3V/08数据写入clk_100M input 3.3V/01写数据时钟clk_5M input 3.3V/01读数据时钟系统时序分析:关键模块设计分析:写地址产生逻辑模块:复位信号为低则电路复位;为高,在写时钟上升沿到来时,产生写逻辑地址,在写控制信号的控制下写入数据。
写地址产生逻辑模块:复位信号为低则电路复位;为高,在读时钟上升沿到来时,产生读逻辑地址,在读控制信号的控制下读出数据。
同步检测模块设计:在读写有效的情况下,根据系统读地址信号和写地址信号的对比来控制是否产生读空标志或是写满标志:若是读地址加1与写地址相等,则产生读空标志;若是写地址加1与读地址相等,则产生写满标志。
双口ROM模块:写时钟上升沿到来时,在写信号的控制下,对ROM进行写数据操作;读时钟上升沿到来时,在读信号的控制下,对ROM进行读数据操作;FIFO验证方案FIFO功能:8位异步FIFO的设计,其中写时钟100MHz,读时钟为5MHz,其中RAM的深度为256。
当写时钟脉冲上升沿到来时,判断写信号是有效,则写一个八位数据到RAM中;当读时钟脉冲上升沿到来时,判断读信号是有效,则从RAM中把一个八位数据读出来。
当RAM中数据写满时产生一个满标志,不能再往RAM再写数据;当RAM中数据读空时产生一个满标志,不能再从RAM读出数据1、概述:根据技术及其功能要求,对系统预确认,运行确认,性能确认等一系列活动。
2、预确认:1、系统主要技术参数2、数据的读写速度3、工作电源电压4、各引脚工作电压3、模块运行确认:目的是确认系统是否完成预期设计的功能;1、将系统运行:2、验证写满标志产生逻辑:复位后先将读写信号使能(置0),读信号不使能(置1),写数据由8位计数器cnt连续计数产生,并写入到存储单元中;让系统不断写数据,在一定时间内看系统是否有产生写满标志;3、验证空标志产生逻辑:复位后先将读写信号置1(无效),读信号使能(置0),让系统不断的读数据,在一定时间内看系统是否有产生空标志;4、验证读地址产生模块:系统复位后,一个8位rd_cnt计数器清0,在读使能和没有产生读空标志的条件下,在读时钟上升沿的到来,rd_cnt计数器加1,跟随着rd_addr 读地址的变化,看产生的读地址变化是有符合预期设计。
5、验证写地址模块:系统复位后,一个8位wr_cnt计数器清0,在写使能和没有产生写满标志的条件下,在写时钟上升沿的到来,wr_cnt计数器加1,跟随着wr_addr 写地址的变化,看产生的写地址变化是有符合预期设计。
6、验证写数据模块:系统复位后,在写使能时,写数据由8位计数器cnt连续计数产生,并写入到存储单元中;调整计数器cnt的初值,验证产生的数据是否与写入的数据一致。
7、验证写数据模块:系统复位后,在读写使能时,看由8位计数器cnt连续计数产生并写入的数据是否与读出来的数据顺序和数值一致。
4、系统运行确认:(1)复位后,读信号和写信号不使能(均置1),由于存储单元没有数据,看是否产生读空标志;(2)将写信号使能(置0),看写入的数据是否与设计输入的数据一致;(3)将读信号使能,看读出来的数据顺序和数值是否与写入的数据一致;(4)将写信号置1,看在一定的时钟下由预期设定的读地址加1与写地址相等时,有读空标志产生否;(5)接着将写信号使能,将读信号置1,看在一定的时钟下由预期设定的写地址加1与读地址相等时,有写满标志产生否;(6)将读写时钟使能,看数据的读写是否正确,有写时钟比读时钟快,经过一定的时钟周期后,看有写满标志产生;接下来,由于写满不能再写,故读时钟在读使能信号下读出数据时,写满信号变为0,接着写满信号1和0交替出现。
仿真激励代码module simulus;reg clk_100M;//写数据时钟reg clk_5M;//读数据时钟reg rst_n;//全局复位信号低有效reg wr_en;//写使能信号低有效reg rd_en;//读使能信号低有效reg[`DATA_WIDTH-1:0]wr_data;//8位数据输入信号wire[7:0]rd_data;//8位数据输出信号wire wr_full;//写满标志信号wire rd_empty;//读空标志信号reg[7:0]cnt;//仿真计数器output[7:0]rd_cnt;output[7:0]wr_cnt;reg[7:0]rd_cnt//读地址跟随计数器reg[7:0]rd_cnt//写地址跟随计数器fifo fifo1(clk_100M,clk_5M,rst_n,wr_en,rd_en,wr_data,rd_data,wr_full,rd_empty);always#10clk_5M=~clk_5M;always#5clk_100M=!clk_100M;//输入数据初始化initialbeginrst_n=0;clk_100M=0;clk_5M=1;wr_en=0;rd_en=0;#20rst_n=1;end//写入数据always@(posedge clk_100M or negedge rst_n)beginif(!rst_n)wr_data<=8'h0;elsewr_data<=cnt;end//计数器产生数据并写入存储单元always@(posedge clk_100M or negedge rst_n) beginif(!rst_n)cnt<=8'h38;elsecnt<=cnt+1'b1;end//读地址跟随计数器always@(posedge clk_5M or negedge rst_n) beginif(!rst_n)rd_cnt<=8'd0;else if(!rd_en&&!rd_empty)rd_cnt<=rd_cnt+1'b1;end//写地址跟随计数器always@(posedge clk_100M or negedge rst_n) beginif(!rst_n)wd_cnt<=8'd0;else if(!wr_en&&!wr_full)wr_cnt<=wr_cnt+1'b1;endendmodule电路设计FIFO源代码`define ADDR_WIDTH8//地址位宽`define DATA_WIDTH8//数据位宽`define RAM_WIDTH8//RAM数据位宽`define RAM_DEPTH256//RAM深度module fifo_test(clk_100M,//写时钟clk_5M,//读时钟rst_n,//全局复位信号wr_en,//写使能低有效rd_en,//读使能低有效wr_data,//8位数据输入rd_data,//8位数据输出wr_full,//写满标志高有效rd_empty);//读空标志高有效//输入信号input clk_100M;input clk_5M;input rst_n;input wr_en;input rd_en;input[`DATA_WIDTH-1:0]wr_data;output reg[`DATA_WIDTH-1:0]rd_data;output reg wr_full;output reg rd_empty;reg[`RAM_WIDTH-1:0]mem[`RAM_DEPTH-1:0];//8位256单元reg[`ADDR_WIDTH-1:0]wr_addr;//8位写地址reg[`ADDR_WIDTH-1:0]rd_addr;//8读地址reg rd_flag;reg wr_flag;//写地址产生逻辑always@(posedge clk_100M or negedge rst_n)beginif(!rst_n)beginwr_addr<=8'h0;wr_flag<=0;endelse if(!wr_en)beginif(!wr_full&&(rd_addr!=(wr_addr+1)))beginwr_flag<=1;wr_addr<=wr_addr+1'b1;endelsewr_flag<=0;endend//写数据产生逻辑always@(posedge clk_100M)beginif(!wr_en&&!wr_full&&wr_flag)mem[wr_addr]<=wr_data;end//写满产生标志always@(posedge clk_100M or negedge rst_n)beginif(!rst_n)wr_full<=0;else if(rd_addr==(wr_addr+1))wr_full<=1'b1;elsewr_full<=1'b0;end//读地址产生逻辑always@(posedge clk_5M or negedge rst_n)beginif(!rst_n)beginrd_flag<=0;rd_addr<=8'd0;endelse if(!rd_en)beginif(!rd_empty&&(wr_addr!=(rd_addr+1)))beginrd_flag<=1;rd_addr<=rd_addr+1'b1;endelserd_flag<=0;endend//读数据产生逻辑always@(posedge clk_5M)beginif(!rd_en&&!rd_empty&&rd_flag)rd_data<=mem[rd_addr];end//读空产生标志always@(posedge clk_5M or negedge rst_n)beginif(!rst_n)rd_empty<=1'b1;else if((wr_addr==(rd_addr+1))||(wr_addr==rd_addr)) rd_empty<=1'b1;elserd_empty<=1'b0;endendmodule//激励源代码:module fifo_test_IB;reg clk_100M;reg clk_5M;reg rst_n;//全局复位信号reg wr_en;//写使能reg rd_en;//读使能reg[`DATA_WIDTH-1:0]wr_data;wire[7:0]rd_data;wire wr_full;wire rd_empty;reg[7:0]cnt;fifo_test fifo1(clk_100M,clk_5M,rst_n,wr_en,rd_en,wr_data,rd_data,wr_full,rd_empty);always#15clk_5M=~clk_5M;//读时钟always#5clk_100M=!clk_100M;//写时钟initialbeginrst_n=0;clk_100M=0;clk_5M=1;wr_en=0;rd_en=0;#25rst_n=1;end always@(posedge clk_100M or negedge rst_n)beginif(!rst_n)wr_data<=8'd0;elsewr_data<=cnt;endalways@(posedge clk_100M or negedge rst_n)beginif(!rst_n)cnt<=8'd38;elsecnt<=cnt+1'b1;endendmodule功能仿真报告系统功能仿真波形:(1)复位后,读信号和写信号不使能(均置1),由于存储单元没有数据,产生读空标志;(2)将写信号使能(置0),写入的数据与设计输入的数据一致;(3)将读信号使能,读出来的数据顺序和数值与写入的数据一致;(4)将写信号置1,在一定的时钟下由预期设定的读地址加1与写地址相等时,有读空标志产生;(5)接着将写信号使能,将读信号置1,在一定的时钟周期下由预期设定的写地址加1与读地址相等时,有写满标志产生;(6)将读写时钟使能,数据的读写是正确的,由于写时钟比读时钟快,经过一定的时钟周期后,有写满标志产生;接下来,由于写满不能再写,故读时钟在读使能信号下读出数据时,写满信号变为0,接着写满信号1和0交替出现。