前 言
随着人类社会的高速发展,
电子行业也随之迅猛的发展,这也使得人们越来越想方设法的是自己更加方便、轻松的生活,例如:自从有了电视遥控器开启电视,更改电视频道,我们再也不用跑来跑去用手改换频道;自从有了全自动洗衣机,我们再也不用半自动洗衣机或者人工搓衣板去清洗衣服;自从有了交通灯,不仅省去了很多人力去指挥交通,而且使交通更加井然有序。当然,当具有定时、显示、加减分等多功能性的抢答器摆在我们面前时,我想人们不会用举手的方式或者举牌的方式进行抢答了。
如今无论是什么场合,只要举办抢答比赛,我们都能见到抢答器的使用,因为它以客观的电子电路进行状态判断,避免了竞赛中出现的人为的失误,或者由于某些原因造成的不公平。抢答器能够准确、公正的判断谁是第一抢答者,并且直观的指出谁是第一抢答者。由于其附加的定时、加减分等功能则能够省去部分人力,且更准确的规范时间。
现在市面上也存在着各种各样的抢答器,但主要流行的是
单片机抢答器和数字抢答器,虽然这两款抢答器都能实现抢答器的基本功能,但是都或多或少的存在着一些缺点。
单片机抢答器的设计。控制系统主要由单片机应用电路、存储器接口电路、显示接口电路组成。其中单片机89C51是系统工作的核心,它主要负责控制各个部分协调工作.。虽然单片机实现起来相当灵活,但随着抢答器数组的增加则存在着I/O口不足的问题。这就不能为以后进行抢答器组数的增加进行改进了。
数字抢答器的设计。数字抢答器电路主要是由电子元器件组成,数字抢答器由主体电路与扩展电路组成。虽然数字电路主要有元器件组成,成本较为便宜,且小规模数字逻辑设计思路简单,但是电路实现起来比较麻烦:进行电路规划,用
protel99画出电路的
PCB板,硬件的焊接与调试等等程序步骤。总之硬件设计不仅工作量大,而且要求也高。
介于上面两款抢答器的不足点,本次设计则采用FPGA现场可编程技术,这样就避免了硬件的焊接与调试,同时由于FPGA的I/O端口丰富,可以在设计的基础上略加修改实现多组输入的抢答器,增强了系统的灵活性。
本文介绍了一种采用EDA技术,基于FPGA并在QuartusⅡ工具软件环境下使用Verilog硬件描述语言编写的数码管显示4路抢答器的电路设计、设计思路以及实现功能。
本次设计以EP2C8Q208为核心,完成主持人的控制与参赛队伍的抢答功能;使用Quartus II软件用Verilog HDL完成代码编写,然后用Quartus II软件实现正确的波形仿真作为主要的技术指标。
根据本次设计的技术要求,特设计了以下各种模块来实现抢答器的基本功能:抢答判别模块,计时模块,分频器模块,计分模块,锁存器模块,数码管驱动模块等等。经过编译及其仿真所设计的程序,该设计的抢答器基本能够实现此次设计的要求,从而完成了抢答器应具备的功能。
EDA是电子设计自动化(Electronic DesignAutoma
tion)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。
利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程的计算机上自动处理完成。
EDA工具软件可大致可分为芯片设计辅助软件、可编程芯片辅助设计软件、系统设计辅助软件等三类。
目前进入我国并具有广泛影响的EDA软件是系统设计软件辅助类和可编程芯片辅助设计软件:Protel、Altium Designer、PSPICE、multisim12(原EWB的最新版本)、OrCAD、PCAD、LSIIogic、MicroSim、ISE、modelsim、
matlab等等。这些工具都有较强的功能,一般可用于几个方面,例如很多软件都可以进行电路设计与仿真,同时还可以进行PCB自动布局布线,可输出多种网表文件与第三方软件接口。
利用EDA技术进行电子系统的设计,具有以下特点:
- 用软件的方式设计硬件;用软件方式设计的系统到硬件系统的转换是由有关的考法软件自动完成的;
- 设计过程中可用有关软件进行各种仿真;
- 系统可现场编辑,在线升级;
- 整个系统可集中在一个芯片上,体积小、功耗低、可靠性高;
- 从以前的“组合设计”转向真正的“自由设计”;
- 设计的移植性好,效率高;
- 非常适合分工设计,团体协作。
因此,EDA技术是现代电子设计的发展趋势。
现行的抢答的实现方案主要有两种:一种则是使用单片机,另一种是小规模数字逻辑芯片和触发器。
单片机抢答器的设计。控制系统主要由单片机应用电路、存储器接口电路、显示接口电路组成。其中单片机AT89C51是系统工作的核心,它主要负责控制各个部分协调工作.。然而现如今单片机组成的抢答器也存在着一些缺点,或者应该说是不足点,虽然单片机实现起来相当灵活,但随着抢答器数组的增加则存在着I/O口不足的问题。这就不能为以后进行抢答器组数的增加进行改进了。
数字抢答器的设计。数字抢答器电路主要是由电子元器件组成,数字抢答器由主体电路与扩展电路组成。优先编码器、锁存器、译码电路将参赛队的输入信号在显示器上输出;用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。通过定时电路和译码电路将脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。虽然数字电路主要有元器件组成,成本较为便宜,且小规模数字逻辑设计思路简单,但是电路实现起来比较麻烦:进行电路规划,用protel99画出电路的PCB板,硬件的焊接与调试等等程序步骤。总之硬件设计不仅工作量大,而且要求也高。
现存的抢答器设计方案虽然都能实现抢答器的功能,但是又由于它们自身缺点的限制,有些方面很难或者说很麻烦实现。然而由于FPGA本身一些的特点、优点能够使基于FPGA制作的抢答器克服这些问题。FPGA作为新技术具有以下优点:
(1) FPGA的管脚多,容易实现大规模系统。
(2) FPGA的运行速度快。
(3) FPGA内部程序并行运行,有处理更复杂的功能。
(4) FPGA有大量的软核,能够进行二次开发。
所以学习FPGA并利用FPGA进行抢答器的设计是十分必要的。
本次设计的抢答器能够同时供应4位选手或者4个代表队进行抢答比赛,分别使用4个按钮a,b,c,d表示。同时需要设置系统复位和抢答控制开关,这需由主持人控制。主持人在允许抢答的情况下,计时器开始从30s开始倒计时,直到有人抢答成功后,由锁存器将时间锁存住,此时数码管上将显示剩余时间及抢答成功选手号码,同时对应选手的LED灯也被点亮。在判别选手是否回答正确后,由主持人控制加减按钮进行给分。在一轮比赛结束后,主持人按下复位按钮,则除了计分模块外,其他模块都复位为初始时刻,为下一轮的比赛做好准备。
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
其主要特点如下:
- 采用FPGA设计ASIC电路(专用集成电路),用户不需要投片生产,就能得到合用的芯片。
- FPGA可做其它全定制或半定制ASIC电路的中试样片。
- FPGA内部有丰富的触发器和I/O引脚。
- FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
- FPGA采用高速CMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。
FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。
加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。
目前以硬件描述语言(Verilog HDL或 VHDL)所完成的电路设计,可以经过简 单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。这些可编辑
元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。
FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,但是功耗较低。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD(复杂可编程逻辑器件备)。
根据市场上对FPGA的需要,则FPGA的主要分类有以下几种:
1) 按逻辑功能块的大小分类
可编程逻辑块是FPGA的基本逻辑构造单元。按照逻辑功能块的大小不同,可将FPGA分为细粒度结构和粗粒度结构两类。
细粒度FPGA的逻辑功能块一般较小,仅由很小的几个晶体管组成,非常类似于半定制门阵列的基本单元,其优点是功能块的资源可以被完全利用,缺点是完成复杂的逻辑功能需要大量的连线和开关,因而速度慢;粗粒度FPGA的逻辑块规模大,功能强,完成复杂逻辑只需较少的功能块和内部连线,因而能获得较好的性能,缺点是功能块的资源有时不能被充分利用。
近年来随着工艺的不断改进,FPGA的集成度不断提高,硬件描述语言(HDL)的设计方法得到了广泛应用。由于大多数逻辑综合工具是针对门阵列的结构开发的,细粒度的FPGA较粗粒度的FPGA可以得到更好的逻辑综合结果,因此许多厂家开发出了一些具有更高集成度的细粒度FPGA,如Xilinx公司采用MicroVia技术的一次编程反熔丝结构的XC8100系列,GateField公司采用闪速EPROM 控制开关元件的可再编程GF100K系列等,它们的逻辑功能块规模相对都较小。
2) 按互连结构分类
根据FPGA内部的连线结构不同,可将其分为分段互连型和连续互连型两类。
分段互连型FPGA中有不同长度的多种金属线,各金属线段之间通过开关矩阵或反熔丝编程连接。这种连线结构走线灵活,有多种可行方案,但走线延时与布局布线的具体处理过程有关,在设计完成前无法预测,设计修改将引起延时性能发生变化。
连续互连型FPGA是利用相同长度的金属线,通常是贯穿于整个芯片的长线来实现逻辑功能块之间的互连,连接与距离远近无关。在这种连线结构中,不同位置逻辑单元的连接线是确定的,因而布线延时是固定和可预测的。
3) 按编程特性分类
根据采用的开关元件的不同,FPGA可分为一次编程型和可重复编程型两类。
一次编程型FPGA采用反熔丝开关元件,其工艺技术决定了这种器件具有体积小、集成度高、互连线特性阻抗低、寄生电容小及可获得较高的速度等优点;此外,它还有加密位、反拷贝、抗辐射抗干扰、不需外接PROM或EPROM等特点。但它只能一次编程,一旦将设计数据写入芯片后,就不能再修改设计,因此比较适合于定型产品及大批量应用。
可重复编程型FPGA采用SRAM开关元件或快闪EPROM控制的开关元件。FPGA芯片中,每个逻辑块的功能以及它们之间的互连模式由存储在芯片中的SRAM或快闪EPROM中的数据决定。SRAM型开关的FPGA是易失性的,每次重新加电,FPGA都要重新装入配置数据。SRAM型FPGA的突出优点是可反复编程,系统上电时,给FPGA加载不同的配置数据,即可令其完成不同的硬件功能。这种配置的改变甚至可以在系统的运行中进行,实现系统功能的动态重构。采用快闪EPROM控制开关的FPGA具有非易失性和可重复编程的双重优点,但在再编程的灵活性上较SRAM型FPGA差一些,不能实现动态重构。此外,其静态功耗较反熔丝型及SRAM型的FPGA高。
FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。 现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。
FPGA是在PAL、GAL、EPLD、CPLD等可编程器件的基础上进一步发展的产物。它是作为ASIC领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克服了原有可编程器件门电路有限的缺点。
由于FPGA需要被反复烧写,它实现组合逻辑的基本结构不可能像ASIC那样通过固定的与非门来完成,而只能采用一种易于反复配置的结构。查找表可以很好地满足这一要求,目前主流FPGA都采用了基于SRAM工艺的查找表结构,也有一些军品和宇航级FPGA采用Flash或者熔丝与反熔丝工艺的查找表结构。通过烧写文件改变查找表内容的方法来实现对FPGA的重复配置。
根据数字电路的基本知识可以知道,对于一个n输入的逻辑运算,不管是与或非运算还是异或运算等等,最多只可能存在2n种结果。所以如果事先将相应的结果存放于一个存贮单元,就相当于实现了与非门电路的功能。FPGA的原理也是如此,它通过烧写文件去配置查找表的内容,从而在相同的电路情况下实现了不同的逻辑功能。
查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的 的RAM。 当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。
目前主流的FPGA仍是基于查找表技术的,已经远远超出了先前版本的基本性能,并且整合了常用功能(如RAM、时钟管理和DSP)的硬核(ASIC型)模块。FPGA芯片主要由7部分完成,分别为:可编程输入输出单元、基本可编程逻辑单元、完整的时钟管理、嵌入块式RAM、丰富的布线资源、内嵌的底层功能单元和内嵌专用硬件模块。
每个模块功能如下:
1) 可编程输入输出单元(IOB)
可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配要求,FPGA内的I/O按组分类,每组都能够独立地支持不同的I/O标准。通过软件的灵活配置,可适配不同的电气标准与I/O物理特性,可以调整驱动电流的大小,可以改变上、下拉电阻。
外部输入信号可以通过IOB模块的存储单元输入到FPGA的内部,也可以直接输入FPGA 内部。当外部输入信号经过IOB模块的存储单元输入到FPGA内部时,其保持时间(Hold Time)的要求可以降低,通常默认为0。为了便于管理和适应多种电器标准,FPGA的IOB被划分为若干个组(bank),每个bank的接口标准由其接口电压VCCO决定,一个bank只能有 一种VCCO,但不同bank的VCCO可以不同。只有相同电气标准的端口才能连接在一起,VCCO电压相同是接口标准的基本条件。
2) 可配置逻辑块(CLB)
CLB是FPGA内的基本逻辑单元。CLB的实际数量和特性会依器件的不同而不同,但是每个CLB都包含一个可配置开关矩阵,此矩阵由4或6个输入、一些选型电路(多路复用器等)和触发器组成。开关矩阵是高度灵活的,可以对其进行配置以便处理组合逻辑、移位寄存器或RAM。数字时钟管理模块(DCM)。
业内大多数FPGA均提供数字时钟管理(Xilinx的全部FPGA均具有这种特性)。Xilinx推出最先进的FPGA提供数字时钟管理和相位环路锁定。相位环路锁定能够提供精确的时钟综合,且能够降低抖动,并实现过滤功能。
3) 丰富的布线资源
布线资源连通FPGA内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同而划分为4类不同的类别。第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;第二类是长线资源,用以完成芯片 Bank间的高速信号和第二全局时钟信号的布线;第三类是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;第四类是分布式的布线资源,用于专有时钟、复位等控制信号线。
4) 底层内嵌功能单元
内嵌功能模块主要指DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP和CPU等软处理核(SoftCore)。现在越来越丰富的内嵌功能单元,使得单片FPGA成为了系统级的设计工具,使其具备了软硬件联合设计的能力,逐步向SOC平台过渡。
5) 内嵌专用硬核
内嵌专用硬核是相对底层嵌入的软核而言的,指FPGA处理能力强大的硬核(Hard Core),等效于ASIC电路。为了提高FPGA性能,芯片生产商在芯片内部集成了一些专用的硬核。
6) 嵌入式块RAM(BRAM)
大多数FPGA都具有内嵌的块RAM,这大大拓展了FPGA的应用范围和灵活性。块RAM可被配置为单端口RAM、双端口RAM、内容地址存储器 (CAM)以及FIFO等常用存储结构。RAM、FIFO是比较普及的概念,在此就不冗述。CAM存储器在其内部的每个存储单元中都有一个比较逻辑,写入 CAM中的数据会和内部的每一个数据进行比较,并返回与端口数据相同的所有数据的地址,因而在路由的地址交换器中有广泛的应用。除了块RAM,还可以将 FPGA中的LUT灵活地配置成RAM、ROM和FIFO等结构。在实际应用中,芯片内部块RAM的数量也是选择芯片的一个重要因素。
单片块RAM的容量为18k比特,即位宽为18比特、深度为1024,可以根据需要改变其位宽和深度,但要满足两个原则:首先,修改后的容量(位宽 深度)不能大于18k比特;其次,位宽最大不能超过36比特。当然,可以将多片块RAM级联起来形成更大的RAM,此时只受限于芯片内块RAM的数量,而 不再受上面两条原则约束。
7) 数字时钟管理模块(DCM)
业内大多数FPGA均提供数字时钟管理(Xilinx的全部FPGA均具有这种特性)。Xilinx推出最先进的FPGA提供数字时钟管理和相位环路锁定。相位环路锁定能够提供精确的时钟综合,且能够降低抖动,并实现过滤功能。
一般来说,完整的FPGA/CPLD设计流程包括:
(1) 电路功能设计,系统设计之前,首要的是方案论证、系统设计和FPGA芯片选择等准备工作。一般采用自顶向下的设计方法将系统分成若干基本单元,然后将基本单元划分成下一层的基本单元,一直这样就行下去,直到可以直接使用EDA元件库为止。
(2) 设计输入,常用的方法是硬件描述语言和原理图输入方式。
(3) 功能仿真,验证设计电路的逻辑功能。
(4) 综合优化(synthesis),综合优化是指将HDL语言、原理图等设计输入翻译成由与、或、非门、RAM、触发器等基本逻辑单元组成的逻辑网表,并根据目标与要求(约束条件)优化生成的逻辑网表,输出edf和edn等文件,供FPGA/CPLD厂家的布局布线器进行实现。
(5) 综合后仿真,检查综合结果是否与原设计一致,仿真时把综合生成
的标准延时文件反标注到综合仿真模型中,可估计门延时带来的影响。但这一步骤不能估计线延时,因此和布线后的仿真情况还有一定的差距,并不十分准确。
(6) 实现(Implementation),实现是将综合生成的逻辑网表配置到具体的FPGA芯片上,Xilinx的实现过程分为翻译(Translate)、映射(Map)、和布局布线(Place&Route)。布局布线是其中最重要的过程,布局是将逻辑网表中的硬件原语和底层单元合理得配置到芯片内部的硬件结构上,并且需要在速度最优和面积最优之间做出选择。布线时根据布局的拓扑结构,利用芯片内部的各种连线资源合理准确的连接各个元件。
(7) 时序仿真与验证,将布局布线后的延时信息反标注到网表中用来检测时序工作情况,时序仿真包括的延时信息最全,也最精确,能较好的反映芯片的实际工作情况。有是为了保证设计的可靠性,在时序仿真后还要做一些验证,可以用ISE内嵌的时序分析工具完成静态时序分析(STA,Static Timing Analyzer),也可以用第三方验证工具(如Synopsys的Formality验证工具,PrimeTime静态时序分析工具等)进行验证。可以用ISE内嵌的FPGA Editor和Chip Viewer观察芯片内部的连接于配置情况,或者使用ISE内嵌的ChipScope Pro进行在线逻辑分析。
(8) 调试与加载配置,就是在线调试或者将生成的配置文件写入芯片中进行测试。在ISE中对应的工具就是iMPACT。
FPGA设计流程图如图2-1所示。
图2-1 FPGA设计流程图
FPGA软件设计可分为两大块:编程语言和编程工具。编程语言主要有VHDL和Verilog两种硬件描述语言;编程工具主要是两大厂家Altera和Xilinx的集成综合EDA软件QuartusII以及第三方工具。具体的设计输入方式有以下几种:
(1) HDL语言方式。HDL既可以描述底层设计,也可以描述顶层的设计,
但它不容易做到较高的工作速度和芯片利用率。用这种方式描述的项目最后所能达到的性能与设计人员的水平、经验以及综合软件有很大的关系。
(2) 图形方式。可以分为电路原理图描述,状态机描述和波形描述3种
形式。电路原理图方式描述比较直观和高效,对综合软件的要求不高;状态机描述主要用来设计基于状态机思想的时序电路;波形描述方式是基于真值表的一种图形输入方式,直接描述输入与输出的波形关系。
FPGA的应用可分为三个层面:电路设计,产品设计,系统设计。
1) 电路设计中FPGA的应用
连接逻辑,控制逻辑是FPGA早期发挥作用比较大的领域也是FPGA应用的基石.事实上在电路设计中应用FPGA的难度还是比较大的这要求开发者要具备相应的硬件知识(电路知识)和软件应用能力(开发工具)这方面的人才总是紧缺的,往往都从事新技术,新产品的开发成功的产品将变成市场主流基础产品供产品设计者应用在不远的将来,通用和专用IP的设计将成为一个热门行业!搞电路设计的前提是必须要具备一定的硬件知识.在这个层面,干重于学,当然,快速入门是很重要的,越好的位子越不等人电路开发是黄金饭碗。
2) 产品设计
把相对成熟的技术应用到某些特定领域如通讯,视频,信息处理等等开发出满足行业需要并能被行业客户接受的产品这方面主要是FPGA技术和专业技术的结合问题,另外还有就是与专业客户的界面问题产品设计还包括专业工具类产品及民用产品,前者重点在性能,后者对价格敏感产品设计以实现产品功能为主要目的,FPGA技术是一个实现手段在这个领域,FPGA因为具备接口,控制,功能IP,内嵌CPU等特点有条件实现一个构造简单,固化程度高,功能全面的系统产品设计将是FPGA技术应用最广大的市场,具有极大的爆发性的需求空间产品设计对技术人员的要求比较高,路途也比较漫长不过现在整个行业正处在组建"首发团队"的状态,只要加入,前途光明产品设计是一种职业发展方向定位,不是简单的爱好就能做到的!产品设计领域会造就大量的企业和企业家,是一个近期的发展热点和机遇。
3) 系统级应用
系统级的应用是FPGA与传统的计算机技术结合,实现一种FPGA版的计算机系统如用Xilinx V-4, V-5系列的FPGA,实现内嵌POWER PC CPU, 然后再配合各种外围功能,实现一个基本环境,在这个平台上跑LINIX等系统这个系统也就支持各种标准外设和功能接口(如图象接口)了这对于快速构成 FPGA大型系统来讲是很有帮助的。这种"山寨"味很浓的系统早期优势不一定很明显,类似
ARM系统的境况但若能慢慢发挥出FPGA的优势,逐渐实现一些特色系统也是一种发展方向。若在系统级应用中,开发人员不具备系统的扩充开发能力,只是搞搞编程是没什么意义的,当然设备驱动程序的开发是另一种情况,搞系统级应用看似起点高,但不具备深层开发能力,很可能会变成爱好者,就如很多人会做网页但不能称做会编程类似以上是几点个人开发,希望能帮助想学FPGA 但很茫然无措的人理一理思路。这是一个不错的行业,有很好的个人成功机会。但也肯定是一个竞争很激烈的行业,关键看的就是速度和深度当然还有市场适应能力。
Verilog HDL是目前应用最为广泛的硬件描述语言,适合算法级,寄存器级,逻辑级,门级和版图级等各个层次的设计和描述,优点是其工艺无关性.这使得工程师在功能设计,逻辑验证阶段可以不必过多考虑门级及工艺实现的具体细节,只需根据系统设计的要求施加不同的约束条件。
Verilog HDL 是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可以在相同描述中显示的进行时序建模。
这种语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言、此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。
这种硬件语言不仅定义了语法。而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。
Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模拟器产品开发的硬件建模语言。那时它只是一种专用语言。由于他们的模拟、仿真器产品的广泛使用,Verilog HDL 作为一种便于使用且实用的语言逐渐为众多设计者所接受。在一次努力增加语言普及性的活动中,Verilog HDL语言于1990年被推向公众领域。 Open Verilog International (OVI)是促进Verilog发展的国际性组织。1992年,OVI决定致力于推广Verilog OVI标准成为IEEE标准。这一努力最后获得成功,Verilog HDL于1995年成为IEEE标准,称为IEEE Std 1364-1995。完整的标准在Verilog硬件描述语言参考手册中有详细描述。
- 基本逻辑门,例如and、or和nand等都内置在语言中。
- 用户定义原语(UDP)创建的灵活性。用户定义的原语既可以是组
合逻辑原语,也可以是时序逻辑原语。
- 开关级基本结构模型,例如pmos 和nmos等也被内置在语言中。
- 提供显式语言结构指定设计中的端口到端口的时延及路径时延和设
计的时序检查。
- 可采用三种不同方式或混合方式对设计建模。这些方式包括:行为
描述方式—使用过程化结构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模。
Verilog HDL和VHDL作为描述硬件电路设计的语言,其共同特点在于:能形式化地抽象表示电路的行为和结构;支持逻辑设计中层次与范围的描述;可借用高级语言的精巧结构来简化电路行为的描述;具有电路仿真与验证机制以保证设计的正确性;支持电路描述由高层到低层的综合转换;硬件描述与实现工艺无关(有关工艺参数可通过语言提供的属性包括进去);便于文档管理;易于理解和设计重用。但是,两者又有着各自的特点:
Verilog HDL和VHDL最大的差别在语法上,Verilog HDL是一种类C语言,而VHDL是一种ADA(Action Data Automation,行动数据自动化)语言。由于C语言简单易用且应用广泛,因此也使得Verilog HDL语言容易学习,如果有C语言学习的基础,很快就能够掌握;相比之下,VHDL语句较为晦涩,使用难度较大。
由于Verilog HDL早在1983年就已推出,至今已有20多年的应用历史,因而Verilog HDL拥有更加广泛的设计群体,成熟的资源也比VHDL丰富。
传统观念认为Verilog HDL在系统级抽象方面较弱,不太适合大型的系统;VHDL侧重于系统描述,从而更多地为系统级设计人员所采用;Verilog HDL侧重于电路级描述,从而更多地为电路设计人员所采用。但这两种语言仍处于不断完善之中,都在朝着更高级、更强大描述语言的方向前进。其中,经过IEEE Verilog HDL 2001标准补充之后,Verilog HDL 语言的系统级描述性能和可综合性能有了大幅度提高。
综上所述,Verilog HDL 语言作为学习HDL设计方法入门和基础是非常合适的。掌握了Verilog HDL 语言建模、综合和仿真技术,不仅可以增加对数字电路设计的深入了解,还可以为后续高级阶段的高级学习打好基础 ,包括数字信号处理和数字
通信的FPGA实现、IC设计等领域。本文的设计中,采用Verilog HDL语言。
本次设计的抢答器,其系统芯片主要采用EP2C8Q208,由抢答判别模块,计时模块,分频器模块,计分模块,锁存器模块,数码管驱动模块组成。抢答器结构简图如图2-3所示。
图2-3 抢答器结构简图
由图2-3我们很清楚的看到系统都有哪些外围电路组成,而且还能很快就能明白这次设计目的与原理。
分频器主要是运用计数器的功能,由于实际上我们使用的是50HZ的频率,所以我将设计计数器,其在每个脉冲的上升沿来临时,就会加1,直到加到25时,则会使输出脉冲致1,在下一个25时,则会使输出脉冲致0。这样就能够实现将50HZ的脉冲变成1HZ的脉冲,用于控制计时模块。
计时模块运用的是计数器的减法运算,当外部条件满足时,计时器就会从30S开始计时,一直计到零时,计数器停止,直到主持人按下复位按钮,计数器复位,才能使下次抢答时能够从头开始。
数码管驱动主要是将4位变8位,即当外部条件满足时,就会将输入的4位数据转变成7位,从而能够使其能够在数码管上显示出来。
锁存器在外部信号没要求进行锁存操作时,则会跟着输入的变化而变化,然而当外部要求进行锁存时,就是立即锁存住当前的数据,即输出保持当前的数据不再变化。
抢答判别模块是实现抢答器抢答功能的核心元件了,通过抢答判别模块来鉴别抢答的先后,其中设计的这个模块中自带锁存功能,即当其中一人或者一组抢答成功后,其余人或者组都不能再抢答了。该模块还能够进行判别谁进行了抢答,当主持人还没有说开始抢答时,就有人开始抢答时,该人或者该组面前的LED灯就会被点亮,对应的报警器也会响起,同时数码管这时也会显示出提前抢答的组号,从而杜绝了一些不公平的元素。
其流程图如图3-1。
图3-1 抢答判别流程图
我们通过对FPGA以及硬件语言Verilo HDL的学习,只通过对系统的编程就满足了该模块的要求,能实现判别,锁存,显示,报警等功能。
抢答判别模块的输入有en,clr,a,b,c,d,而输出端为led_a,led_b.led_c,led_d以及4位led_f,4位led_t。其中en表示使能端,只有主持人按下这个按钮,才能允许参赛选手进行抢答;clr表示复位信号,当主持人按下这个按钮后,所有的状态都将恢复成初始状态,为下次抢答做好准备;a,b,c,d表示四组抢答选手;led_a,led_b.led_c,led_d分别表示对应
小组的LED灯,用来显示选手们的抢答情况;led_f表示报警信号,当有选手提前抢答时,该对应的报警器将会响起;led_t表示显示选手号码的信号,当有选手抢答时,就会通过led_t输出的信号使其组号在数码管上显示出来。
该模块的逻辑框图如图3-2所示。
图3-2 抢答判别模块逻辑框图
数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、3位、4位、5位、6位、7位等数码管。
按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
- 静态显示驱动。静态驱动也称直流驱动。静态驱动是指每个数码管
的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
- 动态显示驱动。动态驱动是将所有数码管8个显示笔"a,b,c,d,e,f,g,dp"
的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
数码管驱动模块就是将输入的2进制代码以7段译码方式输出,其对应的表格如表3-1。
表3-1 2进制与7段译码对应表
数码管驱动模块的输入是4位2进制数,输出则是7位译码数据。现其逻辑框图如3-3所示。
图3-3 数码管驱动模块逻辑框图
该模块主要是规定抢答时间,当主持人按下抢答按钮后,该模块就会从30s开始倒计时,直到有人抢答成功后,通过锁存模块的作用使得在数码管上显示的时间不变。
计时模块电路中,clk为计时脉冲信号;sign为计时使能端,由主持人控制,当主持人按下这个按钮后,计时功能才能实现;reset为复位信号,也由主持人控制,按下复位按钮,计时模块重新计时,这为下一次的抢答计时做准备。
其中计时模块需要的计时脉冲信号应该是1HZ的,而实际上我们所使用的频率大部分都是50HZ的,这就需要分频器的作用,分频模块将在下面给与介绍。
计时模块运用的是计数器的减法运算,当外部条件满足时,计时器就会从30s开始计时,一直计到零时,计数器停止,直到主持人按下复位按钮,计数器复位,才能使下次抢答时能够从头开始。计时模块在抢答器中的作用就是计时作用,超时抢答则为无效。
现其逻辑框图如3-4所示。
图3-4 计时模块逻辑框图
分频器主要是运用计数器的功能,由于实际上我们使用的是50HZ的频率,所以我将设计计数器,其在每个脉冲的上升沿来临时,就会加1,直到加到24时,则会使输出脉冲致1,在下一个24时,则会使输出脉冲致0。这样就能够实现将50HZ的脉冲变成1HZ的脉冲,用于控制计时模块。
其中clk为频率输入,大部分表示50HZ;div表示通过分频的作用后所产生的新的频率。
现其逻辑框图如3-5所示。
图3-5 分频器模块逻辑框图
计分模块中加法、减法系统,计分系统等系统组成。add_sub是计分的使能端,只有这个信号为高电平时,才允许进行计分;cont_sign1为加分按钮,cont_sign2为减分按钮,clk为脉冲信号。运行模块是首先设定周期脉冲,定时的加减1,有抢答判别模块的输出给chos决定了哪组的计分,其中a1[3..0],a2[3..0]分别表示a组分数的个位与十位,b1[3..0],b2[3..0]分别表示b组分数的个位与十位,c1[3..0],c2[3..0]分别表示c组分数的个位与十位,d1[3..0],d2[3..0]分别表示d组分数的个位与十位。
现其逻辑框图如3-6所示。
图3-6 计分模块逻辑框图
锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制其与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个I/O口既能输出也能输入的问题。
此次设计的锁存模块既有锁存作用,又有伴随作用,只有当锁存信号来临时才进行锁存,在没有锁存信号下的时候,则输出跟着输入变化。
锁存模块中,g表示锁存信号,a[3..0]表示输入信号,b[3..0]表示输出信号。现其逻辑框图如3-7所示。
图3-7 锁存器模块逻辑框图
通过对各个模块的搭建,我们可以完成对整体抢答器的硬件设计,如图3-8所示为系统整体原理图。
图3-8 系统整体原理图
Module
qiang_da_pan_bie(clr,en,a,b,c,d,led_a,led_b,led_c,led_d,led_t,led_f);
input clr,en,a,b,c,d;
output led_a,led_b,led_c,led_d;
output [3:0] led_t;
output [3:0] led_f;
reg [3:0] states;
reg led_a,led_b,led_c,led_d;
reg [3:0] led_t;
reg [3:0] led_f;
以上程序描述了抢答判别模块的实体部分,其中qiang_da_pan_bie是模块的文件名;input定义的是模块的输入端口,即clr,en,a,b,c,d为模块的输入端;output定义的是模块的输出端口,即led_a,led_b,led_c,led_d,led_t,led_f为输出端口;states被定义成reg型,用于暂时存放输入端a,b,c,d的状态;led_t被定义成reg型,表示抢答组号的号码。
if(en==0)
begin
if (states==4'b0001)
begin
{led_d,led_c,led_b,led_a}<=states;
led_f<=states;
led_t<=4'b0001;
end
end
这段程序表示在主持人还没有说开始抢答时,判别是否有人提前抢答,若有人提前抢答了,则就会判断哪个人或者哪一组提前抢答了,这时抢答者前面的led灯将会被点亮,对应的报警器也会响起,同时将提前抢答者的组号通过数码管显示出来。
抢答判别模块的波形仿真如图4-1与4-2。
图4-1 en=0时抢答判别模块的波形仿真图
在图4-1中,我们看出在抢答允许使能端en=0的情况下,b组率先抢答,这是违规的,因此,led_b为1,即与a组对应的LED灯亮起;led_f为0010,即表示b的报警器将会响起;led_t为0010,即数码管显示的是第二组(b组)抢答的。
图4-2 en=1时抢答判别模块的波形仿真图
在图4-2中,我们看出在抢答允许使能端en=1的情况下,a组率先抢答,这是合理的,因此,led_a为1,即与a组对应的LED灯亮起;led_f为0000,即表示所有的报警器都不会响起;led_t为0001,即数码管显示的是第一组(a组)抢答的。
module decode47(a , D);
output [7:0] a;
input [3:0] D;
reg [7:0] a;
以上程序描述的是数码管驱动模块的实体部分,其中decode47是模块的文件名;input定义的是模块的输入端口,即D为模块的输入端;output定义的是模块的输出端口,即a为输出端口,reg是a端口的类型。
case(D)
4'd0: a<=7'b1111110;
4'd1: a<=7'b0110000;
4'd2: a<=7'b1101101;
4'd3: a<=7'b1111001;
4'd4: a<=7'b0110011;
4'd5: a<=7'b1011011;
4'd6: a<=7'b1011111;
4'd7: a<=7'b1110000;
4'd8: a<=7'b1111111;
4'd9: a<=7'b1111011;
endcase
以上程序运用case语句进行译码,当输入端口D满足条件时,就会输出与之相对应的情况,如当D=4’b0011时,输出a<=7’b1111001,然后接到数码管上,就会显示3,从而完成驱动数码管的作用。
数码管驱动模块的波形仿真如图4-3。
图4-3 数码管驱动模块的波形仿真图
如图4-3所示,由于运行程序时有一定的延时,故输出总是落后与输入的。如当D=6时,这是a=1011111,与实际结果一样。
module ji_shi_mo_kuai(clk,sign,reset,a2,a1,g);
input clk,sign,reset,g;
output a2,a1;
reg [3:0] a2;
reg [3:0] a1;
reg a;
以上程序描述的是计时模块的实体部分,其中ji_shi_mo_kuai是模块的文件名;input定义的是模块的输入端口,即clk,sign,reset,g为模块的输入端;output定义的是模块的输出端口,即a2,a1为输出端口,a,a2,a1端口的类型是reg。clk为时钟信号;sign是使能信号,只有在使能信号成立的条件下,程序才能够运行;reset为复位信号,当复位按键被按下时,系统将会从头计时,为下一轮的抢答做好准备。
if (reset==1)
begin
a2<=4'b0011;
a1<=4'b0000;
end
以上程序为复位程序,当这段程序起作用时,a1将会被赋值为4'b0000,a2将会被赋值为4'b0011,即系统将会重新从30S开始倒计时。
if (a2!=4'b0000 && a1==4'b0000)
begin
a2<=a2-1;a1<=4'b1001;
end
if (a2!=4'b0000 && a1!=4'b0000)
begin
a2<=a2;a1<=a1-1;
end
if (a2==4'b0000 && a1!=4'b0000)
begin
a2<=a2;a1<=a1-1;
end
if (a2==4'b0000 && a1==4'b0000)
begin
a2<=4'b0000;a1<=4'b0000;
end
以上程序为计时程序,首先分情况进行判断:当a2不为0,而a1为0时,a2将自减1,a1变成9;当a2不为0,a1不为0时,a2不变,a1自减1;当a2为0,a1不为0时,a2不变,a1自减1;当a2为0,a1为0时,这是将a2,a1都赋值为0。
计时模块的波形仿真如图4-4与图4-5。
图4-4 计时模块的波形仿真图
图4-4所示,先按下复位按键reset,这时a2=3,a1=0,然后在按下计数使能端sign后,计时模块开始工作,计时时间从30S一直倒计时至0S后,不在计时了,只有等到复位后,才能重新计时。
图4-5计时模块的波形仿真图
图4-5中,在一轮计时结束后,开始下一轮的抢答,这是主持人需要再次按下reset键,这时计时模块重新计时,即又开始从30S开始倒计时,依次循环,这样就为比赛的顺利进行做好了准备。
Module fen_pin_qi(clk,div,cnt);
input clk;
output div,cnt;
reg [4:0] cnt;
reg div;
以上程序描述的是分频模块的实体部分,其中fen_pin_qi是模块的文件名;input定义的是模块的输入端口,即clk为模块的输入端;output定义的是模块的输出端口,即div,cnt为输出端口,div,cnt端口的类型是reg。clk为时钟信号,通常输入的是50HZ。
if (cnt==5'b11000)
begin
div<=~div;
cnt<=5'b0000;
end
else
begin
cnt<=cnt+1;
end
以上程序为计数程序,首先进行判断,若cnt没有达到24时,则进行自加1的操作,直到cnt达到24时,div将会取反,这样的程序将会一直进行下去。这里之所以判断cnt是否达到24,是因为实际中我们使用的频率是50HZ,所以根据实际的情况,在这里设定24的界限。
分频模块的波形仿真如图4-6。
图4-6 分频模块的波形仿真图
图4-6所示,随着clk的变化,cnt从0开始往上加1,直到加到24时,div发生偏转,即由0变为1,随后cnt又开始从0开始加1直至24,div又发生偏转,即由1变为0。如此循环下去,就起到了分频的作用。
Module ji_fen_mo_kuai(add_sub,cont_sign1,cont_sign2,chos,a2,a1,b2,b1,c2,c1,d2,d1,clk);
input add_sub, cont_sign1,cont_sign2,chos,clk;
output a2,a1,b2,b1,c2,c1,d2,d1;
wire [3:0] chos;
reg [3:0] a2;
reg [3:0] a1;
reg [3:0] b2;
reg [3:0] b1;
reg [3:0] c2;
reg [3:0] c1;
reg [3:0] d2;
reg [3:0] d1;
以上程序描述的是计分模块的实体部分,其中ji_fen_mo_kuai是模块的文件名;input定义的是模块的输入端口,即add_sub,cont_sign1,cont_sign2,chos,clk为模块的输入端;output定义的是模块的输出端口,即a2,a1,b2,b1,c2,c1,d2,d1为输出端口。clk为时钟信号;add_sub表示计分使能端;cont_sign1表示加法使能端,按下这个按键后,计数器开始进行加法运算;cont_sign2表示加法使能端,按下这个按键后,计数器开始进行减法运算,即减分操作;a2,a1,b2,b1,c2,c1,d2,d1则表示每组分数的十位,个位。
if (cont_sign1==1)
begin
if (chos==4'b1000)
begin
if (a2==4'b1001 && a1==4'b1001)
begin
a1<=4'b0000;
a2<=4'b0000;
end
else if (a2!=4'b1001 && a1==4'b1001)
begin
a1<=4'b0000;
a2<=a2+1;
end
else if (a2!=4'b1001 && a1!=4'b1001)
begin
a1<=a1+1;
a2<=a2;
end
end
end
以上程序只是加法程序中的一部分,首先,加法使能端口cont_sign1有效后,就要判断哪一组进行加分运算,然后就要根据情况进行讨论:当a2,a1都为9时,a2,a1都要变成0;当a2不为9,a1为9时,a2将自加1,a1变成0;当a2,a1都不为9时,a2不变,a1自加1。
if(cont_sign2==1)
begin
if (chos==4'b1000)
begin
if (a2==4'b0000 && a1==4'b0000)
begin
a1<=4'b1001;
a2<=4'b1001;
end
else if (a2!=4'b0000 && a1==4'b0000)
begin
a1<=4'b1001;
a2<=a2-1;
end
else if (a2!=4'b0000 && a1!=4'b0000)
begin
a1<=a1-1;
a2<=a2;
end
else if (a2==4'b0000 && a1!=4'b0000)
begin
a1<=a1-1;
a2<=a2;
end
end
end
以上程序只是减法程序中的一部分,首先,加法使能端口cont_sign2有效后,就要判断哪一组进行加分运算,然后就要根据情况进行讨论:当a2,a1都为0时,a2,a1都要变成9;当a2不为0,a1为0时,a2将自加1,a1变成9;当a2,a1都不为0时,a2不变,a1自减1;当a2为0,a1不为0时,a2不变,a1自减1。计分模块的波形仿真如图4-7与图4-8。
图4-7计分模块的波形仿真图
图4-7所示,add_sub为1,即允许计分运算。首先第四组(d组)抢答成功并回答正确,则应给与加分,即d1由0变为1,在由图知,在给d组加分的时候,由于干扰,此时a组也发来加分信号,但是并不给予a组加分,这样避免了干扰。第二轮抢答中,d组又回答正确,在给予加分,此时d1由1变为2。然而在第三轮中d组回答错误,应给予d组减分,此时d1由2变成1。
图4-8计分模块的波形仿真图
图4-8所示,add_sub为1,即允许计分运算。首先第四组(d组)抢答成功并回答正确,则应给与加分,即d1由0变为1;第二轮抢答中,b组回答正确,给予加分,此时b1由1变为2。然而在第三轮中d组回答错误,应给予d组减分,此时d1由1变成0。
module suo_cun_qi(g,a,b);
input g;
input [3:0] a;
output [3:0] b;
reg [3:0] b;
以上程序描述的是锁存模块的实体部分,其中suo_cun_qi是模块的文件名;input定义的是模块的输入端口,即g,a为模块的输入端;output定义的是模块的输出端口,即b为输出端口。其中g表示抢答成功信号。
if (g==1)
begin
b<=b;
end
else
begin
b<=a;
end
以上程序为锁存程序,如程序中所示,只有在g这个信号有效的情况下,锁存模块才开始起作用,否则其输出b将随着输入a的变化而变化。
锁存模块的波形仿真如图4-9。
图4-9 锁存模块的波形仿真图
在图4-9中,我们看见在g信号无效的时候,输出b跟随着输入a的变化而变化,当g信号有效的时候,输出b就会不再变化了,实现了应有的功能。在图中我们看见,输出b出现了一点误差,这是因为仿真所给的频率过小,且仿真程序有一定的延迟,这样就造成了输入信号之间有一定的重叠,因此会出现这样的差错,当增大仿真频率到一定程度后,就不会出现这样的情况。
结 论
将程序进行编译仿真后进行分析仿真图可证明本设计所用的基于FPGA的在Quarters II软件平台上实现的抢答器是完全可行的。
这次毕业设计介绍了一种采用EDA技术,基于FPGA并在QuartusⅡ工具软件环境下使用Verilog硬件描述语言编写的数码管显示4路抢答器的电路设计、设计思路以及实现功能,经过仿真验证符合抢答器的基本功能要求。
为了实现抢答器的基本功能,本次系统芯片主要采用EP2C8Q208,并设计了抢答判别模块,计时模块,分频器模块,计分模块,锁存器模块,数码管驱动模块等等。经过仿真都可以验证各个模块的功能都能满足抢答器的基本要求。
这次设计的系统主要有以下几个功能:
(1) 可以使四组选手同时进行抢答,并锁存抢答成功的那一组。
(2) 可以计算四组选手的得分情况。
(3) 可以计算提前抢答的选手,显示其组号,并给予报警提醒。
(4) 可以通过LED显示出抢答成功的组别。
(5) 可以显示答题时间,抢答剩余时间。
没有解决的问题是按键防抖动模块的设计,接下来的研究和学习就是要解决这个问题。
此次毕业设计通过查资料和收集有关的文献,培养了自学能力和动手能力。并且由原先的别动的接受知识转化为主动的寻求知识,这可以说是学习方法上的一个很大的突破。在以往的传统的学习模式下,我们可能会记住很多的书本知识,但是通过毕业论文,我们学会了如何将学到的知识转化为自己的东西,学会了怎么更好地处理知识和实践相结合的问题。
任何涉及的控制系统都要经过试验和实践的考验方能得到完善,我们做毕业设计也是一样,这毕业设计是对我们所学主页知识的考验,更是对我们应用专业知识解决实际生产问题能力的考验。通过毕业设计,我更加坚信只有拥有一定的毅力,认真的学习态度,丰富的日常积累,正确处理问题的能力,才能在以后的工作及生活中经的住考验。