《fpga原理与应用课程设计》报告FIFOWord文件下载.docx
- 文档编号:3595100
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:32
- 大小:1.04MB
《fpga原理与应用课程设计》报告FIFOWord文件下载.docx
《《fpga原理与应用课程设计》报告FIFOWord文件下载.docx》由会员分享,可在线阅读,更多相关《《fpga原理与应用课程设计》报告FIFOWord文件下载.docx(32页珍藏版)》请在冰点文库上搜索。
功能描述:
本设计用16*8RAM实现一个异步FIFO,具体功能定义如下:
(1)异步复位。
(2)FIFO不为满时,当写使能有效时,在写时钟的上升沿向FIFO中写入数据。
(3)FIFO不为空时,当读使能有效时,在读时钟的上升沿从FIFO中读出数据。
(4)当FIFO写满的时候,产生满信号;
当FIFO读空的时候,产生空信号。
(5)FIFO一旦空或者满时候,复位FIFO。
其他要求:
(1)课程设计时间:
2019-2020第2学期18~19周;
(2)查阅至少5篇参考文献。
按《武汉理工大学课程设计工作规范》要求撰写设计报告书。
全文用A4纸打印,图纸应符合绘图规范。
时间安排:
(1)2020年05月22日,布置课设具体实施计划与课程设计报告格式的要求说明。
(2)2020年06月22日至2020年06月24日,资料收集和方案选择。
(3)2020年06月25日至2020年07月03日,实现方案设计与仿真,并撰写设计说明书。
(4)2020年07月04日,上交课程设计成果及报告,同时进行答辩。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
目录
摘要 I
Abstract II
1绪论 1
1.1FIFO研究意义 1
1.2设计要求 1
2异步FIFO设计原理 2
2.1设计基础 2
2.2异步FIFO简介 2
2.3FIFO的一些重要参数 3
2.4异步FIFO设计难点 4
2.4.1亚稳态 4
2.4.2空指针与满指针 5
3异步FIFO总体方案设计 6
3.1异步FIFO基本结构 6
3.2异步FIFO外部接口 6
3.3不同时钟域间数据传递解决方案 7
3.3.1加两级寄存器同步 7
3.3.2二进制码转成格雷码 8
3.3.3结绳法 9
3.4空满标志的生成解决方案 10
3.4.1空满状态产生的原理 10
3.4.2空满状态判断方法 11
4FIFO具体方案实现与仿真 12
4.1顶层模块的端口及设计 12
4.2子模块设计 13
4.2.1存储RAM模块 13
4.2.2同步连接模块 13
4.2.3空满标志产生模块 14
4.3子模块连线图 16
4.4FIFO仿真验证 16
4.4.1RAM内存验证 17
4.4.2异步复位功能验证 17
4.4.3读写功能验证 18
5总结 20
参考文献 21
附录代码 22
摘要
异步FIFO(FirstInFirstOut)是一种先进先出电路,可以在两个不同的时钟系统间进行快速准确的数据传输,是解决异步时钟数据传输问题的简单有效的方案。
异步FIFO在网络接口、数据采集和图像处理等方面得到了十分广泛的应用。
本课题介绍了一种基于FPGA的异步FIFO电路设计方法。
课题选用QuartusII软件,在Cyclone系列的EP1C12F324C8芯片的基础上,利用VerilogHDL硬件描述语言进行逻辑描述,采用层次化和描述语言相结合的方法设计了一个RAM深度为16,数据宽度为8的高速、高可靠的异步FIFO电路,并对该电路功能进行时序仿真测试和硬件仿真测试。
测试满足了RAM内存为16*8,验证了rinc读使能端功能winc写使能端功能、wfull写满功能、rempty读空功能、FIFO空或者满时复位功能、异步复位功能,实现了异步FIFO的设计。
关键词:
异步FIFO,仿真测试,QuartusII
Abstract
AsynchronousFIFO(FirstInFirstOut)isafirst-in,first-outcircuit,itcantransmitdatabetweentwodiffentclocksystemsfastlyandaccurately,itisalsoasimpleandeffectivesolutiontosolvetheproblemofasynchronousclockdatatransfer.TheasynchronousFIFOhasaverywiderangeofapplicationsinnetworkinterface,dataacquisitionandimageprocessing.
ThistopicintroducesaDesignmethodofasynchronousFFOcircuitbasedonFPGA.ThistopicselectsQuartusIIsoftware,theCyclonefamilyEP1C12F324C8chip,basedontheuseofVerilogHDLhardwaredescriptionlanguageforlogicdescription,ahigh-speed,highlyreliableasynchronousFIFOcircuitwithaRAMdepthof16andadatawidthof8isdesignedbyusingacombinationofhierarchical,descriptionlanguageandTukaipu.FunctioninprogressSequencesimulationtestandhardwaresimulationtest.
The
test
meets
the
RAM
memory
of
16*8,
verifies
rinc
read
enable
function
winc
write
function,
wfull
full
rempty
empty
FIFO
or
time
reset
asynchronous
and
realizes
design
FIFO.
Keywords:
AsynchronousFIFO,simulationtest,QuartusII
II
I
1绪论
1.1FIFO研究意义
随着计算机、多媒体和数据通信技术的高速发展,数字图像、语音等数据传输技术近年来得到了极大的重视与长足的发展,并取得了广泛的应用。
如何保障这些语音、图像等数据传输的准确性、及时性,如何高效率高速度地传输这些数据,都是当今信息领域的科研人员所必须回答和解决的问题。
而往往在这些数据传输系统中,又会遇到又会遇到不同系统接口间数据的传输。
通常在两个相连接的不通电路系统之间,因为每个系统的数据传输速度不同,在系统的接口部分就会出现数据输入速度和输出速度的不同,也就是会发生数据传输速率不匹配的问题。
这种情况往往会让传输的数据产生复写和丢失,降低数据的传输速率,同时也因为数据复写、丢失和无效数据的读入,将会产生数据出错,因此需要在不同的系统接口处设计数据传输单元来实现数据的高速高效传输。
在现代的系统设计中,为了提高系统的性能,设计者对数据的传输率、数据的传输量,对系统各部分之间的接口部分不同的数据输入和接收数据率的匹配有越来越高的要求,而FIFO存储器以其合理的价格、使用的方便灵活性以及上述的对速度匹配的应用而成为解决这类问题的理想途径,因此FIFO存储器在计算机,多媒体和数据通信领域都有着广泛的应用。
在现在的设计中,FIFO的设计方法主要有两种,一种是在FPGA中基于信元的FIFO设计方法,另一种是基于SDRAM/DRAM的大容量的FIFO的设计方法。
1.2设计要求
本设计用16*8RAM实现一个异步FIFO,完成数据速率变换功能。
具体功能定义如下:
(1)异步复位;
(2)FIFO不为满时,当写使能有效时,在写时钟的上升沿向FIFO中写入数据;
(3)FIFO不为空时,当读使能有效时,在读时钟的上升沿从FIFO中读出数据;
(4)当FIFO写满的时候,产生满信号;
当FIFO读空的时候,产生空信号;
(5)FIFO一旦空或者满时候,复位FIFO。
2异步FIFO设计原理
2.1设计基础
FPGA是现场可编程门阵列(FieldProgrammableGateArray)的简称。
FPGA能完成大部分数字器件的功能。
工程师可以通过传统的原理图输入或硬件描述语言自由设计一个数字系统。
使用FPGA开发数字电路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。
这些优点使得FPGA技术在20世纪90年代以后得到飞速的发展,同时也大大推动了EDA软件和硬件描述语言VHDL和Verilog的进步。
FPGA软件设计可分为两大块:
编程语言和编程工具。
编程语言主要有VHDL和VerilogHDL两种硬件描述语言;
编程工具主要是两大厂家Altera和Xilinx的集成综合EDA软件(如MAX+plusII、QuartusII、Foundation、ISE)以及第三方工具(如FPGAExpress、Modelsim、SynposysSVS等)。
本课程设计采用VerilogHDL语言来进行硬件设计。
VerilogHDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。
被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。
数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。
VerilogHDL语言具有下述描述能力:
设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。
所有这些都使用同一种建模语言。
此外,VerilogHDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。
VerilogHDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。
因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。
语言从C编程语言中继承了多种操作符和结构。
VerilogHDL提供了扩展的建模能力,其核心子集非常易于学习和使用,足够实现大多数建模应用。
电子设计中,由于现在场可编程门阵列(FPGA)的高逻辑密度和高可靠性以及用户可编程性受到了广大硬件工程师的青睐。
用FPGA来实现某些专用电路,可使整个设计更加紧凑、更小巧、灵活、稳定、可靠。
本文就是基于FPGA来设计异步FIFO,实现数据速率变换功能。
2.2异步FIFO简介
异步FIFO是一种先进先出电路,用在需要实时数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。
异步FIFO与同步FIFO最大的不同在于异步FIFO读写时钟不同,通常异步FIFO用来做数据的时钟域转换,FIFO设计中难度最大的地方在FIFO的空满标识的产生,对同步FIFO来说,由于读写指针的增加时钟频率相同,因此读写指针可以直接进行比较产生出空满标志,而异步FIFO某由于读写两端时钟频率不同,读写指针需要进行时钟域转换后才能进行比较,也就是读时钟域的读地址要先转到写时钟域,然后与写时钟域的写地址进行比较,而实际这种比较时存在一定风险的。
异步FIFO设计一般的结构有:
双口存储器、读地址产生逻辑、写地址产生逻辑、空/满标志产生逻辑四部分构成。
由于读写地址的变化由不同的时钟产生,所以对FIFO空或满的判断是跨时钟域的。
如何避免异步传输带来的亚稳态以及正确地产生空/满标志是设计异步FIFO的难点。
2.3FIFO的一些重要参数
FIFO的宽度:
也就是英文资料里常看到的THEWIDTH,它只的是FIFO一次读写操作的数据位,就像MCU有8位和16位,ARM32位等等,FIFO的宽度在单片成品IC中是固定的,也有可选择的,如果用FPGA自己实现一个FIFO,其数据位,也就是宽度是可以自已定义的。
FIFO的深度:
THEDEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。
如一个8位的F1FO,若深度为8,它可以存储8个8位的数据,深度为12,就可以存储12个8位的数据,FIFO的深度可大可小,个人认为FIFO深度的计算并无一个固定的公式。
在FIFO实际工作中,其数据的满/空标志可以控制数据的继续写入或读出。
在一个具体的应用中也不可能由一些参数算数精确的所需FIFO深度为多少,这在写速度大于读速度的理想状态下是可行的,但在实际中用到的FIFO深度往往要大于计算值。
一般来说根据电路的具体情况,在兼顾系统性能和FIFO成本的情况下估算一个大概的宽度和深度就可以了。
而对于写速度慢于读速度的应用,FIFO的深度要根据读出的数据结构和读出数据的由那些具体的要求来确定。
满标志:
FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。
空标志:
FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。
读时钟:
读操作所遵循的时钟,在每个时钟沿来临时读数据。
写时钟:
写操作所遵循的时钟,在每个时钟沿来临时写数据。
读指针:
指向下一个读出地址。
读完后自动加1。
写指针:
指向下一个要写入的地址的,写完自动加1。
读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。
2.4异步FIFO设计难点
异步FIFO与同步FIFO所做的工作是相同的,都是在写信号有效时写数据到RAM中,在读信号有效时把数据从RAM中读出,所以对于中间部分的RAM设计是比较简单的。
读电路和写电路也较容易实现,如果没有写满或读空的状态时每写一个数据就把写地址加1,每读一个数据就把读地址减1。
设计异步FIFO有两个难点:
一是不同时钟域域间数据传递的问题;
二是如何正确的生成空、满标志。
下面进行两个问题的阐述。
亚稳态是不同时钟域间数据传递的最重要的问题。
当数据信号通过两个时钟域的交界处时,将会分别由两个时钟来控制信号的值,此时如果两个时钟信号的敏感沿非常接近并超过允许的额度,则会出现数据信号不稳定,使电路陷入亚稳态。
空、满标志的产生是异步FIFO设计的核心部分,如何正确设计此部分的逻辑,直接影响到FIFO的性能。
空、满标志产生的原则是:
写满不溢出,读空不多读,即无论在什么时刻,都不应该出现读写地址同时对一个存储器地址操作的情况。
空、满标志都是由于读写地址相等所产生的,因此需要找到一种方法来区分开来地址相等的时候应该是空还是满。
2.4.1亚稳态
亚稳态是一种物理现象,必然发生在异步FIFO电路中。
在数字电路中,触发器要满足setup/hold的时间要求。
当一个信号被寄存器锁存时,如果信号和时钟之间不满足这个要求,Q端的值是不确定的,并且在未知的时刻会固定到高电平或低电平,这个过程称为亚稳态,如图2.1所示。
图中clka和clkb即为异步时钟,亚稳态必定会发生在异步时钟电路中。
在图2.1的异步电路中,电路外部的输入和内部的时钟之间是毫无时间关系的,因此setup/hold冲突是必然的:
同在电路内部的两个没有关系的时钟域之间的信号传递,也必然会导致setup/hold冲突。
由于亚稳态使物理系统产生了一种不可预知性,所以亚稳态是很危险的。
图2.1异步时钟和亚稳态
虽然亚稳态没法避免,但可以通过下面三种方法降低亚稳态发生的概率。
①对写地址/读地址采用格雷码。
由实践可知,同步多个异步输入信号出现亚稳态的概率远远大于同步一个异步信号的概率。
对多个触发器的输出所组成的写地址/读地址可以采用格雷码。
由于格雷码每次只变化一位,采用格雷码可以有效地减少亚稳态的产生。
②采用两极触发器来同步异步输入信号。
信号同步的目的是防止新时钟域中第一级触发器的亚稳态信号对下级逻辑造成影响。
两级寄存器的同步化处理单元由两个触发器串联而成,中问没有其它组合电路。
这种设计可以保证后面的触发器获得前一个触发器输出时,前一个触发器已退出了亚稳态,并且输出已稳定。
但是,这种方法同时带来了对输入信号的一级延时,需要在设计时钟的时候加以注意。
③在信号从快时钟域向慢时钟域过渡时,如果信号变化太快,慢时钟将可能无法对该信号进行正确采样,即采样失败。
所以在使用双锁存器法时,应该使原始信号保持足够长的时间,以便另一个时钟域的锁存器对其进行正确的采样。
对上述问题,一般采用“结绳法”的设计方法,将慢时钟周期信号通过分频的方式将其周期增长,经过双锁存采样以后再使其恢复原来的时钟周期。
即用“结绳”将信号延长,用“同步”实现双latch采样,用“解绳”还原为原来的时钟,保证另一个时钟域也可以正确采样,而接收方用相反的流程送回响应信号。
2.4.2空指针与满指针
空/满标志产生的原则是:
写满不溢出,读空不多读。
即无论在什么进修,都不应出现读写地址同时对一个存储器地址操作的情况。
在读写地址相等或相差一个或多个地址的时候,满标志应该有效,表示此时FIFO已满,外部电路应对FIFO发数据。
在满信号有效时写数据,应根据设计的要求,或保持、或抛弃重发。
同理,空标志的产生也是如此,即:
空标志<
=(写地址读地址<
=预定值)AND(写地址超前读地址)
满标志<
=(|写地址-读地址|<
=预定值)AND(读地址超前写地址)
最直接的做法是,采用读写地址相比较来产生空满标志。
当读写地址的差值等于一个预设值的时候,空/满信号被置位。
这种实现方法逻辑简单,但它是减法器形成的一个比较大的组合逻辑,因而限制了FIFO的速度。
所以,一般只采用相等不相等的比较逻辑,避免使用减法器。
3异步FIFO总体方案设计
3.1异步FIFO基本结构
异步FIFO主要由双端口RAM和读写控制逻辑及空满标志产生逻辑构成,其基本结构图如图2.1所示。
图3.1异步FIFO基本结构图
由结构图可以看出该系统为环状结构,存在两个完全独立的时钟域——写时钟域和读时钟域。
异步FIFO的存储介质是一块双端口RAM,可以同时进行读写操作。
在写时钟域,写地址产生逻辑产生写地址和写控制信号,在读时钟域,读地址产生逻辑产生读地址和读控制信号。
空满标志产生逻辑通过比较同步后的读写地址来产生空满标志信号,同时,产生的空满标志信号又和输入的读写使能信号一起控制读写时钟域进行读写操作。
3.2异步FIFO外部接口
复位后,通过读写使能控制读写操作。
当写时钟脉冲上升沿到来时,判断写信号是否有效,有效则写入一个八位数据到RAM中;
当读时钟脉冲上升沿到来时,判断读信号是否有效,有效则从RAM中把一个八位数据读取出来。
当RAM中数据写满时产生一个写满标志,不能再往RAM写入数据;
当RAM中数据读空时产生一个读空标志,不能再从RAM读出数据。
图3.2异步FIFO外部接口图
异步FIFO外部接口说明:
(1)write_data:
Input,写数据;
(2)write_en:
Input,写使能;
(3)wclk:
Input,写时钟;
(4)wrst:
Input,写复位;
(5)read_en:
Input,读使能;
(6)rclk:
(7)rrst:
(8)wfull:
Output,写满信号;
(9)rempty:
Output,读空信号;
(10)rdata:
Output,读数据。
3.3不同时钟域间数据传递解决方案
由于读指针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO的读写时钟域不同,是异步的,要是将读时钟域的读指针与写时钟域的写指针不做任何处理直接比较肯定是错误的,因此我们需要进行同步处理以后再进行比较。
下面是三种解决方案。
3.3.1加两级寄存器同步
使用异步信号进行使用的时候,好的设计都会对异步信号进行同步处理,同步一般采用多级D触发器级联处理,如图3.3所示。
clka和clkb为异步时钟,触发器B采样触发器A的输出数据,当clka和clkb的上升沿离得太近时,如果触发器A的值在这个时候发生改变,clkb将采样到一个正在变化的数据,此时触发器输出的值将是一个不确定的值。
21
考虑到亚稳态是由于两个时钟沿过分接近造成的,如果对不同时钟域的输入信号用两个锁存器串连续锁存两拍,第一个触发器锁存到一个不稳定信号,经过一个时钟周期的等待以后很可能趋于稳定,变为确定的0或1,第二个触发器在下一拍锁存的时候就能得到一个确定的值。
图3.3两级寄存器同步图
3.3.2二进制码转成格雷码
将一个二进制的计数值从一个时钟域同步到另一个时钟域的时候很容易出现问题,因为采用二进制计数器时所有位都可能同时变化,比如写指针在从00111到01000跳变时4位同时改变,这样读时钟在进行写指针同步后得到的。
写指针可能是00000-01111的某个值,一共有16种可能的情况,而这些都是不可控制的,所以在同一个时钟沿同步多个信号的变化会产生亚稳态问题。
而使用格雷码只有一位变化,因此在两个时钟域间同步多个位不会产生问题。
所以需要一个二进制到格雷码的转换电路,将地址值转换为相应的格雷码,然后将该格雷码同步到另一个时钟域进行对比,作为空、满状态的检测。
转换方法如图3.4所示。
某二进制数为 Bn-1Bn-2B2B1B0其对应的格雷码为 Gn-1Gn-2G2G1G0其中,最高位保留— Gn-1=Bn-1
其它各位— Gi=Bi+1Bi,i=0,1,2,...n-2
例,二进制数为 1 0 1 1 0
格雷码为 1 1 1 0 1
图3.4二进制码转格雷码方法
使用VerilogHDL语言表示为:
assigngray_code=(bin_code>
>
1)^bin_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- fpga原理与应用课程设计 fpga 原理 应用 课程设计 报告 FIFO