基于FPGA的FIFO存储器设计

上传人:痛*** 文档编号:60832401 上传时间:2022-03-09 格式:DOC 页数:23 大小:1.18MB
收藏 版权申诉 举报 下载
基于FPGA的FIFO存储器设计_第1页
第1页 / 共23页
基于FPGA的FIFO存储器设计_第2页
第2页 / 共23页
基于FPGA的FIFO存储器设计_第3页
第3页 / 共23页
资源描述:

《基于FPGA的FIFO存储器设计》由会员分享,可在线阅读,更多相关《基于FPGA的FIFO存储器设计(23页珍藏版)》请在装配图网上搜索。

1、基于FPGA的FIFO存储器设计摘要:如何匹配两个传输速率不同的系统间数据传输,避免因为速率的不同而在接口部分产生的复写、丢失以及读入无效数据的问题,这些已经成为设计者必须思考的问题。FIFO缓冲存储器正是解决这种数据传输问题的理想方法。文章简单介绍了FPGA(现场可编程逻辑门阵列)的发展历程,结构特点与应用价值,简单介绍了FIFO的功能和实用价值。提出了FIFO(先进先出)存储器分别在同步和异步两种状态下的设计方案。在Quarter环境中,以VHDL作为描述语言,遵循EDA标准设计的开发流程,实现了用FPGA器件对FIFO(先进先出)存储器进的设计。并对相应的模块下载到GW48系列EDA实验

2、开发系统上进行硬件实现。最后比较了同步FIFO存储器和异步FIFO存储器各自的优缺点和使用范围。体现了FPGA在数据处理方面的优越性。关键词 同步FIFO,异步FIFO ,FPGA基于FPGA的FIFO存储器设计1. 绪论1.1 FPGA的发展及结构特点1.1.1 FPGA的含义及发展 FPGA是现场可编程逻辑门阵列(Field Programmable Gates Array)的缩写,自从1985年Xilinx公司推出第一片现场可编程逻辑门阵列至今1。FPGA已经成为当今电子设计市场上应用最广泛的可编程逻辑器件之一。可编程逻辑器件按集成度来区分,可大致分为简单PLD和复杂PLD。如图21 ,

3、它的发展大致经历了一下三个阶段3: 1早期的可编程逻辑器件:70年代初期的PLD器件主要用于各种类型的存储问题,主要有PROM(可编程只读存储器)、EPROM(紫外线可擦出只读存储器)、和EEPROM(电可擦出只读存储器),由于结构简单,它们只能完成简单的逻辑功能。 2 结构上稍微复杂的可编程芯片:70年代末到80年代初,AMD公司和Lattice公司先后推出了可编程逻辑器件PLD,产品主要有PAL(可编程逻辑阵列,Programmable Array Logic)、GAL(通用阵列逻辑,Generic Array Logic)和PLA(可编程逻辑阵列,Programmable Logic A

4、rray).这一类在设计上有很强的灵活性,可以实现速度特性较好的逻辑功能,但由于结构简单,它们只能实现规模较小的电路。 3 功能齐全、变成灵活的可编程逻辑器件:80年代中期,Altera公司和Xilinx公司同期推出了CPLD(复杂可编程逻辑门阵列,Complex Programmable Logic Device)和FPGA(现场可编程逻辑门阵列,Field Programmable Gates Array),它们都具有体系结构和逻辑单元灵活,集成度高以及适用范围宽等特点,可以实现较大规模的电路。 图1进入90年代以后,可编程逻辑集成电路进入了飞速发展时期,在系统可编程技术ISP(InSys

5、tem Programmability)和世界扫描测试技术的出现,使得可编程逻辑器件在器件编程技术和器件测试技术方面也获得了划时代的进步。FPGA/CPLD已成为当今应用最广泛的可编程集成电路之一。FPGA器件的应用研究工程师可在办公室和实验室进行设计。它还具有静态可重复编程和在系统重构特性,使硬件和软件一样,能够通过编程来修改。1.1.2 FPGA的结构特点 一些基本的器件如GAL、CPLD之类都是基于乘积项的可编程结构,即由可编程的与阵列和固定的或阵列组成。而FPGA则是另一种可编程逻辑结构-查找表(Look Up Table,LUT)结构。LUT是可编程的最小逻辑构成单元。大部分FPGA

6、采用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器件主要由逻辑阵

