




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于FPGA的计算器设计摘 要本文介绍了一个简单计算器的设计,该设计采用了现场可编程逻辑器件FPGA设计,并基于硬件描述语言VHDL在Altera公司的Quartus 软件上实现仿真。系统由计算部分、存储部分、显示部分和输入部分四个部分组成,计算部分为加法器、减法器、乘法器和除法器,存储部分需要3个存储器来实现:内部累加器(acc)、输入寄存器(reg)以及结果暂存器(ans)。显示部分由四个七段译码管组成,分别来显示输入数字,输入部分采用外接键盘,由09十个数字按键,加减乘除四个运算符按键,一个等号按键和一个清零按键组成的。通过外部的按键可以完成四位数之内的 加、减、乘、除四种功能运算,其结
2、构简单,易于实现。 关键词:FPGA;VHDL;计算器1 概述在国外,电子计算器在集成电路发明后,只用短短几年时间就完成了技术飞跃,经过激烈的市场竞争,现在的计算器技术己经相当成熟。计算器已慢慢地脱离原来的“辅助计算工具”的功能定位,正向着多功能化、可编程化方向发展,在各个领域都得到了广泛的应用。用计算器不仅可以实现各种各样复杂的数学计算还可以用来编制、运行程序,甚至解方程组,图形计算器还可以进行图形处理。计算器内置的软件允许用户进行类似于对计算机的文件和目录管理等操作,允许用户对图形界面进行定制,同时各种新技术也被应用到计算器里使计算器功能越来越强大。可以说,计算器就是一个“微微型”的计算机
3、。国内也有厂商利用计算器芯片开发新的产品,但对计算器技术的研究、计算器芯片的设计还处于起步阶段。计算器的主要功能还是在于“计算”,不妨称之为“低档计算器”。即便是对这种计算器,很多厂商也只从事计算器的组装、销售业务。一些IC设计公司、芯片提供商也开始研究计算器技术。本次设计基于现场可编程逻辑器件FPGA进行设计,应用硬件描述语言VHDL编程并在Altera公司的Quartus 软件上实现仿真。需要进行计算器的常用运算功能的实现,通过外接键盘输入、LED数码显示来达成运算目的。2 硬件描述语言VHDL简介2.1 VHDL的发展VHDL诞生于1982年。在1987年底,VHDL被IEEE和美国国防
4、部确认为标准硬件描述语言 。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。而Verilog HDL是由GDA(Gateway Design Automation)公司的PhilMoorby在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。1985年Moorby推出它的第三个商用仿真器Verilog XL,获得了巨大的成功,从而使得Verilog HD
5、L迅速得到推广应用。1989年CADENCE公司收购了GDA公司,使得Verilog HDL成为了该公司的独家专利。1990年CADENCE公司公开发表了Verilog HDL,并成立LVI组织以促进Verilog HDL成为IEEE标准,即IEEE Standard 1364-1995。 2.2 VHDL的特点VHDL语言主要用于描述数字系统的结构、行为、功能和接口,与其他硬件描述语言相比,VHDL语言有如下优越之处2:1) VHDL语言支持自上而下(Top Down)和基于库(Library Base )的设计方法,还支持同步电路、异步电路、FPGA以及其他随机电路的设计;2) VHDL语
6、言具有多层次描述系统硬件功能的能力,可以从系统的数学模型直到门级电路,其高层次的行为描述可以与低层次的RTL描述和结构描述混合使用,还可以自定义数据 类型,给编程人员带来较大的自由和方便;3) VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必关心最终设计实现的目标器件是什么;4) VHDL具有电路仿真与验证功能,可以保证设计的正确性,用户甚至不必编写如何测试相量便可以进行源代码级的调试,而且设计者可以非常方便地比较各种方案之间的可行性及其优劣,不需做任何实际的电路实验;5) VHDL语言可以与工艺无关编程;6) VHDL语言标准、规范,易于共享和复用。2.3 VHDL语言结
7、构 图2.1 VHDL程序结构框图3图2.1中是VHDL的全部结构,但实际上并不需要全部的结构,就像在许多设计项目中,大部分工程师只用到VHDL其中的30%的语法;通常图2.2的结构才是基本和必需的。图2.2 VHDL程序基本结构2.3.1 实体(ENTITY)实体作为一个设计实体的组成部分,其功能是对这个设计实体与外部电路进行接口描述,它是设计实体的表层设计单元;实体说明部分规定了设计单元的输入输出接口信号或引脚,它是设计实体对外一个通信界面。就一个设计实体面言,外界所看到的仅仅是它的界面上的各种接口。它可以拥有一个或多个结构体,用于描述此设计实体的逻辑结构和逻辑功能,对于外界来主,这一部分
8、是不可见的。不同逻辑功能的实体可以拥有相同的实体描述,这是因为实体类似于原理图中的一个部件符号,而其的逻辑功能是由设计实体中结构体的描述确定的。实体是VHDL的基本设计单元,它可以对一个门电路、一个芯片、一块电路板乃至整个系统进行接口描述。其结构:ENTITY 实体名 IS4 GENERIC(常数名:数据类型:设定值 ;常数名:数据类型:设定值 ); PORT(端口名:端口模式 数据类型;端口名:端口模式 数据类型);END ENTITY 实体名;2.3.2 结构体(ARCHITECTURE)结构体是实体所定义的设计实体中的一个组成部分。结构体描述设计实体的内部结构和实体端口间的逻辑关系。结构
9、体由两大部分组成5:对数据类型、常数、信号、子程序和元件等元素的说明部分;描述实体逻辑行为的,以各种不同的描述风格表达的功能描述语句,它们包括各种形式的顺序描述语句和并行描述语句。其语句格式如下:ARCHITECTURE 结构体名; 说明语句BEGIN 功能描述语句END ARCHITECTURE 结构体名;图2.3中的五种语句结构的基本组成和功能分别是:块语句是由一个系列并行执行语句构成的组成体,它的功能是将结构中的并行语句组成一个或多个模块。进程语句定义顺序语句模块,用以将从外部获得的信号值,或内部的运算数据向其它的信号进行赋值。信号赋值语句将设计实体内的处理结果向定义的信号或界面端口进行
10、赋值。子程序调用语句用以调用过程或者函数,并将此元件的端口与其它的元件、信号或高层次实体的界面端口进行连接。图2.3 结构体构造图2.4 VHDL软件设计简介系统电路的软件设计可采用工具软件Quartus ,用该工具软件所支持的语言硬件描述语言VHDL,以文本的方式进行编程输入。在编程时分别对控制、计数、锁存、译码等电路模块进行VHDL文本描述,使每个电路模块以及器件都以文本的形式出现,然后通过编译、波形分析、仿真、调试来完善每个器件的功能。单个器件制作完成后,然后将它们生成库文件,并产生相应的符号,最后用语言将各个已生成库文件的器件的各个端口连接在一起,从而形成了系统主电路的软件结构。在连接
11、器件时,也可以采用图形输入方式,即在图形输入界面中调出先制作好的库文件器件符号,再将每个器件符号的各端口直接连线,从而构成系统主电路。在上述工作的基础上,再进行波形分析、仿真调试便完成整个软件设计6。3 现场可编程门阵列(FPGA)简介3.1 可编程逻辑器件可编程逻辑器件(PLD-Programmable Logic Devices)是一种由用户编程以实现某种逻辑功能的新型逻辑器件。它诞生于20 世纪70 年代,在20 世纪80 年代以后,随着集成电路技术和计算机技术的发展而迅速发展起来的。可编程逻辑器件自问世以来,PLD 经历了从PROM、PLA、PAL、GAL 到FPGA、ispLSI 等
12、高密度PLD 的发展过程。在此期间,PLD 的集成度、速度不断提高,功能不断增强,结构趋于更合理,使用变得更灵活方便。PLD 的出现打破了由中小型通用型集成电路和大规模专用集成电路垄断的局面。与中小规模通用型集成电路相比,用PLD 实现数字系统,有研制周期短、先期投资少、无风险、修改逻辑设计方便、小批量生产成本低等优势。随着可编程逻辑器件性能价格比的不断提高,EDA 开发软件的不断完善,现代电子系统的设计将越来越多地使用可编程逻辑器件,特别是大规模可编程逻辑器件。如果说一个电子系统可以像积木堆积起来的话,那么现在构成许多电子系统仅仅需要3 种标准的积木块微处理器、存储器和可编程逻辑器件,甚至只
13、需一块大规模可编程逻辑器件。PAL ( Programmable Array Logic)器件是20 世纪70 年代末期出现的一种低密度、一次性可编程逻辑器件。GAL(Generic Array Logic)器件是继PAL 器件之后,在20 世纪80 年代中期推出的一种低密度可编程逻辑器件。它在结构上采用了输出逻辑宏单元(OLMC-Output Logic Macro Cell )结构形式,在工艺上吸收EEPROM 的浮栅技术,从而使GAL 器件具有可擦除、可重新编程、数据可长期保存的结构特点。CPLD(Complex Programmable Logic Device)是万门以上的复杂可编程
14、逻辑器件,采用CMOS EPROM、EEPROM、快闪存储器和SRAM 等编程技术,从而构成高密度、高速度和低功耗的可编程逻辑器件7。3.2 现场可编程门阵列(FPGA)FPGA 是现场可编程门阵列(Field Programmable Gate Array)的简称。FPGA器件及其开发系统是开发大规模数字集成电路的新技术。它利用计算机辅助设计,绘制出实现用户逻辑的原理图、编辑布尔方程或用硬件描述语言等方式作为设计输入;然后经一系列转换程序、自动布局布线、模拟仿真的过程;最后生成配置FPGA 器件的数据文件,对FPGA 器件初始化。这样就实现了满足用户要求的专用集成电路,真正达到了用户自行设计
15、、自行研制和自行生产集成电路的目的。FPGA是一种半定制的集成电路,其特点是直接面向用户,具有极大的灵活性和通用性,开发效率高,硬件测试和实现快捷,工作可靠性好而且技术维护简单。FPGA 相对于CPLD 而言,其结构特点在于FPGA 是基于查找表look-up-table的。查找表(look-up-table)简称为LUT,LUT 本质上是一个RAM。FPGA 中多使用4 输入的LUT,所以每一个LUT 可以看成一个有4 位地址线的16x1 的RAM。当用户通过原理图或HDL语言描述了一个逻辑电路后,PLD/FPGA 开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM,这样,每
16、输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。3.2.1 FPGA的器件结构与工作原理FPGA(Field Programmable Gate Array)即现场可编程逻辑阵列,是大规模可编程集成电路的主流器件。FPGA一般由三种可编程电路和一个用于存放编程数据的SRAM(静态随机存储器)组成,这三种可编程电路是:可编程逻辑阵列LAB(Logic Array Block),输入输出模块IOB (I/O Block)和互连资源IR(Interconnect Resource)。FPGA可编程逻辑形成的方法是基于查找表LUT (Look Up Table)结
17、构的,LUT是可编程的最小逻辑构成单元4。1.可编程逻辑阵列LAB可编程逻辑阵列是由一系列相邻的逻辑单元LE (Logic Element)构成的,每个LAB包括八个逻辑单元LE、相连的进位链和级联链,LAB控制信号和LAB局部互连。LAB的构成、ACEK系列芯片的“粗粒度(coarse-grained )"结构,有利于EDA软件进行布局布线,优化器件的利用进而提高整个数字系统的性。其中的逻辑单元LE是一种基于查找表的函数发生器。它能够实现4输入1输出的任意逻辑函数。每个LE包含一个4输入的查找表、一个带有同步使能的可编程触发器、一个进位链和一个级联链。每个LE有两个输出分别可以驱动
18、局部互连和快速通道互连。LE有两个输出驱动内部互连,一个是驱动局部互连输出,另一个驱动行或列的快速通道Fast Track的互连输出,这两个输出可以单独控制。因此在一个逻辑单元LE中的触发器和查找表能够用来完成不相关的功能,从而提高LE的资源利用率。在ACEK系列芯片的结构中还提供了两种专用的高速数据通道,用于连接相邻的LE,但不占用局部互连通路,它们是进位链和级联链。进位链用来支持高速计数器和加法器,它提供了LE之间的决速向前进位功能。来自低位的进位信号经进位链向前直接送到高位,同时馈入查找表和进位链的下一段。这种特点使得ACEK结构能够实现高速计数器、加法器和宽位比较器。级联链可以用来实现
19、多输入数的逻辑函数。相邻的查找表并行地完成部分逻辑功能,级联链把中间结果拼接起来。进位链和级联链的使用有利于提高器件的工作速度,但是大量使用进位链和级联链会限制布局布线的灵活性,导致资源的浪费。因此在设计过程应该权衡考虑,在FPGA芯片资源利用和工作速度之间寻求平衡。2.输入/输出模块IOBACEK器件的I/O引脚是由一些I/O单元驱动的。IOE (I/O Element)位于快速通道的行和列末端,包含一个双向的缓冲器和一个寄存器。这个寄存器可以用作需要快速建立时间的外部数据输入寄存器,也可以作为需要快速“时钟到输出”性能的数据输出寄存器。IOE可以配置成输入、输出或双向口。ACEK器件中的I
20、OE具有许多特性,支持JTAG编程、三态缓冲和漏极开路输出等等。每个IOE的时钟、清零、时钟使能和输出使能的控制均由I/O控制信号网络提供,采用高速驱动以减小通过器件的时间偏差。此外,ACEK器件还提供了若干专用输入引脚,这些引脚用来驱动IOE寄存器的控制端,使用了专用的布线通道,以便具有比快速通道更短的延迟和更小的偏差。3.互连资源IR可编程的互连资源包括各种长度的金属连线线段和一些可编程的连线开关,它们将各个逻辑阵列之间、及其与IO模块之间互相连接起来,构成各种功能复杂的系统。在ACEK中互连结构是通过快速通道(Fast Track)实现的。Fast Track遍布于整个ACEK器件,是一
21、系列水平和垂直走向的连续式布线通道。每一行的LAB都有一个专用的“行互连”,“行互连”可以驱动。I/O引脚或馈送到器件中的其LAB;“列互连”连接各行,也能驱动I/O引脚。这种布线结构能够有效提高布线效率,使得即使非常复杂的设计也能够测定其延时性。4.嵌人式阵列块EAB嵌人式阵列块EAB是在输入输出口上带有寄存器的灵活的RAM块,是由一系列嵌人式RAM单元组成的。EAB的逻辑功能是在配置期间,用只读模式对EAB编程产生一个大型查找表来实现的。采用查找表实现组合逻辑比一般算法快,EAB的快速时间通道使得这一先进性能进一步得到加强。当要实现存储器功能时,每个EAB提供2048比特位,每一个EAB是
22、一个独立的结构,它具有共同的输入、互连和控制信号。每个EAB含有一个行互连馈入端,EAB的输出能够同时驱动行互连通道和列互连通道。这一特性增加了EAB的可利用布线资源。因此,EAB可以非常方便地用于实现一些规模不大的RAM, ROM, FIFO等功能模块;同时在实现地址译码器、状态机、微控制器等复杂逻辑时也具备了一定优势5。3.2.2 基于EDA平台的FPGA开发流程一个完整、典型的EDA设计流程67即是自顶向下设计方法的具体实施过程,也是EDA软件本身的组成结构。在实践中进一步了解支持这一个设计流程的诸多设计工具,有利于排解设计中的具体问题,提高设计质量。1.设计输入基于EDA软件平台的FP
23、GA开发流程,一般有两种设计输入方式:图形输入和硬件描述语言文本输入。下面将重点介绍采用VHDL硬件描述语言进行设计输入方法,这是笔者在设计开发过程中采用的主要方法。VHDL作为电子工程主流硬件描述语言,是EDA技术的重要组成部分。它于1983年由美国国防部创建,由IEEE协会进一步发展并在1987年成为IEEE国际标准。自IEEE协会公布了VHDL标准版本(IEEE Std 1076)之后,各大EDA公司相继推出支持VHDL语言的开发环境。从此VHDL作为硬件描述语言的业界标准之一,在电子设计领域得到广泛应用,并逐步成为事实上的通用硬件描述语言。VHDL语言具有很强的电路建模能力,具有良好的
24、电路行为描述和系统描述的能力,能从多个层次对数字系统进行建模和描述;VHDL语言还具有与硬件电路无关和设计平台无关的特性,并且在语言易读性和层次化结构化设计方面表现了强大的生命力和应用潜力。这些特性使得VHDL语言在支持自顶向下的EDA设计流程方面显得游刃有余。因此,采用VHDL进行电子系统设计可以让设计者专心致力于其功能的实现,而不需要对不影响功能的与工艺相关的问题花费过多的时间和精力,从而大大简化了设计任务,提高了设计效率和可靠性。采用VHDL文本设计输入与传统的计算机软件语言编辑输入基本上一样,就是使用VHDL描述数字系统的功能,进行文本编辑输入。事实上,纯粹的VHDL设计输入方法仍然是
25、最基本、最有效和最普遍的设计输入方法。2.设计综合在电子设计领域“综合”的概念可以表示为:将行为和功能层次表达的电子系统转化为低层次的便于具体实现的模块组合装配而成的过程。事实上,设计过程通常从高层次的行为描述开始,直到最底层的结构描述结束,每一个步骤都是上一个层次的综合转换。在FPGA设计开发过程中,整个综合过程就是设计者在EDA软件平台上编辑输入VHDL文本,依据给定电路结构组件和约束控制条件进行编译、优化、转换和综合,最终获得门级电路甚至更底层的电路描述网表文件。因此设计综合的过程就是将软件设计的VHDL描述文本与硬件结构挂钩,是软件描述转化为硬件电路的关键步骤,是文本描述与硬件实现之间
26、的一座桥梁。3.结构适配适配器也称为结构综合器,它的功能是将综合器产生的网表文件配置于指定的FPGA目标器件中,使之产生最终的下载文件。适配过程中所选定的FPGA目标器件必须属于综合器原来指定的目标器件系列,这是因为适配器的适配对象是直接与器件的结构细节相对应的。逻辑综合通过后必须利用适配器将综合后的网表文件针对某一具体目标器件进行逻辑映射操作,其中包括底层器件配置、逻辑分割、逻辑优化、逻辑布局布线操作。适配完成后可以利用适配所产生的仿真文件作精确的时序仿真,同时产生可用于编程下载文件。4.功能仿真和时序仿真在编程下载前必须利用EDA工具对配置生成的结果进行模拟分析,这就是所谓的仿真。仿真的过
27、程就是让计算机根据一定的算法和一定的仿真库对EDA设计进行模拟,以验证设计,排除错误。仿真包括功能仿真和时序仿真。功能仿真:不经过综合和适配阶段,在设计项目编译后直接进入门级仿真器进行模拟测试。主要用于测试设计项目的逻辑功能,用以了解其实现的功能是否满足设计要求,在功能仿真的过程不涉及任何具体器件的硬件特性。时序仿真:当设计项目通过功能仿真初步确定满足设计要求后,需要绑定具体器件进行时序仿真。时序仿真就是接近真实器件运行特性的仿真,仿真文件包含了器件硬件特性参数,因而仿真精度高。但时序仿真的仿真文件必须来自针对具体器件的综合器和适配器。综合所得的EDIF网表文件通常作为FPGA适配器的输入文件
28、,产生的仿真网表文件包含了器件精确的延时信息。5.编程下载把适配后生成的下载或配置文件,通过编程器或编程电缆向FPGA进行下载,以便进行硬件调试和验证,从而实现满足设计要求的电子系统8。4 Quartus 概述及其设计流程4.1 Quartus 概述Quartus 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。Quartus 可以在XP、Linux以及Unix上使用,除了可
29、以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。Quartus 支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。此外,Quartus 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一
30、种综合性的开发平台。Maxplus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对Maxplus II 的更新支持,Quartus 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。Altera在Quartus 中包含了许多诸如SignalTap II、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了Maxplus II 友好的图形界面及简便的使用方法。Altera Quartus 作为一种可编程逻辑的设计环境, 由于其强大的设计能力和直观易用的接口,越来越受到数
31、字系统设计者的欢迎。Altera的Quartus 可编程逻辑软件属于第四代PLD开发平台。该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。Quartus平台与Cadence、ExemplarLogic、 MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。改进了软件的LogicLock模块设计功能,增添 了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。支持MAX7000/MAX3000等乘积项器件。4.2 Quartus 设计流程.建立新工程:首先将所设计工程项目划分为若干子模块,将每个子模块单
32、独存放在一个文件夹中,并分别进行编译,验证通过后,将每个子模块的VHDL文本文件添加到总工程文件夹中,并建立图元(建立图元block,右键点击.V文件,选择 create symbol files for current files),将各个图元(亦即子模块)连接起来构成总体设计项目。.设计各子模块:编写各子模块相应的代码,并分别进行编译,验证通过后将各子模块VHDL文件添加到顶层设计中,创建图元,进行连接以完成总体项目的设计。这部分就是将管脚连好。在原理图编辑中,英文的大小写代表相同的含义,只要器件连接线的节点名称相同就会默认为是连接的,总线(Bus)在图形编辑窗口显示的是一条粗线,总线必须
33、在名称的后面加上“a.b”,表示一条总线内所含有的节点编号,原理图编辑的文件扩展名为“.bdf”,在Quartus II中工程名称必须与顶层实体名称相同,且VHDL设计中实体名称亦为相同的名字,否则不能进行编译。.编译工程.仿真:波形矢量文件的扩展名为“.vwf”,仿真分为功能仿真和时序仿真,也称为前仿真和后仿真,功能仿真是忽略延时后的仿真,是最理想的仿真,时序仿真则是加上了一些延时的仿真,是最接近于实际的仿真,在设计中通常先做功能仿真验证逻辑的正确性,后做时序仿真验证时序是否符合要求,需注意默认为时序仿真,在设置功能仿真后需要生成功能仿真网络表。5 系统方案设计系统总体设计框图如图5.1所示
34、。此设计由计算部分、存储部分、显示部分和输入部分组成。图5.1 计算器的系统组成框图5.1 计算器的计算部分在这一部分中,可以将每一个数均表示成8位或者4位二进制数统一进行运算,各个计算数之间的计算可以直接使用VHDL语言中的运算符来实现。但在显示时,必须将个位、十位、百位分开显示,设计时使用比较的方法来实现计算器的功能要求。另外,由于在VHDL语言中只能进行除数是2的幂的除法,不能进行任意数的除法,因此必须单独设计一个除法器来实现计算器的功能要求,该除法器可以利用减法运算和左移位运算实现除法运算,具体算法见第四章。5.2 计算器的存储部分存储部分需要3个存储器来实现:内部累加器(acc)、输
35、入寄存器(reg)以及结果暂存器(ans)。在存放数字时,将数字放入acc或者reg里面,当第一次按下数字键时,表示该数字是个位。当第二次按下数字键时,表示这次输入的是个位,上一次输入的是十位,所以要把第一次输入的数字乘以10,再加上第二次输入的数字,来得到最终输入的数字。当第三次按下数字键时,要将第一次输入的数字乘以100,再加上第二次输入的数字乘以10,再加上第一次输入的数字,来得到最终输入的数字。当进行第一次计算时,第一个数字存放在acc里面。按下运算符以后,第二个数字放在reg里面。当再按下运算符号或者等号时,第一次计算的结果将存放在ans里面,同时reg清零,等待下一个数字的输入。进
36、行第二次运算时,将ans里面的结果与reg里面新输入的数字进行运算,再将运算结果存放在ans里面,直到最后按下等号按键的时候,显示最终的运算结果。5.3 计算器的显示部分显示部分是系统的输出部分,用于显示按键值及计算结果,由于数字系统的数据运算都是二进制的,而输出表达式都是BCD码,为了满足BCD码的译码显示,最方便的方法就是利用译码程序在FPGA中实现。本文采用的是共阳极七段数码管,显示数字时需要将对应管脚置为低电平,输出时,从左到右,按从高到低位的顺序依次接g、f、e、d、c、b、a。七段译码器的基本结构如图3.2所示。图5.2 七段译码器的结构其VHDL语言描述如下所示。在这段程序中,i
37、ndata是输入4位二进制数的端口,outdata是输出7位译码的端口,用WITH语句来实现译码。WITH indata SELECToutdata<="0111111"WHEN"0000", -0的显示; "0000110"WHEN"0001", -1的显示; "1011011"WHEN"0010", -2的显示; "1001111"WHEN"0011", -3的显示; "1100110"WHEN"
38、0100", -4的显示; "1101101"WHEN"0101", -5的显示; "1111101"WHEN"0110", -6的显示; "0000111"WHEN"0111", -7的显示; "1111111"WHEN"1000", -8的显示; "1101111"WHEN"1001", -9的显示; "0000000"WHEN OTHERS; -其它的输入按键均
39、不显示。计算器显示部分的设计和实现,实际上就是七段译码器的设计和实现,三个七段译码器分别显示的是个位、十位和百位。输入第一个数字后至再一次按下数字按键输入第二个数字前,三个七段译码器显示的都是第一个数字。当开始输入第二个数字的时候显示第二个数字,再次按下运算按键到输入第三个数字前,显示的是前两个数字的运算结果,以此类推,当最后按下等号键的时候,显示最终的运算结果。5.4 计算器的输入部分计算器输入部分的设计最主要的是按键译码电路的设计和实现。计算器的输入部分是由09十个数字按键、加减乘除四则运算的运算符按键、一个等号按键和一个清零按键组成的,设计所要做的是对按键信息进行译码,使其在计算器内部可
40、以使用。数字按键译码电路的主体部分VHDL语言描述如下。PROCESS(inclk,reset) BEGIN IF reset='1'THEN -异步复位信号为高电平的时候 outnum<="0000" -把“0000”赋值给数字的输出端口 ELSIF inclk'EVENT AND inclk='1'THEN CASE innum IS WHEN"0000000001"=>outnum<="0000"outflag<='1' -按下一个键表示输入为0 W
41、HEN"0000000010"=>outnum<="0001"outflag<='1' -按下第二个键表示输入为1 WHEN"0000000100"=>outnum<="0010"outflag<='1' -按下第三个键表示输入为2 WHEN"0000001000"=>outnum<="0011"outflag<='1' -按下第四个键表示输入为3 WHEN"000
42、0010000"=>outnum<="0100"outflag<='1' -按下第五个键表示输入为4 WHEN"0000100000"=>outnum<="0101"outflag<='1' -按下第六个键表示输入为5 WHEN"0001000000"=>outnum<="0110"outflag<='1' -按下第七个键表示输入为6 WHEN"0010000000"
43、;=>outnum<="0111"outflag<='1' -按下第八个键表示输入为7 WHEN"0100000000"=>outnum<="1000"outflag<='1' -按下第九个键表示输入为8 WHEN"1000000000"=>outnum<="1001"outflag<='1' -按下第十个键表示输入为9 WHEN OTHERS=>outnum<=outnum;out
44、flag<='0' -不按键时保持 END CASE;END IF;END PROCESS;在本次设计的程序中,设reset是异步复位信号的输入端口,inclk是时钟信号的输入端口,innum端口用来表示输入的按键向量,outnum端口用来表示输入的按键动作对应的输出数字,outflag端口用来输出是否有按键动作,它主要实现的是按下什么就输出什么。一共有十个位,初始值都为低电平“0”,当按下哪个位时哪个位上的电平就跳为高电平(有且仅有一个为高电平),这时就有相应的输出。那十个位分别对应的是09这十个数字,所以当第一个位(从左往右位数依次增高)为高电平时显示0,第十个位上位
45、高电平时,相应的显示为9。如果按下的键是加号、减号、乘号、除号或者是等于号时,也是不显示的,所以也可以称作数字按键译码电路。6 计算器的VHDL设计6.1加法器的设计与仿真本次设计的加法器属于多位加法器的范畴,可按其进位方式的不同分为两类:串行进位加法器和并行进位加法器。串行进位加法器是将多个一位全加器级联,低位全加器的进位输出送给相邻高位全加器作为进位输入,以此构成多位加法器。这种设计思路简单明了且占用资源少,但运算速度较慢。并行进位方式则是在各位的加法环节之外,另外设有进位产生逻辑电路,各位的进位输入信号同时产生,从而各位可以同时完成全加运算,输出最后结果。并行进位方式具有较快的运算速度,
46、但是相对于串行进位方式来说,却往往占用更多的资源。尤其是当运算位数增加的时候,相同位数的并行进位和串行进位加法器的资源占用差距也越来越大。因此,常常需要设计者在运算速度和资源占用量之间做出折中平衡。而经过实践证明,4位二进制并行进位加法器和串行级联加法器占用的资源几乎相同。因此,可以用两个4位二进制并行加法器级联构成8位二进制加法器,这是一种较为合理的选择,加法器的原理框图如图6.1所示。图6.1 加法器的原理框图加法器要有被加数、加数和进位位的输入端口。设a端口为被加数,b端口为加数,ci为输入进位。此加法器还有两个输出端口,分别是加法运算的最终结果输出和进位位的输出,设s为结果的输出端口,
47、co为进位的输出端口。当输入被加数与加数后,两个8位二进制数开始相加,之后,再与输入进位位相加,这样得到的最终结果就是加法器加法运算的最终结果。加法器模块图如附录中所示。程序如附录中加法程序,经Quartus 编译后建立.vmf文件,设置被加数a为“0010000”即十进制数16(可设置0255内的任意数字),设置加数b为“10110000”即十进制数176(可设置0255内的任意数字,但因为程序中未包含出错溢出判断,所以需满足a+b255),仿真后所得结果如图6.2所示。16+176192,仿真结果正确,可知此加法器设计有效。图6.2 加法器仿真16+1761926.2减法器的设计与仿真首先
48、设计一个四位二进制数的减法器,四位全减器的原理框图如图6.3所示。由图可以看出,此减法器共需要两个输入端口和一个输出端口。减法器的设计可以引用加法器,即通过对减数的求补,再与被减数相加得到最终的结果,所以需要增设一个进位位输入端口和进位位的输出端口。图6.3 四位全减器的原理框图可以设a端口为被减数,b端口为减数,ci为输入借位位,s为结果的输出端口,co为借位的输出端口。减法器的运算过程中首先要引用加法器,在此不再赘述。而且此减法器可以进行位数扩展,每增加一位需要多引用一个加法器,为使图形原理简洁,所以此处只列出四位减法器。减法器模块图如附录中所示。程序如附录中减法程序,经Quartus 编
49、译后建立.vmf文件,设置被减数a为“1111”即十进制数15(可设置015内的任意数字),设置减数b为“1001”即十进制数9(可设置015内的任意数字,但因为程序中未包含出错判断,所以需满足ab),仿真后所得结果如图6.4所示。15-96,仿真结果正确,可知此减法器设计有效。图6.4 减法器仿真15-966.3乘法器的设计与仿真乘法器是数字系统中的基本逻辑器件,在很多应用中都会出现如各种滤波器的设计、矩阵的运算等。这里设计的是一个4×4的乘法器。依据乘法器的原理,可以绘出其原理框图如图6.5所示。图6.5 乘法器的原理框图可设a端口为被乘数(一个4位二进制数),b端口为乘数(一个
50、4位二进制数),y为乘法运算的结果的输出端口。乘法器模块图如附录中所示。程序如附录中乘法程序,经Quartus 编译后建立.vmf文件,设置被乘数a为“1101”即十进制数13(可设置016内的任意数字),设置乘数b为“1010”即十进制数10(可设置016内的任意数字),仿真后所得结果如图6.6所示。13*10130,仿真结果正确,可知此乘法器设计有效。图6.6 乘法器仿真 13*101306.4 除法器的设计与仿真除法器是基于连减和移位操作的,连减实际上就是基于数学上除法的基本原理。例如,a÷b=c余数是d,就等价于a减去c个b后得到d而且d<b;之所以可以使用移位操作,是
51、因为所有运算的数都用二进制表示,本文设计的除法器主要部分为一个控制移位的控制器,另有一个由全加器组成的4位减法器(引用上面的减法器的设计)。又因为规定了结果为4位,控制器首先比较被除数的高4位与除数的大小,判断是否溢出,溢出则退出,否则就做4位移位和减法得到结果。在每次做完减法以后都要判断是否够减,即判断是否有借位,不够得话,就恢复被减数,移一位再减。除法器的原理框图如图6.7所示。图6.7 除法器的原理框图设a端口为被除数,b端口为除数,clk为时钟信号的输入端口,str为启动信号的输入端口,此端口的作用是当启动信号为高电平的时候有效,表示启动了除法器开始作除法运算。s为除法运算所得到的商的
52、输出端口,y为除法运算中所得到的余数的输出端口。该除法器的设计中使用了状态机,它有5个状态:start为开始状态,one为第一次移位状态,two为第二次移位状态,three为第三次移位状态(正常运算结果的输出状态),error为溢出出错状态。在除法器的设计中引用了减法器。ain用来寄存被除数,bin用来寄存除数,atem为减法器的被减数输入,btem为减法器的减数输入,stem用来计算内存结果,citem为减法器的借位输入,cotem为减法器的借位输出。除法器的模块图如附录中所示。程序如附件中除法程序,经Quartus 编译后建立.vmf文件,设置clk=100ns,str=1,使除法器工作。
53、前面部分设置被除数为“10010100”,即十进制数148(可设置0255内的任意数字),后面部分设置被除数为“00010110”,即十进制数22(可设置0255内的任意数字,为对比,勿与第一个数设置相同),设置除数为“1101”,即十进制数13(可设置015内的任意数字,本部分程序中有差错判断部分,所以除数取0时不做运算),仿真所得结果如图6.8所示。当检测到clk上升沿时启动运算,所以第一个clk上升沿出现前虽然被除数与除数已设置,商和余数仍然为0,第一个clk上升沿出现,计算得到148÷13115,仿真结果正确。当被除数改变为22的一段时间内,因为未检测到clk上升沿,所以未进
54、行运算,商和余数未变,分别仍为11和5。当接下来的第一个clk上升沿出现,再次进行运算,计算得到22÷1319,仿真结果正确,由此可知此除法器设计有效。图6.8 除法器仿真 148÷13115,22÷1319致 谢这次课程设计是学完EDA技术之后将自己所学理论与实际相结合的机会,通过这次比较完整的基于FPGA的计算器芯片设计,我自己的理论与实践相结合的能力有了大幅度的提升。在温习了所学专业知识的基础上,同时通过查阅专业书籍、相关文献资来解决实际工程问题,这锻炼了我的综合运用各项知识和资源的能力。而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的实际
55、动手经验得到了极大的丰富,由于程序编写与处理是一项非常繁琐非常令人头疼的工作,完成了这些,也使我的意志、抗压能力及耐力都得到了不同程度的提升,我相信这些提升是会影响我一辈子的宝贵财富。这一次的设计让我积累很多的解决实际问题的经验,使我的头脑更加灵活,这必然会让我在未来的工作学习中表现出更高的应变能力,更强的沟通力和理解力。通过这次的设计,我对FPGA技术、VHDL语言以及Quartus 的使用都有了深入的了解。虽然课程设计中内容较多,过程繁琐,但这也造就了我丰富的收获。我采用的是分模块的设计方法,各个模块的设计我都是随着设计的不断深入而不断熟悉并学会应用的。以前从课堂上没学懂的内容经过这次课程
56、设计大部分都弄明白了,总之, 这次课程设计我收获很大。参考文献1周润景.基于Quartus的FPGA/CPLD数字系统设计实例M.电子工业出版社.2007,82林明权 马维旻 VHDL数字控制系统设计范例.电子工业出版社2003,13褚振勇. FPGA设计及应用(第三版)M.西安电子科技大学出版社.2012,44崔葛瑾,沈利芳,李伟民.基于FPGA的数字电路系统设计M.西安:西安电子科技大学出版社,2008年.5王彦.基于FPGA的工程设计与应用M.西安:西安电子科技大学出版社,2007年.6黄智伟.FPGA系统设计与实践M.北京:电子工业出版社,2005年.7江思敏.VHDL数字电路及系统设计M.北京:机械工业出版社,2006年.8潘松,黄继业.EDA技术实用教程M.第二版.北京:科学出版社,2005年.9徐志军,徐光辉.CPLD/FPGA的开发与应用M.北京:电子工业出版社,2002年.附 录附录A:源程序4位二进制并行进位加法器的源程序ADDER4B.VHD如下:LIBRARY IEEE; USE IEEE.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年含铅废电池回收处理合同
- 2025建设用地使用权转让合同样本
- 2025企业员工培训合同模板 合同示例
- 2025房屋租赁合同模板3
- 修理修配劳务合同范例
- 中越贸易合同范例
- 2025房屋租赁合同协议书注意事项及范本
- 公务员解决问题试题及答案
- 官方兽医考试试题及答案
- 药学证考试试题及答案
- 贵州省毕节市威宁县2024-2025学年小升初总复习数学测试题含解析
- 房地产企业项目全过程管理标准手册
- 幼儿园孩子讲解中药知识
- 2025年度美团外卖加盟商合作协议范本4篇
- 医院pdca改进案例文档
- 铁路智能运维系统构建研究-洞察分析
- 《中药调剂技术》课件-发药常规与发药交代
- 外研版(2025新版)七年级下册英语Unit 6 学情调研测试卷(含答案)
- 急性心肌梗死的急救与护理
- 低年级数学“数学连环画”跨学科主题活动探索
- 《甲状腺肿》课件
评论
0/150
提交评论