图像数据处理【通信工程基于FPGA的图像数据处理FIFO核设计论文】

来源:医学教育网 发布时间:2020-03-20 点击:

  

 基于FPGA的图像数据处理

 FIFO核设计

 院

 系:信息科学与工程学院

 专 业 班:通信1201

  姓

 名:

 学

 号:

 指导教师:

 2016年5月

 基于FPGA的图像数据处理

 FIFO核设计

 The Design of FIFO Core Processing Image Data Based on FPGA

  摘 要

 在近代不断更新换代的的集成电路芯片领域中,一个完整的系统所包含的东西更多更全面,因而现今系统的设计规模都在不断的扩大。

 如今一个系统通常需要多个时钟的协调才能正常的运行,而数据在多个不同的时钟之间传输会出现数据丢失,传输不准确等问题,如何使数据在不同的时钟之间正确的传输成为了系统设计的一个主要问题,使用异步FIFO(First In First Out)技术,使数据按顺序进入存储器再按顺序被读出,是解决这一问题的简单而且很有效的方法。

 在异步FIFO的电路中,时钟的周期和相位是分开存在的,互相之间不会影响,保证数据传输的时效性和准确性。该电路中也存在亚稳态的问题,亚稳态会使数据在传输过程中出现丢失和失真,这两个问题是是这次设计中首要解决的重难点。

 本次设计是以FPGA为基础,在Quartus II软件中使用VHDL 硬件描述语言进行逻辑描述,编译出所需要的各个模板,将模板整合组合成此次设所需计的异步FIFO电路。此次设计采用的是Quartus II软件中自带的EP2C5T144C8N芯片最小系统,硬件电路中使用的也是该芯片的核心板。设计出的异步FIFO电路中,其所包含的RAM的深度为128 bit,数据宽度为8 bit。先使用软件中自带的仿真功能对其进行时序仿真测试,再在实际中进行硬件仿真测试,确保该电路的正常运行,确保设计的成功性。

 关键词:异步FIFO 亚稳态 空满状态判断 硬件仿真

 Abstract

 In the field of modern integrated circuit chip, a complete system contains more and more comprehensive, so the design scale of the system is constantly expanding.

 Now a systems usually require multiple clock coordination can be normal operation, and the data between different clock transmission loss of data transmission accurate problem. How to make the data between different clock correct transmission has become a major issue in system design, using asynchronous FIFO (first in first out) technology, the data first and then stored in according to the transmission order out, is to solve this problem, a simple and effective method.

 In the circuit of asynchronous FIFO, the period and the phase of the clock exist separately, which will not affect each other, so as to ensure the timeliness and accuracy of data transmission. The circuit also has the problem of the metastable state, which will cause the loss and distortion of the data in the transmission process. These two problems are the most important and difficult points in the design.

 The design is based on FPGA based in the Quartus II software using VHDL hardware description language to carry on the description logic, a compile time needed for each template, the template integration into the design required the asynchronous FIFO circuit. The design uses the Quartus II software comes with the EP2C5T144C8N chip minimum system, the use of the hardware circuit is the core of the chip board. Designed in the asynchronous FIFO circuit, the depth of the RAM is 128 bit, the data width is 8 bit. First use the software comes with the simulation function of its timing simulation test, and then in the actual hardware simulation test, to ensure the normal operation of the circuit, to ensure the success of the design.

 Key words: Asynchronous FIFO synchronization Metastable Empty full status determination Hardware simulation

 目 录

 摘要 I

 Abstract II

 绪论 1

 1

 异步FIFO设计要求及基本原理 2

 1.1 功能设计 2

 1.2

 设计原理 3

 1.3

 设计重点 3

 1.4

 异步FIFO验证 4

 2

 模块设计 5

 2.1

 格雷码计数器模块 5

 2.2

 同步模块 5

 2.3

 格雷码∕自然码转换模块 6

 2.4

 空满标志产生模块 7

 2.5

 双端口RAM 9

 3

 仿真测试 10

 3.1

 模块合并 10

 3.2

 时序仿真 12

 3.2.1

 复位功能仿真测试 12

 3.2.2

 读写操作功能仿真测试 12

 3.2.3

 异步FIFO电路整体仿真测试 13

 3.2.4

 结果汇总 14

 4 硬件仿真与实现 15

 4.1 外部电路焊接 15

 4.2

 引脚分配 16

 4.3

 调试电路 18

 4.3.1

 异步时钟产生模块 19

 4.3.2

 伪随机数据队列产生模块 19

 4.3.3

 调试电路时序仿真 19

 4.3.4

 调试电路引脚分配 20

 4.3.5

 调试电路硬件仿真 20

 4.4

 异步FIFO电路硬件仿真 21

 4.4.1

 复位功能硬件仿真 22

 4.4.2

 读、写操作功能硬件仿真 22

 4.4.3

 异步FIFO硬件电路整体功能硬件仿真 23

 4.4.4

 硬件仿真结果汇总 24

 结论 25

 致谢 26

 参考文献 27

 附录1格雷码计数器的VHDL设计程序 28

 附录2同步模块的VHDL设计程序.....................................30

 附录3格雷码∕自然码转换模块的VHDL设计程序.........................31

 附录4读空状态判定的VHDL设计程序.................................32

 附录5写满状态判定的VHDL设计程序.................................33

 附录6伪随机数据队列产生模块的VHDL设计程序.......................34

 绪 论

 国内外设计FIFO时,通常使用两种方法,一是利用可编程逻辑器件来构造FIFO(如Xilinx公司),二是利用Verilog、VHDL等硬件描述语言来对FIFO的功能结构进行描述[1]。在大部分的EDA软件中,都是通过综合器来完成对EDA等硬件语言的编译的,综合器将硬件描述语言的描述转变为物理可实现的电路形式,由于FIFO是基于RAM结构的,大部分的参考资料都是建立在数组存取的基础上对FIFO进行描述的,然而综合器对数组的综合一般是将其转变为寄存器的结构,这带来的缺陷是综合后的结构会非常庞大,造成在大容量的FIFO设计时,会产生大量面积的浪费,甚至无法集成[2]。

 本课采用FPGA为基础,使用VHDL 硬件描述语言进行逻辑描述,设计出了一个基于FPGA的异步FIFO电路。课题采用FPGA中常用的Quartus II软件,在软件中自带的Cyclone II系列芯片中,使用了EP2C5T144C8N芯片,运用FPGA的相关设计知识,设计出了一个异步FIFO电路,该电路RAM的深度为128 bit,数据宽度为8 bit。使用软件中自带的仿真功能对其进行时序仿真测试,再在实际中进行硬件仿真测试,确保该电路的正常运行。

 论文各章节的主要内容安排如下:

 第一章为本次异步FIFO电路设计要实现的功能,对设计的思路进行具体的描述,对设计的原理进行详细的介绍。

  第二章为模块设计,主要介绍了该异步FIFO电路所包含的各个模块,每个模块承担着什么样的功能。

 第三章为时序仿真,通过连线将各个编译出来的单独的模块组合在一起,形成该异步FIFO电路的顶层模块,并使用Quartus II软件自带的仿真功能进行波形仿真,对模块进行校验。

  第四章为硬件仿真,焊接一块外设电路板,将外设电路板连接到核心板上,用来控制系统的运行,将编译好的整个异步FIFO电路加载到核心板中,再编译出调试电路,担任随机数和读写时钟的输入,再搭载到另外一块核心板上,连接到异步FIFO电路硬件上,对整个异步FIFO电路进行硬件仿真,观察得出结论。

 1

 异步FIFO设计

 1.1

 功能设计

 此次设计使用的是Quartus II软件中自带的EP2C5T144C8N芯片,作为设计的异步FIFO电路中的核心模块随机存储器(RAM),该FIFO电路中RAM的设计深度为128 bit,设计的数据宽度为8 bit。该核心模块的外部接口如图1-1所示,模块各个接口说明如表1-1所示。

 整个设计的异步FIFO电路满足的功能是当信号处于复位状态后,通过读写使能信号来控制电路的读写操作。当写时钟信号脉冲上升沿到来时,先判断电路中的数据写入信号是否有效,有效则将一个八位的数据写入随机存储器中;当读时钟信号脉冲上升沿到来时,同理判断读信号是否有效,有效则从随机存储器中读取一个八位的数据出来。当随机存储器中数据写满时,必须产生一个写满标志,阻止数据的继续写入;反之,当随机存储器中的数据读空时,必须产生一个读空标志,阻断数据的继续读出。

 图1-1 异步FIFO外部接口

  表1-1 异步FIFO外部接口说明

 管脚名称

 方向

 说明

 rst

 in

 复位,低电平有效

 wr_en

 in

 写使能,高电平有效

 rd_en

 in

 读使能,高电平有效

 wr_clk

 in

 写时钟

 rd_clk

 in

 读时钟

 full

 out

 读空标志

 empty

 out

 写满标志

 Data[7..0]

 out

 写入数据

 q[7..0]

 out

 读出数据

 1.2

 设计原理

 异步FIFO的结构其实并不复杂,其基本的结构图如图1-2所示。

 读时钟

 读地址

 读控制

 读数据

 写地址

 写控制

 写数据

 双端口

 RAM

 写地址

 产生逻辑

 读地址

 产生逻辑

 同步电路

 空满标志

 产生逻辑

 写时钟

 复位

 图1-2 异步FIFO的基本结构

 从图中可以看出,异步FIFO是类似于圆环的循环结构,其主要由双端口RAM、读、写地址产生逻辑、空满标志产生逻辑等组成。异步FIFO拥有两个完全独立的时钟域,分别是分隔开来的写时钟域和读时钟域,但是在同步电路的同化作用下,系统又可以同时进行读写操作。空满标志信号由空满标志产生逻辑与同步后的读写地址比较来产生,同时,空满标志信号又可以和读写使能信号一起控制电路的读写操作。

 1.3

 设计重点

 异步FIFO的设计存在两个重点:一是需要通过同步电路将异步信号同步化,使系统的读写操作可以同时进行以此来降低亚稳态产生机率;二是使系统运行中,能正确产生关于存储器的空满标志[8]。

 亚稳态是一种在异步FIFO电路中必然会发生的物理现象。在电路中,触发器必须满足建立时间和保持时间的要求,但是由于是在电路内部的两个毫无关联的时钟域之间进行信号传递,有可能会不满足建立和保持时间。这种情况会使系统中存在未知状态,输出将有可能是逻辑0或者逻辑1,或者是介于两者之间的任何值,这个过程称为亚稳态。亚稳态的出现会使数据在传输过程中出现丢失和失真等不同情况,亚稳态虽然没有办法避免,但可以通过下面的两种简单方法来降低亚稳态的产生概率

 [12]:

 (1) 采用格雷码计数器的方法来编写读写地址。格雷码是一种错误率最低的编码方式,每一次计数时的增加都只会使一位数据位产生改变,避免了采用二进制码技术时产生的多位改动。

 (2) 使用触发器将异步的信号同步化。使用触发器来同步信号或者增加电路的冗余可以很好的降低亚稳态产生的机率,本课题使用经常用到的D触发器,采用D触发器二级同步的方式,工作电路图电路图如图1-3所示。当且仅当Q1的跃变非常接近时钟沿的时候,Q2才会进入亚稳态[2],这样就使系统变得更加的稳定。

 D

 Q

  CLK

 D

 Q

  CLK

 异步输入

 同步输出

 图1-3 D触发器二级同步

 1.4

 异步FIFO验证

 对设计出来的异步FIFO方案进行验证,验证的功能包括:复位功能、数据的读写功能等,单个功能合格后,再对异步FIFO的整体电路进行验证,若能达到本次设计的预期要求,则本次对异步FIFO的设计是成功的。

  2

 模块设计

 2.1

 格雷码计数器模块

 采用格雷码计数器的方式是为了能降低亚稳态出现的概率。本次课题为了能更准确的判断存储器的空满状态,采用了5 bit的格雷码计数器。格雷码计数器模块的程序详见附录。

 利用Quartus II软件对程序编译后生成的格雷码计数器模块如图2-1所示,再对该模块进行时序仿真测试,得到的格雷码计数器模块仿真波形如图2-2所示。从波形的仿真图中可以看出格雷码计数时只有一位数据产生了变化,该模块设计成功。

 图2-1 格雷码计数器模块

 图2-2 5 bit格雷码计数器仿真波形

 2.2

 同步模块

 前面提到过,本次异步FIFO设计为了降低亚稳态发生的概率,使用D触发器二级同步将异步信号同步化。

 其具体的工作过程是:当空满标志模块判断写满标志时,同步模块将读指针与写时钟同步后,再和写指针比较而产生写满标志;当空满标志模块在判断读空标志的时候,同步模块将写指针与读时钟同步后,再和读指针比较而产生读空标志。同步模块的设计程序详见附录。

 利用Quartus II将程序编译成功后生成的同步模块如图2-3所示,继而对该模块进行时序仿真,其仿真波形如图2-4所示。从仿真的波形图中可以看出,该模块将输入的异步码与输入时钟同步后输出同步码,由延时的时间可以看出其满足二级同步的要求,该模块设计成功。

 图2-3 同步模块

 图2-4 同步模块仿真波形

 2.3

 格雷码∕自然码转换模块

 前面为了处理亚稳态的问题,将异步FIFO中的读、写地址转换成了格雷码,但是在RAM进行数据存储和为了产生空满标志而将读、写地址同步后进行比较的过程中仍需要使用自然二进制码。否则,这些操作无法进行。所以在将异步地址信号同步后,仍需将读、写地址转换为自然二进制码,才能保证电路的正常运转。格雷码∕自然码转换模块的VHDL设计程序详见附录。

 利用Quartus II软件对程序编译成功后生成的格雷码∕自然码转换模块如图2-5所示,像前面介绍的一样再对模块进行波形仿真测试来判定该模块的正确性,其仿真波形如图2-6所示,观察波形,该模块编译正确。程序详见附录。

 图2-5 格雷码∕自然码转换模块

 图2-6 模块仿真波形

 2.4 空满标志产生模块

 异步FIFO系统中起着决定性作用的就是空满标志产生模块,该模块关乎着异步FIFO的性能。空满标志产生模块的设计基本原则就是:无论处于什么情况下,读、写地址都不会同时对同一个存储地址进行读写。否则,会使整个程序运转产生错误。 要避免数据写满后还在继续写入而造成溢出的情况,从而使一个有用的数据被覆盖而没有读出;同时也要避免存储空间中的数据读完后,还在继续读取从而造成一个无用的信号被读出。为了解决这些问题,对异步FIFO系统设置了读空和写满两个状态。读空、写满状态判定的VHDL设计程序分别详见附录。

 将各个子模块编译出来后,再连接到一起从而构成空满标志产生模块的顶层电路,如图2-7所示,其中empty_cmp模块和full_cmp模块分别是读空标志判定模块和写满标志判定模块。将该顶层电路编译成功从而生成空满标志产生模块如图2-8所示。

 图2-7 空满标志产生模块顶层电路图

 图2-8 空满标志产生模块

 2.5

 双端口RAM

 此次设计的异步FIFO系统中,其存储器采用的是双端口的RAM,使用Altera的Mega Wizard Plug-In Manager 中的相关功能将预生成的RAM设置成双端口,再将其存储深度设置为128 bit,数据宽度设置为8 bit。最后定制生成的双端口RAM外部接口如图2-9所示。

 图2-9 双端口RAM外部接口

 3

 仿真测试

 3.1

 模块合并

 通过上一章的介绍,已经将异步FIFO系统所需要的各个模块编译出来了,其各个模块分别是格雷码计数模块、同步模块、格雷码∕自然码转换模块、空满标志产生模块以及双端口RAM,现在需要做的就是讲各个模块整合在一起,形成异步FIFO的实体电路,其顶层实体图如图3-1所示,图中的gray模块就是格雷码计数器模块,G2B模块是格雷码∕自然码转换模块,full_empty是空满标志产生模块,dram模块是双端口RAM,将各个模块成功的合并在一起后,接下来要做的就是时序仿真,对异步FIFO系统中所包含的功能进行测试,来判断是否达到预期的设计目标。

 图3-1 异步FIFO顶层电路图

 3.2

 时序仿真

 前面介绍对各个模块单独进行波形仿真时,该模块的功能和特性能正常的表现出来,但是当各个模块合并在一起时,该模块在系统中不一定能正常的行使其功能。因而需要在整个的异步FIFO系统中对其所包含的模块以及其所对应的功能进行波形仿真与测试。确认该异步FIFO系统是否满足预期的设计要求。

 3.2.1

 复位功能仿真测试

 复位功能就像计算器中清零功能一样,简单却很实用,是整个异步FIFO系统的基础设计,本次异步FIFO设计中采用的是手动复位,用于中断和清空数据的传输,再重新连接传输。

 使用Quartus II软件对复位功能进行时序仿真波形测试,得到的结果如图3-2所示,当不按下复位键即复位端置为1的时候,可以从图中看出系统在正常工作;当按下复位键即复位端置为0时,从图中可以看出,无论读写时能信号发生什么样的改变,系统中数据的传输时钟没有变化,此时系统处于读空的状态,停止了数据的读出,该复位功能满足了预期方案的设计要求

 图3-2 复位功能时序仿真测试波形

 3.2.2

 读写操作功能仿真测试

 如果将整个异步FIFO系统看作成一个人的话,那么RAM就相当于人的心脏,而读写操作功能就等于是连接全身各个器官的血管。写操作功能时将数据写入到RAM中进行存储,而读操作功能就是将数据从RAM中读出,再进行传输。先写入,后读出。

 利用Quartus II软件先对写操作功能进行时序波形仿真,得到的结果如图3-3所示。先将系统的复位端置为1,保证系统的正常运行,再将写使能信号置为1,将读使能信号置为0,过一会儿后,可以看到数据的输出状态始终保持不变,读空标志信号一直为0,写满标志信号一直为1,表明系统一直处于写满状态,而没有进行数据读出,写操作功能符合设计需求。

 再按照同样的方法,复位端依然置为1,再对系统的读操作功能进行波形仿真测试,将写使能信号置为0,再将读使能信号置为1,得到的波形仿真图如图3-4所示,可以看出系统在运行一会后,写满标志信号始终为0,而读空标志始终为1,说明系统没有进行数据的写入,而一直在进行数据的读出,储存的数据读完后,则一直处于读空状态,可以得出读操作功能满足了设计的要求。

 图3-3 写操作功能时序仿真测试波形

 图3-4 读操作功能时序仿真测试波形

 3.2.3

 异步FIFO电路整体仿真测试

 基本的功能测试完之后,再对电路整体进行仿真测试。先将系统复位端和读写时能均置为1,再将系统输入的读时钟频率设置为写时钟频率的2倍,运行系统后得到的波形结果如图3-5所示。

 图3-5 异步FIFO系统时序仿真测试波形1

 从图中可以看出,系统运行一段时间后,在读空状态和非读空状态之间发生周期性的交替变换,但是系统始终都不会处于写满状态,说明系统可以同时进行读写操作,但是由于系统的读操作速率快于系统的写操作速率,所以系统永远也不会处于写满状态。同时也可以看到系统的输入队列和输出队列所包含的数据是完全一样的,数据的写入和读出顺序也一样,只是存在一点程序运行上的延时,说明系统完全遵从了先入先出的原则。

 测试完上一种情况之后,再反过来进行设置,将读时钟频率设置为写时钟频率的2倍,重复上面的操作,系统运行一段时间后得到波形结果如图3-6所示,可以看出来系统会在写满状态和非写满状态之间进行周期性的交替变换,但是系统永远也不会处于读空状态,因为写操作速率快于读操作速率,输入和输出的队列数据和上面的一样,遵从了电路的先入先出原则,结合图3-5和图3-6可以看出,该异步FIFO的整体电路设计达到了预期的设计要求。

 图3-6 异步FIFO系统时序仿真测试波形2

 3.2.4

 结果汇总

 结束了所有的时序仿真,根据上面所得到所有时序仿真波形测试的结果可以看出,该异步FIFO的整体电路设计实现了所有当初预期满足的功能,能在两部时钟之间准确的传输数据,能先入先出的读写数据,能产生正确的空满状态判断,读、写操作能正常的同时进行等等。说明该异步FIFO整体的电路设计思路是成功的。但是只是这样得波形仿真还是不足以说明问题的,还需要通过外设电路板与核心板连接进行硬件仿真来观察结果。

 4

 硬件仿真与实现

 4.1

 外部电路焊接

 对于整个异步FIFO系统的硬件仿真,光有一个系统核心板还是不足的,需要借助外设电路板来加以实现,需要使用外设电路板来控制数据的读写功能。数据的读写使能控制需要两个能上下拨动开关,才能加以实现。拨动开关的原理图如图4-1所示,再加上一些辅助的器件后,焊接好的外设电路板如图4-2所示。

 .

 GND

 拨码开关

 100Ω

 4.7kΩ

 控制信号输入

 .

 Vcc

 图4-1 拨动开关原理图

 图4-2 外设电路板

 4.2

 引脚分配

 焊接好了外设电路板之后,接下来要做的就是进行引脚分配,将核心板的引脚与异步FIFO系统电路的引脚进行一一对应分配,同时外设电路板也需要进行相对应的引脚分配,才能将相对应的功能引入到EP2C5T144C8N最小系统核心板中。利用Quartus II软件自带的引脚分配功能,分配好了之后,引脚的对应如图4-3所示,其中需要特别注意的是,rst引脚分配为144引脚。引脚分配完成后再利用软件进行编译,编译成功后得到的端口引脚对应如图4-4所示。

 图4-3 异步FIFO电路引脚分配

 图4-4 端口引脚对应

 4.3

 调试电路

 电路的引脚分配完成后,再利用杜邦线将核心板引脚端口与外设电路板的引脚端口进行一一对应连接,连接好之后得到的实物如图4-5所示。整个系统的写时钟输入端位于核心板中的(18-19,A-C)区域,读时钟输入端位于核心板的(08-09,A-C)区域,写满标志的输出端位于核心板的(18-19,C-E(右))区域,读空标志输出端位于核心板的(08-09,C-E(右))区域,输入数据端位于核心板的(24-26,W-D(右))区域,输出数据端位于核心板的(01-03,W-D(右))区域,再利用软件通过AS接口将前面设计好的包括引脚分配已经完成的完整版电路下载入核心板中,则异步FIFO电路的整个硬件实物到此完成

  图4-5 异步FIFO硬件电路实物

 4.3.1

 异步时钟产生模块

 根据设计的实现功能可以看出,所设计的异步FIFO系统既不包含异步时钟产生模块,也不包含输入数据产生模块,所以我们就需要一个调试电路来自主的产生异步读写时钟信号和宽度为8 bit的输入数据队列,为了避免与异步FIFO核心板的硬件冲突,我们需要将该调试电路搭载到另一块核心板上。

  先在Quartus II软件上,将PLL锁相环制定出来,PLL锁相环会将EP2C5T144C8N核心板中自带的50 MHz时钟进行两次分频处理,一次分频处理为1/2分频,产生的异步输出时钟频率为25 MHz,另一次分频处理为1/4分频,产生的异步输出时钟频率为12.5 MHz,将这两个输出时钟连入外设电路板中读、写时钟区域,则就成为了异步FIFO硬件电路中的异步读写时钟输入,且时钟的频率周期正好相差一倍,方便验证。

 4.3.2

 伪随机数据队列产生模块

 根据编写的程序将该模块编译出来,得到一个数据宽度为8 bit的伪随机数据队列产生模块,将模块的数据输出端连接到外设电路板的数据输入引脚区域,则得到了硬件电路所需要的数据输入。程序代码详见附录。

 4.3.3

 调试电路时序仿真

 将调试电路所需要的模块组合完成后得到的电路图如图4-6所示其中大模块为异步时钟产生模块,小模块为伪随机数据产生模块。

 图4-6 调试电路

 进行波形仿真后得到的仿真波形如图4-7所示,可以看出该模块设计成功。

 图4-7 调试电路仿真波形

 4.3.4

 调试电路引脚分配

 像前面章节介绍的引脚分配原则一样,将该调试电路进行引脚分配,得到的引脚分表如图4-8所示,引脚分配完成后再进行编译,得到的结果如图4-9所示。

 图4-8 调试电路引脚分配表、

 图4-9 调试电路引脚分配完成

 4.3.5

 调试电路硬件仿真

 由于此电路知识一个很简单的调试电路,所以可以直接将其核心板与电脑相连,再用Quartus II软件自带的嵌入式逻辑分析仪SignalTap II,在仿真预调中将采样的深度设置为128 bit,最后对该系统进行硬件仿真得到波形图如图4-10所示,可以看出所得到的波形图与时序仿真时得到的波形图差不多,则该调试电路的硬件仿真也成功通过,整个调试电路包括核心板到此完成。

 图4-10 调试电路硬件仿真波形

 4.4

 异步FIFO电路硬件仿真

 在前面的准备充分后,最后要进行的就是异步FIFO整个电路硬件仿真,根据在上面章节中提到的引脚分配情况,将调试电路硬件、异步FIFO电路硬件以及外设电路板连接到一起后,组成实物电路如图4-11所示,其中位于最上方的核心板和外设电路板相连后组成了整个的异步FIFO硬件电路,位于最下放就是调试电路板,共同组成了整个的异步FIFO功能测试电路。然后再像介绍到的一样对整个电路所包含的功能进行硬件仿真。

 图4-11 异步FIFO功能测试电路

 4.4.1

 复位功能硬件仿真

 依照前面章节提到的对调试电路的硬件仿真,对异步FIFO功能测试电路进行硬件仿真,首先对电路的复位功能进行仿真测试,得到的波形图如图4-12所示,从图中可以看出波形与前面对复位功能进行波形仿真时得到的图形一样,按下复位键后,系统处于读空状态,不再有数据读出,所以该电路的复位功能符合预期的设计要求。

 图4-12 复位功能硬件仿真测试波形

 4.4.2 读、写操作功能硬件仿真与测试

 接下来再进行读、写操作功能的硬件仿真,分开进行,先对写操作进行硬件仿真,再仿真读操作,硬件仿真的方法与前面介绍到的对这两个功能进行波形仿真的方法是大同小异的。将外设电路板中的拨码开关中1号码置为1,2号码置为0,即写使能在工作,而读使能没有,得到的结果如图4-13所示。运行一段时间后,可以看出,一直无数据输出,而一直处于写满状态,读空状态始终没有出现,可以得出写操作的硬件仿真成功。

 再反过来进行操作,将1号码拨为0,2号码拨为1,对读操作进行硬件仿真,得到的波形结果如图4-14所示,可以看刚好与写操作的结果相反,有数据输出,且系统一直处于读空状态,没有出现满状态的情况,读操作的硬件仿真成功。总体来说,异步FIFO硬件电路的读写功能都满足了设计要求。

 图4-13 写操作功能硬件仿真测试波形

 图4-14 读操作功能硬件仿真测试波形

 4.4.3

 异步FIFO硬件电路整体功能软硬件仿真与测试

 异步FIFO硬件电路的分功能测试好了之后,我们就要对异步FIFO硬件电路的整体进行测试汇总。整体电路的硬件仿真测试也是与前面的波形仿真测试差不多。在包含异步时钟调试电路的核心板中,引脚31对应的时钟频率是25 MHz,引脚32对应的时钟频率是12.5 MHz,只要对换引脚的两根接口线,改变读写时钟频率。

 对于整体硬件电路的仿真,现行测试的是读时钟频率是25 MHz,写时钟频率是12.5 MHz时的情况,将开关拨码1,2号都置为1,程序运行一段时间后,得到稳定的波形结果如图4-15所示,可以看出,由于读时钟频率是写时钟的两倍,系统在读空状态和非读空状态之间处于周期性的交替变换,而永远也不会处于写满状态,从输入和输出的状态可以看出,系统是满足先入先出的要求的,输入与输出数据之间只存在很短的延时。

 关闭电路后,再将包含异步时钟调试电路核心板中,引脚31和引脚32所对应的接线对换,再将开关拨码1和2都置为1,重新运行电路。此时读时钟频率是12.5 MHz,写时钟频率是25 MHz。程序运行一段时间后,得到的波形结果如图4-16所示,由于写时钟频率是读时钟的2倍,西永在写满状态和非写满状态之间处于周期性的交替变换,而永远也不会处于读空状态,和上面测试时一样,输入和输出数据是满足先入先出的总体要求,也是存在一定的延时。综合两个测试结果来看,异步FIFO的硬件电路是成功的,达到了设计要求。

 图4-15 异步FIFO系统硬件仿真测试波形1

 图4-16 异步FIFO系统硬件仿真测试波形2

 4.5

 硬件仿真结果汇总

 综合全部的硬件仿真测试结果来看,本次异步FIFO电路在硬件方面的整体设计也是成功的,满足了所有的设计要求。能正确的复位,能满足任意两个异步读写时钟的输入,能正确的判定系统的空满状态,可以稳定的将宽度为8 bit的数据在两个独立的异步时钟之间进行传输,没有出现数传输过程中的混乱,丢失等情况,满足了先入先出的设计前提等等。

 结 论

 异步FIFO电路在现代日新月异发展迅速的电子集成电路芯片中有着大量的运用,在芯片电路中,它承载着存储和运输的作用,传输过来的数据经过它短暂的存储之后再转发出去,它就相当于一个数据的缓冲区,其作用不可忽视。由于国内的集成电路芯片技术起步价较晚,研发出的异步FIFO电路还远远不能满足市场和军事的需求,所以对异步FIFO电路的技术研究要不断的革新换代。

 本次的设计只是基于FPGA技术,采用的只是Quartus II软件中自带着的EP2C5T144C8N芯片最小系统,只是对异步FIFO技术有了一个最基本的了解,其简单的设计需求还是让我费了不少功夫,才最终获得成功。

 针对本次设计的要求,我先是通过相关资料和书籍对异步FIFO电路有了一个大致的了解,再在FPGA技术为基础的情况下勾画出大致的电路层框架,根据所需要满足的功能设计出相对应的模块,一个一个的进行波形仿真,修改,直到各模块仿真成功,再连接构成整体的异步FIFO电路,再进行整体的波形仿真,修改相对应错误的地方,直到仿真成功。只是软件的仿真成功还不足以说明,还需要进行硬件的仿真,发现只是一块核心板不够,有焊接了外设电路板,来控制系统的运行,而没有输入电路,又编写了一个调试电路模板,再增加了一块核心板搭载调试电路,构建成功后才能进行硬件仿真,调试,最后硬件仿真也成功才宣告整个的设计获得成功。

 由于本人的能力问题,此次设计也存在着不足之处,如外接的调试电路的调试电路,要改变输入的异步时钟的频率时就要就要把接口线拔了再交换接口,显得有点麻烦;再是此设计使用了两块核心电路板,耗费过多,可以通过程序编辑,将调试电路和异步FIFO电路搭载到一块核心板上,节省资源。

 致 谢

 这次毕业设计师对我大学四年所学知识的一个考验,只存在于头脑里的知识没什么用,要能真正的运用所学的只是做出成果来,毕竟实践才能出真知,在论文即将完成之际,我衷心的感谢对我给予过帮助的老师和同学。

 此次毕业设计我的指导教师是陈道群老师,感谢他在此此设计中对我无私的指导和帮助,在设计之初,他就告诉了我需要详细研读的资料和书籍,需要弄懂设计中需要的核心知识点,遇到不懂的地方他总能耐心的给予讲解,需要的他总能很快的就落实。陈老师刻苦积极的钻研精神,对学术研究的仔细与严谨影让我深深的佩服,艰难困苦,玉汝于成,没有陈老师的帮助,此次的设计我绝对做不出来,在此由衷的道声“谢谢”。再就是在这次设计中帮助过我的同学,一个人的力量总是渺小的,友情的力量是伟大的,同学的不断补充和提问让我对设计有了新的思路和更改,最终才能获得成功,在此由衷的感谢他们。

 最后就是学校,感谢学校的四年以来的栽培之恩,祝福以后学校能越来越来繁荣昌盛,桃李满天下。

 参考文献

 [1] 韩进,程勇,齐现英.VHDL在数字集成电路设计中的应用[J].山东科技大学学报(自然科学版),2003.

 [2] 孟庆海,张洲.VHDL基础及经典实例开发[M].西安交通大学出版社,2008.

 [3] 潘松,黄继业.EDA技术实用教程VHDL版(第四版)[M].北京科学出版社,2010.

 [4] 潘松,王国栋.VHDL实用教程(修订版)[M].成都电子科技大学出版社,2001.

 [5] 任爱锋,初秀琴等.基于FPGA的嵌入式系统设计[M].西安电子科技大学出版社,2004.

 [6] 徐世伟.异步FIFO的设计与实现[D].西安电子科技大学,2007.

 [7] 张永安,李树华,刘跃平.用VHDL语言设计实现单片机串行口输出的串并转换[J].内蒙古大学学报(自然科学版),2004.

 [8] 张维旭,贺占庄.基于FPGA的异步FIFO设计[D].西安微电子技术研究所,2006.

 [9] 赫晓莉,刘洪波,沈绪榜.异步FIFO中存储单元的分析设计[J].计算机技术与发展,2007.

 [10] 雷海卫,刘俊.FPGA中软FIFO设计和实现[J].中山大学,2007.

 [11] 吴厚航. FPGA设计实战演练(逻辑篇).北京:清华大学出版社,2015:50-55.

 [12] 刘洪波,龙娟,郝晓莉,沈绪榜.异步FIFO状态判断的研究与设计.西安徽电子研究所.2007.03

 [13] 汤安全.基于FPGA的数据延迟器和存储器设计[D].安徽大学,2014.

 [14] Clifford E.Cummings.Simulation and Synthesis Techniques for Asynchronous FIFO Design[C].SNUG 2002(Synopsys Users Group Conference,San Jose,CA,2002) User Papers.March 2002.

 [15] Kanoopoulos N,Hallenbeck J J.A First - In,First - out Memory for Signal Processing Applications[J]

 .IEE Transactions on Circuits and System,1986.556-558.

 附录1格雷码计数器模块的VHDL设计程序

 library ieee;

 use ieee.std_logic_1164.all;

 use ieee.std_logic_unsigned.all;

 use ieee.std_logic_arith.all;

 entity gray is

  port(

 clk : in std_logic;

 en : in std_logic;

 addr_gray : out std_logic_vector(4 downto 0)

 );

 end;

 architecture bhv of gray is

 signal reg_g : std_logic_vector(4 downto 0);

 signal new_g : std_logic_vector(4 downto 0);

 begin

 process(clk,en)

  begin

 if rising_edge(clk) then

  if en = '0' then

 null;

  else

 new_g <= reg_g;

  end if;

 end if;

  end process;

  addr_gray <= new_g;

  process(new_g)

  variable normal : std_logic_vector(4 downto 0);

  variable temp_g : std_logic_vector(4 downto 0);

  begin

 temp_g := new_g;

 normal(4) := temp_g(4);

 for i in 3 downto 0 loop

  normal(i) := temp_g(i) xor normal(i+1);

 end loop;

 for i in 0 to 4 loop

  if (normal(i) = '0' or i=4)then

 temp_g(i) := not(temp_g(i));

 exit;

  end if;

 end loop;

 reg_g <= temp_g;

  end process;

 end;

 附录2同步模块的VHDL设计程序

 library ieee;

 use ieee.std_logic_1164.all;

 use ieee.std_logic_unsigned.all;

 entity sync is

  port(

 clk : in std_logic;

 addr_in : in std_logic_vector(4 downto 0);

 addr_out : out std_logic_vector(4 downto 0)

 );

 end sync;

 architecture bhv of sync is

 signal temp : std_logic_vector(4 downto 0);

 begin

  process(clk)

  begin

 if rising_edge(clk) then

  addr_out <= temp;

  temp <= addr_in;

 end if;

  end process;

 end;

 附录3格雷码∕自然码转换模块的VHDL设计程序

 library ieee;

 use ieee.std_logic_1164.all;

 use ieee.std_logic_unsigned.all;

 entity G2B is

  port(

 gray : in std_logic_vector(4 downto 0);

 normbit : out std_logic_vector(4 downto 0)

 );

 end;

 architecture bhv of G2B is

 begin

  process(gray)

  variable temp_g : std_logic_vector(4 downto 0);

  variable temp_n : std_logic_vector(4 downto 0);

  begin

 temp_g := gray;

 temp_n(4) := temp_g(4);

 for i in 3 downto 0 loop

  temp_n(i) := temp_g(i) xor temp_n(i+1);

 end loop;

 normbit <= temp_n;

  end process;

 end;

 附录4读空状态判定的VHDL设计程序

 library ieee;

 use ieee.std_logic_1164.all;

 use ieee.std_logic_unsigned.all;

 entity empty_cmp is

  port(

 wr_addr : in std_logic_vector(4 downto 0);

 rd_addr : in std_logic_vector(4 downto 0);

 empty : out std_logic

 );

 end;

 architecture bhv of empty_cmp is

 begin

  empty <= '1' when (wr_addr(4 downto 0) = rd_addr(4 downto 0))

  else '0';

 end;

 附录5写满状态判定的VHDL设计程序

 library ieee;

 use ieee.std_logic_1164.all;

 use ieee.std_logic_unsigned.all;

 entity full_cmp is

  port(

 wr_addr : in std_logic_vector(4 downto 0);

 rd_addr : in std_logic_vector(4 downto 0);

 full : out std_logic

 );

 end;

 architecture bhv of full_cmp is

 begin

  full <= '1' when (wr_addr(4) /= rd_addr(4)) and (wr_addr(3 downto 0) = rd_addr(3 downto 0))

  else '0';

 end;

 附录6伪随机数据队列产生模块的VHDL设计程序

 library ieee;

 use ieee.std_logic_1164.all;

 use ieee.std_logic_unsigned.all;

 entity shuiji is

  port(

 clk : in std_logic;

 data : out std_logic_vector(7 downto 0)

 );

 end;

 architecture bhv of shuiji is

 signal t : std_logic;

 signal c1 : std_logic;

 signal temp : std_logic_vector(7 downto 0);

 begin

  t <= temp(7) xnor temp(0);

  process(clk)

  begin

 if rising_edge(clk) then

  c1 <= not c1;

 end if;

  end process;

  process(c1)

  begin

 if rising_edge(c1) then

  temp <= temp(6 downto 0) & t;

 end if;

  end process;

  data <= temp;

 end;

推荐访问:数据处理 通信工程 图像
上一篇:【体育学院辩论赛活动策划书】关于辩论赛的策划书
下一篇:[关于认真做好***镇人大、政府换届工作的通知]政府什么时候换届

Copyright @ 2013 - 2018 优秀啊教育网 All Rights Reserved

优秀啊教育网 版权所有