7、列快LAB、嵌入式存储块、I/O单元、嵌入式硬件乘法器和PLL等模块组成,各模块之间存在着丰富的互联线和时钟网络。1.2 FIFO的基本概念及分类1.2.1 FIFO的基本概念及功能 FIFO(First In First Out)是先进先出存储器的缩写,它是一种实现数据先进先出的存储器件,通常用作数据缓冲器。一种低功耗异步FIFO存储器的设计它与普通存储器的主要区别在是FIFO不需要外部读写地址线,在使用中具有简单,方便的特点。FIFO一般用于不同时钟之间的数据传输,比如FIFO的一端是AD数据采集,另一端是计算机的PCI总线,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。另外,对于

8、不同宽度的数据接口也可以用FIFO,例如单片机为8位输出,DSP为16位输出,在单片机域DSP连接时就可以使用FIFO来达到数据匹配的目的。在实际工作中,对FIFO的数据操作是靠其慢/空标志来实现的。所谓满标志,指的是当对FIFO写数时,如果数据足够多,多到FIFO的内存已经装满了,此时便由FIFO内部状态电路送出一个表示内存已满的信号以阻止对FIFO的写操作。同理,所谓空标志,指的是当从FIFO读数时,如果数据被读完了,便有FIFO内部状态电路送出一个空标志信号以阻止对FIFO的读操作。总之,在控制FIFO的读写操作时,必须把握一个原则:写满不溢出,读空不多读。基于VHDL的FPGA开发快速

9、入门-技巧-实例1.2.2 FIFO的分类 根据FIFO工作的时钟域不同,可以将FIFO分为同步FIFO和异步FIFO两大类。同步FIFO是指读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作;异步FIFO是指读写时钟不一致,读写时钟是互相独立的。和同步时钟相比,特别是在网络接口、图像处理等方面,异步FIFO应用空间更为广泛。1.3 硬件实验平台简介EDA技术实验手册GW48EDA/SOPC实验系统是杭州康芯电子有限公司开发的一个对EDA/SOPC的基本实验平台。该系统拥有以下几个重要特点:1) Multi-task Reconfiguration电路结构(多功能重配置结构)该电路结构

10、能仅通过一个键,完成纯电子切换的方式选择十余种不同的实验系统硬件电路连接结构,大大提高了实验系统的联系灵活性,又不影响系统的工作速度。这里仅仅说明本文中所涉及到的电路模式,我们选择为模式5.如图所示,FPGA/CPLD万能插口 右图是一块插于主主系统板上目标芯片适配座,对于不同的目标芯片可有不同的适配座。可用的目标芯片包括目前世界上最大的六家FPGA/CPLD厂商几乎所有的CPLD、FPGA和所有的ispPAC等模拟EDA器件。每个脚本公司已经定义标准化,各种芯片与引脚的对应关系可在实验说明中查到,再次不再细说。2) ByteBlasterMV编程配置口:此口由三个用途(1) 在对适配板FPG

11、A/CPLD进行编程时,用十芯线板此口和适配板的“JTAG”口相连。(2) 如果进行独立的电子系统开发、应用系统开发等开发实践活动,首先应该将系统板上的目标芯片适配座拔下(对于Cyclone器件不用拔),用配置的10芯编程线将ByteBlasterMV口和独立系统上适配板的JTAG10芯相接,进行在系统编程,进行调试。(3) 对isp单片机89S51等进行编程,用十芯线同“MCU DAWNLOAD”口相连。1.4 Quarters 特点及开发流程1.4.1 EDA的设计流程 简单地说,EDA(电子设计自动化Electronic Design Automation)技术可概括为以大规模可编程逻辑

12、器件CPLD/FPGA为设计载体,通过硬件描述语言输入给相应开发软件,经过编译和仿真,最终下载到设计载体中,从而完成系统电路设计任务的一门新技术。利用EDA技术进行电路设计的大部分工作是在EDA软件工作平台上进行的,EDA设计流程图如图()所示。EDA设计流程包括设计准备、设计输入、设计处理、器件编译和设计完成5个步骤,以及相应的功能仿真、时序仿真和器件测试3个设计验证过程。QuartusII在EDA技术中的应用EDA设计流程1.4.2 Quarters 特点 Quarters是Altera公司推出的目前应用非常广泛的一款CPLD/FPGA开发系统。它是一个完整的多平台设计环境。它可以轻松满足

