基于FPGA的FIFO存储器设计Word文档下载推荐.docx
《基于FPGA的FIFO存储器设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于FPGA的FIFO存储器设计Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
![基于FPGA的FIFO存储器设计Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-12/16/129671a3-2925-4b12-ba2b-568ca13f2fc0/129671a3-2925-4b12-ba2b-568ca13f2fc01.gif)
1.1.2FPGA的结构特点
一些基本的器件如GAL、CPLD之类都是基于乘积项的可编程结构,即由可编程的与阵列和固定的或阵列组成。
而FPGA则是另一种可编程逻辑结构----查找表(LookUpTable,LUT)结构。
LUT是可编程的最小逻辑构成单元。
大部分FPGA采用SRAM(静态随即存储器)的查找表逻辑形成结构,就是用SRAM来构成逻辑函数发生器。
Xilinx的XC4000系列、Spartan/3/3E系列,Altera的FLEX10K、ACEX、APEX、Cyclone、CycloneⅡ、Stratix等系列都采用SRAM查找表构成,是典型的FPGA器件。
《EDA技术实用教程》潘松,黄继业
通常FPGA包含3类可编程资源:
可编程逻辑功能块、可编程I/O功能块和可编程内部互连。
Cyclone/CycloneⅡ系列器件是Altera公司一款低成本,高性价比的FPGA,他的结构和工作原理在FPGA器件中具有典型性。
Cyclone/CycloneⅡ器件主要由逻辑阵列快LAB、嵌入式存储块、I/O单元、嵌入式硬件乘法器和PLL等模块组成,各模块之间存在着丰富的互联线和时钟网络。
1.2FIFO的基本概念及分类
1.2.1FIFO的基本概念及功能
FIFO(FirstInFirstOut)是先进先出存储器的缩写,它是一种实现数据先进先出的存储器件,通常用作数据缓冲器。
《一种低功耗异步FIFO存储器的设计》它与普通存储器的主要区别在是FIFO不需要外部读写地址线,在使用中具有简单,方便的特点。
FIFO一般用于不同时钟之间的数据传输,比如FIFO的一端是AD数据采集,另一端是计算机的PCI总线,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。
另外,对于不同宽度的数据接口也可以用FIFO,例如单片机为8位输出,DSP为16位输出,在单片机域DSP连接时就可以使用FIFO来达到数据匹配的目的。
在实际工作中,对FIFO的数据操作是靠其慢/空标志来实现的。
所谓满标志,指的是当对FIFO写数时,如果数据足够多,多到FIFO的内存已经装满了,此时便由FIFO内部状态电路送出一个表示内存已满的信号以阻止对FIFO的写操作。
同理,所谓空标志,指的是当从FIFO读数时,如果数据被读完了,便有FIFO内部状态电路送出一个空标志信号以阻止对FIFO的读操作。
总之,在控制FIFO的读写操作时,必须把握一个原则:
写满不溢出,读空不多读。
《基于VHDL的FPGA开发快速入门-技巧-实例》
1.2.2FIFO的分类
根据FIFO工作的时钟域不同,可以将FIFO分为同步FIFO和异步FIFO两大类。
同步FIFO是指读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作;
异步FIFO是指读写时钟不一致,读写时钟是互相独立的。
和同步时钟相比,特别是在网络接口、图像处理等方面,异步FIFO应用空间更为广泛。
1.3硬件实验平台简介《EDA技术实验手册》
GW48EDA/SOPC实验系统是杭州康芯电子有限公司开发的一个对EDA/SOPC的基本实验平台。
该系统拥有以下几个重要特点:
1)Multi-taskReconfiguration电路结构(多功能重配置结构)
该电路结构能仅通过一个键,完成纯电子切换的方式选择十余种不同的实验系统硬件电路连接结构,大大提高了实验系统的联系灵活性,又不影响系统的工作速度。
这里仅仅说明本文中所涉及到的电路模式,我们选择为模式5.如图所示,
FPGA/CPLD万能插口
右图是一块插于主主系统板上目标芯片适配座,对于不同的目标芯片可有不同的适配座。
可用的目标芯片包括目前世界上最大的六家FPGA/CPLD厂商几乎所有的CPLD、FPGA和所有的ispPAC等模拟EDA器件。
每个脚本公司已经定义标准化,各种芯片与引脚的对应关系可在实验说明中查到,再次不再细说。
2)ByteBlasterMV编程配置口:
此口由三个用途
(1)在对适配板FPGA/CPLD进行编程时,用十芯线板此口和适配板的“JTAG”口相连。
(2)如果进行独立的电子系统开发、应用系统开发等开发实践活动,首先应该将系统板上的目标芯片适配座拔下(对于Cyclone器件不用拔),用配置的10芯编程线将ByteBlasterMV口和独立系统上适配板的JTAG10芯相接,进行在系统编程,进行调试。
(3)对isp单片机89S51等进行编程,用十芯线同“MCUDAWNLOAD”口相连。
1.4QuartersⅡ特点及开发流程
1.4.1EDA的设计流程
简单地说,EDA(电子设计自动化ElectronicDesignAutomation)技术可概括为以大规模可编程逻辑器件CPLD/FPGA为设计载体,通过硬件描述语言输入给相应开发软件,经过编译和仿真,最终下载到设计载体中,从而完成系统电路设计任务的一门新技术。
利用EDA技术进行电路设计的大部分工作是在EDA软件工作平台上进行的,EDA设计流程图如图()所示。
EDA设计流程包括设计准备、设计输入、设计处理、器件编译和设计完成5个步骤,以及相应的功能仿真、时序仿真和器件测试3个设计验证过程。
《QuartusII在EDA技术中的应用》
EDA设计流程
1.4.2QuartersⅡ特点
QuartersⅡ是Altera公司推出的目前应用非常广泛的一款CPLD/FPGA开发系统。
它是一个完整的多平台设计环境。
它可以轻松满足特定设计的需要,并且提供可编程片上系统(SOPC)设计的综合开发平台,是SOPC设计的基础。
QuartersⅡ将设计、综合、布局、仿真验证、和编程下载以及第三方EDA工具集成在一个无缝的环境中,可以进行系统级设计、嵌入式系统级设计和可编程逻辑器件设计。
QuartersⅡ开发工具提供了完全集成,且与电路结构无关的数字逻辑设计环境,以及SOPC设计的嵌入式系统开发平台。
主要特点如下:
1)可利用原理图、结构图、VerilogHDL、VHDL、AHDL等硬件描述语言完成逻辑电路的描述和编辑,以及芯片(电路)平面布局连线的编辑。
2)功能强大的逻辑综合工具,并提供了RTL级查看器(原理图视图和层次结构列表)
3)完备的电路功能描述和时序逻辑仿真工具。
4)自动定位编译错误,提供高效的器件编程与验证工具。
5)RTL-to-Gate形式验证。
此外,QuartersⅡ还将默认安装SOPCBuilder,自动添加、参数化和连接IP核,包括嵌入式处理器、协处理器。
外设和用户自定义逻辑,从而为嵌入式的开发提供方便。
1.4.3QuartersⅡ设计流程
QuartersⅡ提供了完全集成且与电路结构无关的数字逻辑设计环境,拥有CPLD/FPGA各个开发阶段对应得开发工具。
图()是QuartersⅡ的开发流程,QuartersⅡ为开发流程的每个阶段提供QuartersⅡ图形用户界面。
EDA工具界面。
《EDA技术与可编程器件的应用》
2.同步FIFO设计及硬件实现
2.1同步FIFO功能及设计原理
同步FIFO通常是指FIFO的读写时钟频率相同、来源相同,这种FIFO的设计较为简单也较为快速,因为它避免了由于异步时钟逻辑产生的许多设计中具有挑战性的难题。
同步FIFO通常用在读写时钟相同的接口部分,这种FIFO相比较而言,逻辑较为简单,时延较小,传输数据的速度比较快,同步FIFO还具有深度可扩展性。
同步FIFO的整个系统可分为写地址产生逻辑、度地址产生逻辑、双端口存储器、满/空标志产生逻辑4大部分。
其中,FIFO的存储介质为一块双端口RAM,可以同时进行读写操作。
在写地址产生逻辑部分,由写地址产生逻辑产生写控制信号和写地址;
在读地址产生逻辑部分,由读地址产生逻辑产生读控制信号和读地址。
在满/空标志产生部分,由读写地址相互比较产生满/空标志。
具体模块结构如下图所示:
2.2同步FIFO的VHDL语言描述及仿真
2.2.1同步VHDL语言描述
根据FIFO的深度可扩展性,我们以采用宽度为8,深度为64为设计目标。
由于同步FIFO各个模块描述相对来说比较容易,我们采用一个结构体,多个进程的方式进行描述。
具体VHDL源程序如下,其中各个关键句子都做了详细说明。
--同步FIFO的FPGA设计(VHDL源程序)见附录1
2.2.2时序仿真及分析
下面是同步FIFO的仿真图,其中时钟周期是100ns,写使能信号固定在高电平,读使能信号先在低电平,而后到高电平。
如图
仿真前半部分
从图中可以看出,复位后,开始往同步FIFO写数,空标志信号转为非空,写读使能信号有效后,开始读数,但是由于写进存储器仍未满,所以输出”000000”。
符合设计要求。
仿真后半部分
图中可以看出,经过大概64个时钟周期后,FIFO储存器内数据已经写满。
开始往外依次读数,当每个时钟上升沿到来时,边写边读。
实现了FIFO同步读写和缓冲的作用。
时钟为200ns
同样由图可以看出,由于时钟周期为200ns,增加一倍。
所以到经历了大概12多微秒即写入64个数据后开始往外读数。
仍然实现了先进先出的功能。
2.3硬件实现
2.3.1引脚设置与下载
程序仿真成功后,开始进行引脚设置和下载。
在QuartersⅡ开发环境下,选择tool菜单中的Assignments项,进入AssignmentsEditor编辑窗,在Category栏中选择pin按钮。
如图()所示。
单击《new》选择本工程要锁定的端口信号名,添加到引脚列表中。
我们选择模式NO.0模式,因采用的是Cyclone系列的EP1C12Q240C8芯片,经过查阅相应的“芯片引脚对照表”将相应引脚编号添加到地址栏中。
由于手工操作太慢,这里将键3设置为时钟控制。
键8设置为复位。
具体配置见下表。
2.3.2配置文件下载
将编译产生的SOF文件配置进FPGA中,具体步骤如下:
(1)打开编程窗和配置。
在菜单tool中选择Programmer,在Mode栏中选择JTAG模式,并选择打钩下载文件右侧的第一小框。
如图()所示
(2)设置编程器。
将试验箱和电脑相连接,打开HardwareSetup对话框,选择ByteBlasterMV之后,打你Close按钮关闭对话框即可。
(3)硬件测试。
成功下载FIFO.sof后,选择实验电路模式0,将复位键、读写使能键均置高位,手动触发时钟信号键,每写一个数,触发一次,输入64个数之后,在同步时钟控制下,开始输出第一个输入的数,符合同步FIFO的设计原理。
3、异步FIFO存储器设计
3.1异步FIFO工作原理
异步FIFO相当于一个双端口的RAM,一个端口只能写数据,另一个端口只能读数据。
同时读写数据必须按照存储器地址的递增或者递减顺序进行。
《异步FIFO设计中的两个关键问题》
图()是异步FIFO的原理图,它由四部分组成,目前其内部存储器一般采用双端口RAM,输入输出具有两套数据线,独立的读写地址指针在读写时钟的控制下顺序地从双口RAM读写数据。
用写时钟把数据放入双口RAM,用读时钟从中读取。
同时根据FIFO中的空/满标致来判断何时可以把数据写入FIFO或从FIFO中读出。
这样就可以把写数据和读数据分开,使整个系统分为完全独立的时钟域,实现异步FIFO的功能。
《异步FIFO中存储单元的分析设计》
异步FIFO原理图《异步FIFO中存储单元的分析设计》
3.2异步FIFO的设计难点
设计异步FIFO有两个难点,一是如何同步异步信号,是触发器不产生亚稳态;
二是如何正确地设计空、满标志信号的电路。
下面阐述解决问题的具体方法。
3.2.1亚稳态问题的解决
在数字集成电路中,触发器要满足建立时间(setup)和保持时间(hold)的限制要求。
当一个信号被寄存器锁存时,如果信号和时钟之间不满足这个要求,Q端的值是不确定的,并且在未知的时刻会固定到高电平或低电平。
这个过程称为亚稳态(Metastabihty)。
图()所示为异步时钟和亚稳态,图中。
cIka和clkb为异步时钟。
异步时钟和亚稳态
两级时钟同步消除亚稳态
亚稳态必定会发生在异步FIFO中。
因为在异步FIFO中,读写时钟是完全独立的。
虽然亚稳态问题不可避免,但是使用以下两种方法,可以使其发生的概率降到一个可以接受的地步。
(1)对写地址/读地址采用格雷码。
由实践可知,同步多个异步输入信号出现亚稳态的概率远远大于同步一个异步信号的概率。
对多个触发器的输出所组成的写地址/读地址可以采用格雷码。
由于格雷码每次只变化一位,采用格雷码可以有效地减少亚稳态的产生。
(2)采用触发器来同步异步输入信号。
如图()中两级触发器可以将出现的亚稳态降到很小程度,但是同时也带来了一定的延时。
需在设计中加以注意。
3.2.2满/空标志信号的产生
满/空标志信号的产生是异步FIFO设计的核心部分。
是否能正确设计此部分逻辑,将直接影响到FIFO得性能。
满/空标志产生的原则是:
无论在什么时候,都不应出现读写地址同时对一个存储器地址操作的情况。
我们可以通过设置额外的状态位的办法来判断满/空状态。
读写指针由地址位和状态位组成,地址位随着相应的操作递增,指针由内存的最后位置回到初始位置的时候状态取反。
因此,当读写指针的地址位和状态位全部吻合时,读写指针经历了相同次数的循环移动,由此可知判断满/空标志的公式:
Empty<
=(读指针=写指针)
Full<
=(读指针最高位/=写指针最高位)AND(读指针其他位=写指针其他位)
3.3异步FIFO存储器的设计
3.3.1格雷码计数器的设计
根据以上原理,在设计异步FIFO之前,我们先进行格雷码计数器的设计。
二进制指针是由一位状态位和若干二进制编码的地址位组成。
如果在不同时钟域内直接同步二进制指针,有可能产生问题。
例如,当读指针从0111向1000变化的时候,指针所有的位都要变化,如果写时钟恰好在读指针的变化时刻采样,那么得到的读指针值有可能从0000到1111的任何一个,所以二进制不宜被直接同步。
为了在不同时钟域内可以同步指针,可以采用格雷码编码方式,即指针每次移动只变化一位,这样就避免了由于指针多位同时变化而无法直接同步的问题。
格雷码计数器是通过同步相应的二进制计数器,将对应的二进制码转换成格雷码来实现的,由于SRL运算的对象只能是BIT数据类型,因而在转码逻辑运算中调用了TO_BITVECTOR和TO_STDLOGICVECTOR数据类型的转换。
格雷码源程序见附录2
将源程序在QuartersⅡ上运行后仿真图如下,其中时钟周期为100ns,复位置高位,当使能信号有效后,开始输出二进制和格雷码。
由图可知,二进制每加一,格雷码则变换一位。
实现了由二进制向格雷码的转换。
与二进制码相比,格雷码计数器实现了状态的最少翻转,大大降低了亚稳态出现的几率。
格雷码计数器的仿真图
3.3.2异步FIFO的整体设计
本节设计一个宽为8,深度为64的异步FIFO存储器,并应用上述方法解决设计中遇到的亚稳态和满/空标志信号问题。
并对其进行行为级时序仿真。
源程序见附录3:
3.3.3异步FIFO仿真分析
下面给出异步FIFO的最终仿真图:
(1)当写入速度大于读出速度时,我们假设写时钟频率为100ns,读时钟频率为200ns.复位信号和读写使能信号高电平有效。
具体仿真如下:
写时钟比读时钟快-前半部分
复位有效后,开始写入数据,RAM内非空,当读使能信号有效后,开始往外读数,由于写入速度大于读出速度,因此会一直读数。
写时钟比读时钟快-后半部分
在写入速度大于读出的情况下,RAM内的数据会逐渐积累。
如图所示,到达一定程度后,RAM就被写满了,从而满标志信号有效,知道有数被读出后,下个数据才能被写入。
(2)当写入速度大于读出速度时,我们假设写时钟频率为200ns,读时钟频率为100ns.
复位信号和读写使能信号高电平有效。
写时钟比读时钟慢-前半部分
如图所以,写使能信号有效后,系统开始写数,当读使能信号有效后,系统开始读数。
由于写入速度小于读数速度。
所以RAM经常会被读空。
并呈周期性变化。
写时钟比读时钟慢-后半部分
3.4硬件实现
3.4.1引脚设置与下载
依照同步FIFO的设计流程,异步FIFO仍然采用NO.0模式。
各引脚具体配置如图()所示。
其中读写时钟用键3和键4来控制,仍然是为了方便输入。
读写使能、复位等信号则由键6.、7、8来控制。
3.4.2配置文件下载及硬件测试
配置过程文件过程与同步FIFO基本一致,所不同的为下载到实验平台后的测试步骤。
由于异步FIFO为双时钟读写分开的存储器。
数据写入受写时钟和写使能信号控制。
数据读出受读时钟和读使能信号控制。
复位后,使读写使能信号高电平有效,每输入一个数则可由读时钟脉冲读出来。
也可先输入几个数后,再由读时钟一块读出,且先写入的先读出。
但RAM里最多能存64个数,当数据存满后,满标志信号灯会亮。
通过实际操作,基本实现了异步FIFO的基本功能。
同时也可以从操作上显示出异步FIFO相对于同步FIFO的优越性。
4.总结
4.1两种FIFO的比较
4.1.1同步FIFO与异步FIFO的共同点
(1)本文所设计的FIFO存储器都是基于RAM型,都是在QuartersⅡ开发环境中设计并仿真后,下载到GW48系列SOPC/EDA实验平台上进行硬件实现。
(2)两者都是基于FPGA的设计,使用的是ALTERA公司的Cyclone系列器件中的
EP1C12Q240C8芯片。
(3)不论是同步还是异步,都是为了解决不同系统之间对数据的传输率,数据的传输量,以及系统接口部分不同的数据输入和接受传输率匹配要求的问题。
在根本功能上是一致的。
4.1.2同步FIFO与异步FIFO的区别
(1)在适用范围上,由于各个系统之间频率的差异性,异步FIFO应用范围更广一些。
但是由于亚稳态以及正确产生满/空标志逻辑控制等不可避免的问题,虽然可以通过设计格雷码来加以改善,但是异步FIFO较之同步FIFO来说,需要更多的逻辑单元,需要更长的数据传输时间,花费更多的设计精力。
因此,在某些场合下,比如高速,执行简单等条件下,更倾向于用同步FIFO。
(2)同步FIFO有很多优势,如同步标志信号、可编程几乎空几乎满标志信号、深度可扩展性等。
而且,在高速情况下,同步FIFO可以通过自由运行时钟来操作。
4.2设计流程回顾及结论
本文按照EDA标准化设计流程,先介绍了设计所需要的硬件及其发展,FIFO的概念,功能及分类以及具体软件开发环境和硬件开发平台。
然后开始分别对同步FIFO和异步FIFO进行设计。
在同步FIFO设计中,首先分析了同步FIFO的功能和基本原理。
然后给出了具体开发源程序并进行了时序仿真。
最后进行资源配置和FPGA硬件下载实现。
在异步FIFO设计中,首先分析了异步FIFO设计的必要性以及设计中遇到的困难。
即亚稳态问题和满/空标志信号产生的问题。
并提出了相应的解决方案。
最后给出了设计的源程序并分析了仿真结果。
通过对同步FIFO和异步FIFO的设计和硬件开发,发现基于FPGA的FIFO处理速度更高,能更加高效的匹配不同系统间的数据传输率。
根据不同的场合和要求,可以对同步FIFO或异步FIFO进行配置,实现整个系统的高效运行。
参考文献
附录1
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYFIFOIS
PORT
(clk:
INSTD_LOGIC;
--FIFO的时钟输入
write_en:
--FIFO的写使能信号;
read_en:
--FIFO的读使能信号;
rst:
--FIFO的复位信号;
din:
INSTD_LOGIC_VECTOR(7DOWNTO0);
dout:
OUTSTD_LOGIC_VECTOR(7DO