13、特定设计的需要,并且提供可编程片上系统(SOPC)设计的综合开发平台,是SOPC设计的基础。Quarters 将设计、综合、布局、仿真验证、和编程下载以及第三方EDA工具集成在一个无缝的环境中,可以进行系统级设计、嵌入式系统级设计和可编程逻辑器件设计。Quarters开发工具提供了完全集成,且与电路结构无关的数字逻辑设计环境,以及SOPC设计的嵌入式系统开发平台。主要特点如下:1) 可利用原理图、结构图、VerilogHDL、VHDL、AHDL等硬件描述语言完成逻辑电路的描述和编辑,以及芯片(电路)平面布局连线的编辑。2) 功能强大的逻辑综合工具,并提供了RTL级查看器(原理图视图和层次结构列

14、表)3) 完备的电路功能描述和时序逻辑仿真工具。4) 自动定位编译错误,提供高效的器件编程与验证工具。5) RTL-to-Gate形式验证。此外,Quarters还将默认安装SOPC Builder,自动添加、参数化和连接IP核,包括嵌入式处理器、协处理器。外设和用户自定义逻辑,从而为嵌入式的开发提供方便。1.4.3 Quarters设计流程 Quarters提供了完全集成且与电路结构无关的数字逻辑设计环境,拥有CPLD/FPGA各个开发阶段对应得开发工具。图()是Quarters的开发流程,Quarters为开发流程的每个阶段提供Quarters图形用户界面。EDA工具界面。EDA技术与可编

15、程器件的应用2同步FIFO设计及硬件实现2.1 同步FIFO功能及设计原理同步FIFO通常是指FIFO的读写时钟频率相同、来源相同,这种FIFO的设计较为简单也较为快速,因为它避免了由于异步时钟逻辑产生的许多设计中具有挑战性的难题。同步FIFO通常用在读写时钟相同的接口部分,这种FIFO相比较而言,逻辑较为简单,时延较小,传输数据的速度比较快,同步FIFO还具有深度可扩展性。同步FIFO的整个系统可分为写地址产生逻辑、度地址产生逻辑、双端口存储器、满/空标志产生逻辑4大部分。其中,FIFO的存储介质为一块双端口RAM,可以同时进行读写操作。在写地址产生逻辑部分,由写地址产生逻辑产生写控制信号和

16、写地址;在读地址产生逻辑部分,由读地址产生逻辑产生读控制信号和读地址。在满/空标志产生部分,由读写地址相互比较产生满/空标志。具体模块结构如下图所示:读数据写数据双端口存储器写控制信号写地址读控制信号读地址满/空标志产生逻辑满标志空标志时钟输入写地址产生逻辑读地址产生逻辑2.2同步FIFO的VHDL语言描述及仿真2.2.1同步VHDL语言描述 根据FIFO的深度可扩展性,我们以采用宽度为8,深度为64为设计目标。由于同步FIFO各个模块描述相对来说比较容易,我们采用一个结构体,多个进程的方式进行描述。具体VHDL源程序如下,其中各个关键句子都做了详细说明。-同步FIFO的FPGA设计(VHDL

17、源程序)见附录12.2.2时序仿真及分析 下面是同步FIFO的仿真图,其中时钟周期是100ns,写使能信号固定在高电平,读使能信号先在低电平,而后到高电平。如图仿真前半部分 从图中可以看出,复位后,开始往同步FIFO写数,空标志信号转为非空,写读使能信号有效后,开始读数,但是由于写进存储器仍未满,所以输出”000000”。符合设计要求。仿真后半部分 图中可以看出,经过大概64个时钟周期后,FIFO储存器内数据已经写满。开始往外依次读数,当每个时钟上升沿到来时,边写边读。实现了FIFO同步读写和缓冲的作用。时钟为200ns同样由图可以看出,由于时钟周期为200ns,增加一倍。所以到经历了大概12

18、多微秒即写入64个数据后开始往外读数。仍然实现了先进先出的功能。2.3 硬件实现 2.3.1引脚设置与下载程序仿真成功后,开始进行引脚设置和下载。在Quarters开发环境下,选择tool菜单中的Assignments项,进入Assignments Editor 编辑窗,在Category栏中选择pin按钮。 如图()所示。单击new选择本工程要锁定的端口信号名,添加到引脚列表中。我们选择模式NO.0模式,因采用的是Cyclone系列的EP1C12Q240C8芯片,经过查阅相应的“芯片引脚对照表”将相应引脚编号添加到地址栏中。由于手工操作太慢,这里将键3设置为时钟控制。键8设置为复位。具体配置

19、见下表。2.3.2配置文件下载将编译产生的SOF文件配置进FPGA中,具体步骤如下:(1)打开编程窗和配置 。在菜单tool中选择Programmer,在Mode栏中选择JTAG模式,并选择打钩下载文件右侧的第一小框。如图()所示(2)设置编程器。将试验箱和电脑相连接,打开Hardware Setup对话框,选择ByteBlasterMV之后,打你Close按钮关闭对话框即可。(3)硬件测试。成功下载FIFO.sof后,选择实验电路模式0,将复位键、读写使能键均置高位,手动触发时钟信号键,每写一个数,触发一次,输入64个数之后,在同步时钟控制下,开始输出第一个输入的数,符合同步FIFO的设计原

20、理。3、异步FIFO存储器设计3.1 异步FIFO工作原理 异步FIFO相当于一个双端口的RAM,一个端口只能写数据,另一个端口只能读数据。同时读写数据必须按照存储器地址的递增或者递减顺序进行。异步FIFO设计中的两个关键问题 图()是异步FIFO的原理图,它由四部分组成,目前其内部存储器一般采用双端口RAM,输入输出具有两套数据线,独立的读写地址指针在读写时钟的控制下顺序地从双口RAM读写数据。用写时钟把数据放入双口RAM,用读时钟从中读取。同时根据FIFO中的空/满标致来判断何时可以把数据写入FIFO或从FIFO中读出。这样就可以把写数据和读数据分开,使整个系统分为完全独立的时钟域,实现异

21、步FIFO的功能。异步FIFO中存储单元的分析设计异步FIFO原理图异步FIFO中存储单元的分析设计3.2异步FIFO的设计难点设计异步FIFO有两个难点,一是如何同步异步信号,是触发器不产生亚稳态;二是如何正确地设计空、满标志信号的电路。下面阐述解决问题的具体方法。3.2.1 亚稳态问题的解决 在数字集成电路中,触发器要满足建立时间(set up)和保持时间(hold)的限制要求。当一个信号被寄存器锁存时,如果信号和时钟之间不满足这个要求,Q端的值是不确定的,并且在未知的时刻会固定到高电平或低电平。这个过程称为亚稳态( Metastabihty )。图()所示为异步时钟和亚稳态,图中。cIk

22、a和clkb为异步时钟。异步时钟和亚稳态两级时钟同步消除亚稳态 亚稳态必定会发生在异步FIFO中。因为在异步FIFO中,读写时钟是完全独立的。虽然亚稳态问题不可避免,但是使用以下两种方法,可以使其发生的概率降到一个可以接受的地步。(1) 对写地址/读地址采用格雷码。由实践可知,同步多个异步输入信号出现亚稳态的概率远远大于同步一个异步信号的概率。对多个触发器的输出所组成的写地址/读地址可以采用格雷码。由于格雷码每次只变化一位,采用格雷码可以有效地减少亚稳态的产生。(2) 采用触发器来同步异步输入信号。如图()中两级触发器可以将出现的亚稳态降到很小程度,但是同时也带来了一定的延时。需在设计中加以注

23、意。3.2.2 满/空标志信号的产生满/空标志信号的产生是异步FIFO设计的核心部分。是否能正确设计此部分逻辑,将直接影响到FIFO得性能。满/空标志产生的原则是:写满不溢出,读空不多读。无论在什么时候,都不应出现读写地址同时对一个存储器地址操作的情况。我们可以通过设置额外的状态位的办法来判断满/空状态。读写指针由地址位和状态位组成,地址位随着相应的操作递增,指针由内存的最后位置回到初始位置的时候状态取反。因此,当读写指针的地址位和状态位全部吻合时,读写指针经历了相同次数的循环移动,由此可知判断满/空标志的公式:Empty=(读指针=写指针)Full=(读指针最高位/=写指针最高位)AND(读

24、指针其他位=写指针其他位)3.3异步FIFO存储器的设计3.3.1 格雷码计数器的设计 根据以上原理,在设计异步FIFO之前,我们先进行格雷码计数器的设计。二进制指针是由一位状态位和若干二进制编码的地址位组成。如果在不同时钟域内直接同步二进制指针,有可能产生问题。例如,当读指针从0111向1000变化的时候,指针所有的位都要变化,如果写时钟恰好在读指针的变化时刻采样,那么得到的读指针值有可能从0000到1111的任何一个,所以二进制不宜被直接同步。为了在不同时钟域内可以同步指针,可以采用格雷码编码方式,即指针每次移动只变化一位,这样就避免了由于指针多位同时变化而无法直接同步的问题。 格雷码计数

25、器是通过同步相应的二进制计数器,将对应的二进制码转换成格雷码来实现的,由于SRL运算的对象只能是BIT数据类型,因而在转码逻辑运算中调用了TO_BITVECTOR和TO_STDLOGICVECTOR数据类型的转换。格雷码源程序见附录2将源程序在Quarters上运行后仿真图如下,其中时钟周期为100ns,复位置高位,当使能信号有效后,开始输出二进制和格雷码。由图可知,二进制每加一,格雷码则变换一位。实现了由二进制向格雷码的转换。与二进制码相比,格雷码计数器实现了状态的最少翻转,大大降低了亚稳态出现的几率。格雷码计数器的仿真图3.3.2 异步FIFO的整体设计本节设计一个宽为8,深度为64的异步

26、FIFO存储器,并应用上述方法解决设计中遇到的亚稳态和满/空标志信号问题。并对其进行行为级时序仿真。源程序见附录3:3.3.3 异步FIFO仿真分析下面给出异步FIFO的最终仿真图:(1) 当写入速度大于读出速度时,我们假设写时钟频率为100ns,读时钟频率为200ns.复位信号和读写使能信号高电平有效。具体仿真如下: 写时钟比读时钟快-前半部分 复位有效后,开始写入数据,RAM内非空,当读使能信号有效后,开始往外读数,由于写入速度大于读出速度,因此会一直读数。 写时钟比读时钟快-后半部分 在写入速度大于读出的情况下,RAM内的数据会逐渐积累。如图所示,到达一定程度后,RAM就被写满了,从而满

27、标志信号有效,知道有数被读出后,下个数据才能被写入。(2) 当写入速度大于读出速度时,我们假设写时钟频率为200ns,读时钟频率为100ns.复位信号和读写使能信号高电平有效。写时钟比读时钟慢-前半部分 如图所以,写使能信号有效后,系统开始写数,当读使能信号有效后,系统开始读数。由于写入速度小于读数速度。所以RAM经常会被读空。并呈周期性变化。写时钟比读时钟慢-后半部分3.4 硬件实现3.4.1引脚设置与下载 依照同步FIFO的设计流程,异步FIFO仍然采用NO.0模式。各引脚具体配置如图()所示。其中读写时钟用键3和键4来控制,仍然是为了方便输入。读写使能、复位等信号则由键6.、7、8来控制

28、。3.4.2 配置文件下载及硬件测试 配置过程文件过程与同步FIFO基本一致,所不同的为下载到实验平台后的测试步骤。由于异步FIFO为双时钟读写分开的存储器。数据写入受写时钟和写使能信号控制。数据读出受读时钟和读使能信号控制。复位后,使读写使能信号高电平有效,每输入一个数则可由读时钟脉冲读出来。也可先输入几个数后,再由读时钟一块读出,且先写入的先读出。但RAM里最多能存64个数,当数据存满后,满标志信号灯会亮。通过实际操作,基本实现了异步FIFO的基本功能。同时也可以从操作上显示出异步FIFO相对于同步FIFO的优越性。4 总结41 两种FIFO的比较4.1.1 同步FIFO与异步FIFO的共

29、同点(1)本文所设计的FIFO存储器都是基于RAM型,都是在Quarters开发环境中设计并仿真后,下载到GW48系列SOPC/EDA实验平台上进行硬件实现。(2)两者都是基于FPGA的设计,使用的是ALTERA公司的Cyclone系列器件中的EP1C12Q240C8芯片。(3) 不论是同步还是异步,都是为了解决不同系统之间对数据的传输率,数据的传输量,以及系统接口部分不同的数据输入和接受传输率匹配要求的问题。在根本功能上是一致的。4.1.2 同步FIFO与异步FIFO的区别(1)在适用范围上,由于各个系统之间频率的差异性,异步FIFO应用范围更广一些。但是由于亚稳态以及正确产生满/空标志逻辑

30、控制等不可避免的问题,虽然可以通过设计格雷码来加以改善,但是异步FIFO较之同步FIFO来说,需要更多的逻辑单元,需要更长的数据传输时间,花费更多的设计精力。因此,在某些场合下,比如高速,执行简单等条件下,更倾向于用同步FIFO。(2)同步FIFO有很多优势,如同步标志信号、可编程几乎空几乎满标志信号、深度可扩展性等。而且,在高速情况下,同步FIFO可以通过自由运行时钟来操作。4.2 设计流程回顾及结论 本文按照EDA标准化设计流程,先介绍了设计所需要的硬件及其发展,FIFO的概念,功能及分类以及具体软件开发环境和硬件开发平台。然后开始分别对同步FIFO和异步FIFO进行设计。 在同步FIFO

31、设计中,首先分析了同步FIFO的功能和基本原理。然后给出了具体开发源程序并进行了时序仿真。最后进行资源配置和FPGA硬件下载实现。在异步FIFO设计中,首先分析了异步FIFO设计的必要性以及设计中遇到的困难。即亚稳态问题和满/空标志信号产生的问题。并提出了相应的解决方案。最后给出了设计的源程序并分析了仿真结果。通过对同步FIFO和异步FIFO的设计和硬件开发,发现基于FPGA的FIFO处理速度更高,能更加高效的匹配不同系统间的数据传输率。根据不同的场合和要求,可以对同步FIFO或异步FIFO进行配置,实现整个系统的高效运行。参考文献附录1LIBRARY IEEE;USE IEEE.STD_LO

32、GIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY FIFO IS PORT ( clk : IN STD_LOGIC; -FIFO的时钟输入 write_en : IN STD_LOGIC; -FIFO的写使能信号; read_en : IN STD_LOGIC; -FIFO的读使能信号; rst : IN STD_LOGIC; -FIFO的复位信号; din : IN STD_LOGIC_VECTOR(7 DOWNTO 0); dout : OUT STD_LOGIC_VECTO

33、R(7 DOWNTO 0); empty : OUT STD_LOGIC; full : OUT STD_LOGIC);END FIFO;ARCHITECTURE Behavioral OF FIFO IS TYPE fifo_array IS ARRAY(0 TO 63) OF STD_LOGIC_VECTOR(7 DOWNTO 0); -定义长为64的一维数组 SIGNAL fifo_memory : fifo_array; -定义FIFO的储存介质; SIGNAL full_flag : STD_LOGIC; -内部满标志信号; SIGNAL empty_flag : STD_LOGIC

34、; -内部空标志信号SIGNAL read_addr : STD_LOGIC_VECTOR(5 DOWNTO 0); -读地址SIGNAL write_addr : STD_LOGIC_VECTOR(5 DOWNTO 0); -写地址SIGNAL counter : STD_LOGIC_VECTOR(5 DOWNTO 0); -计数器BEGIN-P1进程的功能是:在时钟信号和读使能信号的共同作用下,实现对FIFO的读数操作。这-里必须注意的是FIFO只有在非空的情况下,才能进行操作,否则会引起错读的情况。 P1:PROCESS(rst,clk) BEGIN IF(rst=0) THEN -复位

35、高电平有效; dout=ZZZZZZZZ;ELSIF(clkEVENT AND clk=1) THEN -时钟上升沿来临; IF(read_en=1 AND empty_flag=0) THEN -读时能信号高电平有效且非空条件下 dout=fifo_memory(CONV_INTEGER(read_addr);END IF;END IF;END PROCESS;-P2进程的功能是:在时钟信号和写使能信号的共同作用下,实现对FIFO的写操作。这-里必须注意的是,FIFO只有在非满的情况下。才能进行写操作。否则会引起益处的情况P2:PROCESS(clk)BEGIN IF(clkEVENT AN

36、D clk=1)THEN -上升沿有效 IF(rst=1 AND write_en=1 AND full_flag=0)THEN -写使能信号有效且非满 fifo_memory(CONV_INTEGER(write_addr)=din; -写入数据地址; END IF; END IF;END PROCESS;-P3进程的功能是:在时钟信号和写使能信号的共同作用下,实现对FIFO写数地址的加一-操作。这里必须注意的是,FIFO只有在非满的情况下,才能进行地址加一操作,否则会-引起益处。P3:PROCESS(rst,clk) BEGIN IF(rst=0)THEN write_addr=00000

37、0; ELSIF(clkevent AND clk=1 AND full_flag=0)THEN write_addr=write_addr+1; END IF;END PROCESS;-P4进程的功能是:在时钟信号和读使能信号的共同作用下,实现对FIFO读数地址加一-操作。这里必须注意的是,FIFO只有在非空的情况下,才能进行地址加一操作,否则会-引起错读。P4:PROCESS(rst,clk) BEGIN IF(rst=0)THEN read_addr=000000; ELSIF(clkevent AND clk=1) THEN read_addr=read_addr+1; END IF;

38、END PROCESS;-P5进程的功能是:通过设计计数器,协调读写操作。当读写使能信号无效时,计数值索-存当前值,当读写信号有效时。计数器也应该索存当前值。也就是说,读写操作是分时-进行的。 P5:PROCESS(clk,rst) VARIABLE temp:STD_LOGIC_VECTOR(1 DOWNTO 0); -定义变量BEGIN IF(rst=0)THEN counter counter IF(counter/=111111)THEN counter IF(counter/=000000)THEN counter counter counter=counter; END CASE;

39、 END IF;END PROCESS;-P6进程的功能是:产生正确的空标志符号(只有计数器为0时,空信号才有效)P6:PROCESS(counter) BEGIN IF(counter=000000)THENempty_flag=1;ELSEempty_flag=0;END IF;END PROCESS;-输出空标志信号empty=empty_flag;-P7进程的功能是:产生正确的满标志信号(只有计数器的值为63时,满信号才有效)P7:PROCESS(counter) BEGIN IF(counter=111111)THEN full_flag=1; ELSE full_flag=0; E

40、ND IF; END PROCESS;-输入满标志信号 full=full_flag;END Behavioral;在P5,P6,P7进程中,通过设计一个和读写操作同步的计数器,记录了FIFO当前读写地址,并对临界情况做了正确控制,有效的协调了读写操作。从而解决了产生正确的满空信号的难点。附录2LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY graycounter IS PORT( CLK: IN STD_LOGIC; RST

41、: IN STD_LOGIC; ennable : IN STD_LOGIC; -使能信号; gray_out: out std_logic_vector(6 downto 0);-格雷码输入 bin_addr: out std_logic_vector(5 downto 0);-二进制码输入END graycounter;architecture behavioral of graycounter is signal bin :std_logic_vector(6 downto 0); -格雷码产生所需内部信号 begin PROCESS(clk,rst) begin if(rst=0) t

42、hen bin=0000001; gray_out=0000000; elsif(clkevent and clk=1) then if(ennable=1)then bin=bin+1; -二进制计数器 gray_out=(to_stdlogicvector(to_bitvector(bin)srl 1)xor bin;-通过SRL和XOR实现二进制码向格雷码的转变; end if; end if;end process;bin_addr(5 downto 0)=bin(5 downto 0);end behavioral;附录3LIBRARY IEEE;USE IEEE.STD_LOGIC

43、_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY FIFO_64 IS PORT( clk_read : IN STD_LOGIC; -FIFO读时钟信号; clk_write : IN STD_LOGIC; -写时钟信号; write_en : IN STD_LOGIC; -写使能信号; read_en : IN STD_LOGIC; -读使能信号; rst : IN STD_LOGIC; -复位信号; din : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -数据

44、输入端; dout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -数据输出端; empty : OUT STD_LOGIC; -空标志信号; full : OUT STD_LOGIC); -满标志信号;END FIFO_64;ARCHITECTURE behav OF FIFO_64 IS TYPE FIFO_ARRAY IS ARRAY(0 TO 63) OF STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL FIFO_MEMORY : FIFO_ARRAY; -定义FIFO储存介质; SIGNAL write_enable : STD_L

45、OGIC; -FIFO内部写使能控制信号; SIGNAL read_enable : STD_LOGIC; -FIFO内部读使能控制信号; SIGNAL full_flag : STD_LOGIC; -FIFO内部满标志信号; SIGNAL empty_flag : STD_LOGIC; -FIFO内部空标志信号; SIGNAL read_addr : STD_LOGIC_VECTOR(5 DOWNTO 0); -读地址; SIGNAL write_addr : STD_LOGIC_VECTOR(5 DOWNTO 0); -写地址; SIGNAL read_ptr : STD_LOGIC_VE

46、CTOR(6 DOWNTO 0); -读时针; SIGNAL write_ptr : STD_LOGIC_VECTOR(6 DOWNTO 0); -写时针; SIGNAL read_ptr_meta : STD_LOGIC_VECTOR(6 DOWNTO 0); SIGNAL read_ptr_write_synch : STD_LOGIC_VECTOR(6 DOWNTO 0); SIGNAL write_ptr_meta : STD_LOGIC_VECTOR(6 DOWNTO 0); SIGNAL write_ptr_read_synch : STD_LOGIC_VECTOR(6 DOWNT

47、O 0);COMPONENT GrayCounter -格雷码计数器件声明; PORT( clk : IN STD_LOGIC; -时钟信号; rst : IN STD_LOGIC; ennable: IN STD_LOGIC; gray_out: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); bin_addr: OUT STD_LOGIC_VECTOR(5 DOWNTO 0); END COMPONENT;BEGIN-P1进程的功能是:在读时钟信号和读控制信号的共同作用下,实现对FIFO的读操作。这里需要注意的是:为了提高数据线的利用率,-应当在读操作之外将数据线置为高

48、阻来释放数据线。 P1:PROCESS(clk_read) BEGIN IF(clk_readevent AND clk_read=1) THEN IF(read_enable=1) THEN dout=FIFO_MEMORY(CONV_INTEGER(read_addr); ELSE dout=ZZZZZZZZ; END IF; END IF;END PROCESS;-P2进程的功能是:在写时钟信号和写控制信号的共同作用下,实现对FIFO的写操作P2:PROCESS(clk_write) BEGIN IF(clk_writeevent AND clk_write=1) THEN IF(wri

49、te_enable=1)THEN FIFO_MEMORY(CONV_INTEGER(write_addr)=din; END IF; END IF;END PROCESS;-P3进程的功能是:通过写使能信号和满标志信号产生写控制信号,只有在写使能信号有效并且FIFO的当前状态不为满的情况下,-才允许写控制信号有效。P3:PROCESS(write_en,full_flag) BEGIN IF(write_en=1 AND full_flag=0) THEN write_enable=1; ELSE write_enable=0; END IF;END PROCESS;-P4进程的功能是:通过读

50、使能信号和空标志信号产生读控制信号,只有在读使能信号有效并且FIFO的-当前状态不为空的情况下,才允许读控制信号有效。P4:PROCESS(read_en,empty_flag) BEGIN IF(read_en=1 AND empty_flag=0) THEN read_enable=1; ELSE read_enableclk_write, rst=rst, ennable=write_enable, gray_out=write_ptr, bin_addr=write_addr);-对FIFO的读状态调用格雷码计数器,目的是产生可靠的FIFO读指针 GrayCounter_read:Gr

51、ayCounter PORT MAP( clk=clk_read, rst=rst, ennable=read_enable, gray_out=read_ptr, bin_addr=read_addr);-P5进程的功能是:通过两级触发器消除亚稳态产生出来被写时钟同步了的读时针 P5:PROCESS(clk_write,rst) BEGIN IF(rst=0) THEN read_ptr_meta=0000000; read_ptr_write_synch=0000000; ELSIF(clk_writeevent AND clk_write=1)THEN read_ptr_meta=rea

52、d_ptr; read_ptr_write_synch=read_ptr_meta; END IF;END PROCESS;-P6进程的功能是:通过两级触发器消除亚稳态来产生出被读时钟同步了的写时针 P6:PROCESS(clk_read,rst) BEGIN IF(rst=0) THEN write_ptr_meta=0000000; write_ptr_read_synch=0000000; ELSIF(clk_readevent AND clk_read=1)THEN write_ptr_meta=write_ptr; write_ptr_read_synch=write_ptr_met

53、a; END IF;END PROCESS;-P7进程的功能是:通过对读写时针的比较,产生正确的满信号P7:PROCESS(write_ptr,read_ptr_write_synch) BEGIN IF(write_ptr(6 DOWNTO 5)=NOT(read_ptr_write_synch(6 DOWNTO 5) AND (write_ptr(4 DOWNTO 0)=read_ptr_write_synch(4 DOWNTO 0) THEN full_flag=1; ELSE full_flag=0; END IF;END PROCESS;-P8进程的功能是:通过对读写时针的比较,产生正确的空信号。P8:PROCESS(read_ptr,write_ptr_read_synch) BEGIN IF(write_ptr_read_synch=read_ptr) THEN empty_flag=1; ELSE empty_flag=0; END IF;END PROCESS;full=full_flag; -将满信号输出empty=empty_flag; -将空信号输出END behav;为了实现读写指针的同步,在P5、P6进程中采用了两级触发器来消除亚稳态,这种方法对输入信号的一级延时。在FPGA中综合实现时应当采取时钟约束等措施加以改善。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!