计算器的设计_第1页
计算器的设计_第2页
计算器的设计_第3页
计算器的设计_第4页
计算器的设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、大连交通大学2011届本科生毕业设计(论文)目 录第一章绪论21.1 课题来源及意义21.2 国内外发展状况2第二章VHDL语言42.1 VHDL语言42.2 VHDL语言的特点42.3 VHDL语言设计实体的基本结构52.4 VHDL语言的实体52.5 VHDL语言的结构体62.6 VHDL程序设计约定7第三章基于EDA技术的计算器的设计83.1 计算器的设计思路83.2 系统组成框图83.3计算部分的设计和实现93.3.1 加法器的设计93.3.2 减法器的设计123.3.3 乘法器的设计143.3.4 除法器的设计163.4 计算器输入部分的设计和实现213.5 计算器显示部分的设计和实

2、现243.6位二进制数转换成个位、十位、百位的模块263.7计算器的综合设计293.7.1 整体的程序设计293.7.2 计算器的仿真波形31结 论37谢 辞38参 考 文 献39第一章 绪论1.1 课题来源及意义 在当今以数字化和网络化为特征的信息技术革命大潮中,电子技术获得了飞速发展,现代电子产品渗透了社会的各个领域。现代电子产品的性能进一步提高,功能越来越复杂,集成化智能化的复杂程度越来越高,更新换代的节奏越来越快,开发风险也越来越大,而且正向着功能多样化、体积小型化、功耗最低化的趋势发展。所有这些,都给电子系统设计者带来了前所未有的压力,面对这种压力,唯一的出路就是熟练掌握EDA技术,

3、并获得了其有力的支持。EDA的出现,极大地提高了电路设计的效率和可靠性,减轻了设计者的劳动强度,EDA是电子产品开发研制的动力和加速器,是现代电子设计的核心。现在生活中计算器的应用基本上可以说是无处不在,小到做买卖的商人的加减乘除的简易计算器,还有学生群体中使用能够进行复杂运算的多功能计算器。可谓是和生活息息相关。EDA的设计观念是按照"自顶 向下"的设计方法,对整个系统进行方案设计和功能划分,系统的关键电路用一片或几片专用集成 电路(ASIC)实现,然后采用硬件描述语言(VHDL)完成系统行为级设计,最后通过综合器和适配 器生成最终的目标器件。用EDA 来设计计算器,分别

4、做加减乘除的底层文件、存储文件、显示文件以及输入文件。然后对其进行整合,层次分明,可以分别对底层文件进行测试,和传统计算器的设计相比,在测试方面有很大的优势。在EDA技术蓬勃的发展下,本次毕业设计选了EDA技术关于计算器的设计,不仅仅在原来EDA基础编程的情况下,进行更深一步的研究,为了以后从事EDA方面的研究,有更深层次应用,所以通过EDA对计算器的设计,对EDA技术的语言程序、运用电路图设计方法、以及各种不同底层程序的编辑对Quartus II软件的运用更为自如。1.2 国内外发展状况回顾近30年电子设计技术的发展历程,可将EDA技术1分为三个阶段。 (1) 七十年代为CAD阶段,这一阶段

5、人们开始用计算机辅助进行IC版图编辑和PCB布局布 线,取代了手工操作,产生了计算机辅助设计的概念。 (2)八十年代为CAE阶段,与CAD相比,除了纯粹的图形绘制功能外,又增加了电路功能设 计和结构设计,并且通过电气连接网络表将两者结合在一起,以实现工程设计,这就是计算机辅助 工程的概念。CAE的主要功能是:原理图输入,逻辑仿真,电路分析,自动布局布线,PCB后分 析。 (3)九十年代为ESDA阶段。尽管CAD/CAE技术取得了巨大的成功,但并没有把人从繁重的 设计工作中彻底解放出来。在整个设计过程中,自动化和智能化程度还不高,各种EDA软件界面千 差万别,学习使用困难,并且互不兼容,直接影响

6、到设计环节间的衔接。基于以上不足,人们开始 追求贯彻整个设计过程的自动化,这就是ESDA即电子系统设计自动化。 从目前的EDA技术来看,其发展趋势是政府重视、使用普及、应用文泛、工具多样、软件功能强大。中国EDA市场已渐趋成熟,不过大部分设计工程师面向的是PC主板和小型ASIC领域,仅有小部分(约11%)的设计人员工发复杂的片上系统器件。为了与台湾和美国的设计工程师形成更有力的竞争,中国的设计队伍有必要购入一些最新的EDA技术。在信息通信领域,要优先发展高速宽带信息网、深亚微米集成电路、新型元器件、计算机及软件技术、第三代移动通信技术、信息管理、信息安全技术,积极开拓以数字技术、网络技术为基础

7、的新一代信息产品,发展新兴产业,培育新的经济增长点。要大力推进制造业信息化,积极开展计算机辅助设计(CAD)、计算机辅助工程(CAE)、计算机辅助工艺(CAPP)、计算机机辅助制造(CAM)、产品数据管理(PDM)、制造资源计划(MRPII)及企业资源管理(ERP)等。有条件的企业可开展“网络制造”,便于合作设计、合作制造,参与国内和国际竞争。开展“数控化”工程和“数字化”工程。自动化仪表的技术发展趋势的测试技术、控制技术与计算机技术、通信技术进一步融合,形成测量、控制、通信与计算机(M3C)结构。在ASIC和PLD设计方面,向超高速、高密度、低功耗、低电压方向发展。外设技术与EDA工程相结合

8、的市场前景看好,如组合超大屏幕的相关连接,多屏幕技术也有所发展。中国自1995年以来加速开发半导体产业,先后建立了几所设计中心,推动系列设计活动以应对亚太地区其它EDA市场的竞争。在EDA软件开发方面,目前主要集中在美国。但各国也正在努力开发相应的工具。日本、韩国都有ASIC设计工具,但不对外开放 。中国华大集成电路设计中心,也提供IC设计软件,但性能不是很强。相信在不久的将来会有更多更好的设计工具有各地开花并结果。据最新统计显示,中国和印度正在成为电子设计自动化领域发展最快的两个市场,年复合增长率分别达到了50%和30%。EDA技术发展迅猛,完全可以用日新月异来描述。EDA技术的应用广泛,现

9、在已涉及到各行各业。EDA水平不断提高,设计工具趋于完美的地步。EDA市场日趋成熟,但我国的研发水平沿很有限,需迎头赶上。第二章 VHDL语言2.1VHDL语言VHDL语言全称是“超高速集成电路硬件描述语言(Very High Speed Intergated Circuit Hardwre Description Lnguage)”,它是随着集成电路系统化和高度集成化的发展而逐步发展起来的,是一种用于数字系统的设计和测试的硬件描述语言。对于小规模的数字集成电路,通常可以用传统的设计输入方法(如原理图输入)来完成,并进行模拟仿真。但纯原理图输入方式对于大型、复杂的系统,由于种种条件和环境的制约

10、,其工作效率低,而且容易出错,暴露出多种弊端。在信息技术高速发展的今天,对集成电路提出了高集成度、系统化、微尺寸、微功耗的要求,因此,高密度可编程逻辑器件和VHDL便应运而生。2.2 VHDL语言的特点VHDL语言作为一种标准的硬件描述语言,具有结构严谨、描述能力强的特点2,支持从系统级到逻辑门级电路所有层次的设计,适合于复杂逻辑电路和系统的设计。作为一种高级硬件描述语言,VHDL语言有如下特点。(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力。强大的行为描述能力是避开具体的器件结构、从逻辑行为上描述和设计大规模电子系统的重要保证。(2)VHDL具有丰富的仿真语句和库函数,使得在

11、任何大系统的设计早期,就能检查系统的功能可行性,随时可对系统进行仿真模拟,使设计者对整个工程的结构和功能的可行性做出判断。(3)用VHDL完成一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动把VHDL描述设计转变成门级网表(根据不同的实现芯片)3。这种方式突破了门级设计的瓶颈,极大地减少了电路设计的时间和可能发生地错误,降低了开发成本。利用EDA工具的逻辑优化功能,可以自动地把一个综合后的设计变成一个更小、更高速的电路系统。反过来,设计者还可以容易地从综合和优化的电路中获得设计信息,返回去更新修改VHDL设计描述,使之更加完善。(4)VHDL对设计的描述具有相对独立性。设计者可以不

12、懂硬件的结构,也不必顾及最终设计的目标器件是什么,而进行独立的设计。正因为VHDL得硬件描述与具体的工艺技术和硬件结构无关,所以VHDL设计程序的硬件实现目标器件有广阔的选择范围。(5)由于VHDL具有类属描述语句和子程序调用等功能,对于完成的设计,在不改变源程序的条件下,只需改变类属参量或函数,就能轻而易举地改变设计的规模和结构4。(6)VHDL本身的生命周期长。因为VHDL得硬件描述与工艺无关,不会因工艺变化而使描述过时。而与工艺技术有关的参数可通过VHDL提供的属性加以描述,当生产工艺改变时,只需要修改相应程序中的属性参数即可。2.3 VHDL语言设计实体的基本结构VHDL语言是一种强数

13、据类型语言,它有三种数据对象,即常数、信号和变量,每一种数据对象都要指定数据类型。VHDL的数据类型丰富5,既有数值数据类型和逻辑数据类型,又有位型和位向量型。既支持预定义的数据类型,又支持自定义的数据类型。这样就给硬件描述带来较大的自由度,使设计人员能够方便地使用VHDL创建高层次的系统模型。VHDL语言将所设计的电路系统均看作一个设计实体,它可以是任意复杂的系统,也可以是一块电路板、一个芯片、一个电路单元甚至一个门电路。如果将一个系统自上而下分层,划分模块,则各层的设计模块都可以作为一个设计实体。不论是简单的数字电路,还是复杂的数字系统,其基本构成是一致的,它们都是由实体说明(Entity

14、)和结构体(Architecture)两个最基本的部分组成。实体说明部分用来描述该模块或系统的接口信息,包括端口的数目、方向和类型,其作用相当于传统设计方法中所使用的元件符号。结构体部分则描述该模块的内部电路,对应于原理图、逻辑方程6和模块的输入/输出特性。两者相结合就可以组成VHDL设计文件。一个设计试题可以包括一个或多个结构体,用于描述其逻辑结构和逻辑功能。2.4 VHDL语言的实体实体说明语句的格式如下:ENITTY 实体名ISPORT(端口表);END ENTITY 实体名;实体说明是VHDL程序设计中最基本的组成部分,主要用来描述设计实体7的外部接口信号,定义设计单元的输入/输出端口

15、,是设计实体对外的一个通信界面,为可视部分。但它并不描述设计的具体功能。端口名是赋予每个外部引脚的名称,通常用一个或几个英文字母,或者用英文字母加数字命名。端口模式(或端口方向)用来定义外部引脚的信号方向。在端口说明中,共有五种模式,分别为IN(输入端口)、OUT(输出端口)、INOUT(双向端口)、BUFFER(缓冲端口)和LINKAGE(链接端口)。2.5 VHDL语言的结构体结构体8是设计实体的核心,它具有指明了设计实体的行为、元件及内部连接关系。如果将实体说明看成一个元件或电路的外部符号,则结构体就是这个元件或电路的内部原理图。通过结构体构造设计实体的硬件结构、元件之间的连接,实现数据

16、传输和变换,完成设计实体功能的具体实施。结构体的格式如下:ARCHITECTURE 结构体名 OF 实体名 IS 结构体说明语句;BEGIN 功能描述语句;END ARCHITECTURE 结构体名;结构体名是给予结构体的名称,它是该结构体唯一的名字,位于引导语句和OF语句之间。OF后面紧随实体名,表明该结构体隶属于哪个实体,并用IS来结束结构体的命名。结构体名原则上可以是任意合法的标识符,但为了便于程序的阅读,通常都是根据该结构体所采用的描述方式对其命名,如Behavior(行为描述)、Dataflow(数据流描述)、Structure(结构描述)等。结构体说明语句位于ARCHITCTURE

17、和BEGIN之间,用于定义结构体中所用的数据对象和子程序,并对所引用的元件加以说明,即对结构体的功能描述语句中所用到的信号(SIGNAL)、类型(TAPY)、常数(CONSTANT)、元件(COMPONENT)、函数(FUNCTION)和过程(PROCEDURE)等加以说明和定义,但不能定义变量。应当注意,这些定义只能用于这个结构体中,如果要将这些定义用于其他实体或结构体,则需要将其作为程序包处理。2.6 VHDL程序设计约定为了便于程序的阅读,此设计对VHDL程序设计特作如下约定:(1)语句结构描述中方括号“ ”内的内容为可选内容。(2)对于VHDL的编译器和综合器来说,程序文字的大小写是不

18、加区分的。本文中,VHDL中使用的关键词用大写,对于由用户自己定义的名称等用小写。(3)程序中的注释使用横线“”,横线“”后的文字都不参加编译和综合。(4)为了便于程序的阅读与调试,书写和输入程序时,使用层次缩进格式,同一层次的对齐,低层次的描述较高层次的描述缩进两个字符。(5)考虑到MAX+PLUS要求源程序文件的名字与实体名必须一致,因此为了使同一个VHDL源程序文件能适应各个EDA开发软件上的使用要求,各个源程序文件的命名均与其实体名一致。第三章 基于EDA技术的计算器的设计3.1 计算器的设计思路将计算器分为四个部分:计算部分、存储部分、显示部分和输入部分。合理设计这四部分将有利于资源

19、的合理应用。其中计算部分分为加减乘除法器,分别设计底层程序。显示部分为设计一个四位二进制数与七段译码相互转换的程序。输入部分为设计有0到9数字按键与加减乘除运算符号,以及等于号及清零键。3.2 系统组成框图数字按键存储部分显示第一个数字显示第二个数字运算符计算部分运算符或等号键运算结果显示图3-13.3计算部分的设计和实现计算部分就是运算的过程,此设计中主要包含的运算有加减乘除法。3.3.1 加法器的设计先构思一下加法器的流程图,如图3-2所示。根据流程图,可以确定一个加法器要有被加数、加数和进位位的输入端口。故设a端口为被加数,b端口为加数,ci为输入进位。此加法器还有两个输出端口,分别是加

20、法运算的最终结果输出和进位位的输出,故设s为结果的输出端口,co为进位的输出端口。     被加数输出进位位输入进位位加数相加运算的最终结果输出图3-2 加法器的流程图根据流程图可以看出,当输入被加数与加数后,两个8位二进制数开始相加,之后,再与输入进位位相加,这样得到的最终结果就是加法器加法运算的最终结果。加法器9是基于EDA的计算器的设计中的基本逻辑器件,这里设计的8位二进制数的加法器,它是属于多位加法器的范畴的。多位加法器按其进位方式的不同可以分为两类:串行进位加法器和并行进位进位加法器。串行进位加法器是将多个一位全加级联,低位全加器的进

21、位输出送给相邻高位全加器作为进位输入,以此构成多位加法器。这种设计思路简单明了且占用资源少,但运算速度较慢。并行进位方式则是在各位的加法环节之外,另外设有进位产生逻辑电路,各位的进位输入信号同时产生,从而各位可以同时完成全加运算,输出最后结果。并行进位方式具有较快的运算速度,但是相对于串行进位方式来说,却往往占用更多的资源。尤其是当运算位数增加的时候,相同位数的并行进位和串行进位加法器的资源占用差距也越来越大。因此,常常需要设计者在运算速度和资源占用量之间做出折中平衡。实践证明,4位二进制并行进位加法器和串行级联加法器占用的资源几乎相同。因此,可以用两个4位二进制并行加法器级联以构成8位二进制

22、加法器,这是一种较为合理的选择。4位二进制并行进位加法器的源程序ADDER4B.VHD如下:LIBRARY IEEE; 库以上这部分是设计中的全加器的VHDL语言的第一部分库。一种用来存放预先已设计好的程序包10、数据集合体、元件的仓库。库存放的信息供用户进行VHDL设计时调用,以提高设计效率。USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;以上这些是此加法器所要调用的程序包,是VHDL语言的第二部分。用VHDL语言编写的共享文件11,定义了在设计结构体和实体说明中将要使用的常数、数据类型、子程序和设计好的电路单元等。EN

23、TITY ADDER4B IS 4位二进制数的加法器的实体 PORT(ci:IN STD_LOGIC; 进位位的输入端口 a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); 一个4位二进制数的输入端口(被加数) b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); 一个4位二进制数的输入端口(加数) s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); 加法运算的结果输出端口 co:OUT STD_LOGIC 进位位的输出端口 );END ADDER4B;这部分是此加法器的VHDL语言的第三部分实体说明。定义电路单元的输入、输出引脚信号。程序

24、的实体名称可任意取名12(这里我取的是ADDER4B),但必须与VHDL程序的文件名称相同(保存时的文件名)。实体说明以标示符ENTITY开始,以END结束。ARCHITECTURE behave OF ADDER4B IS 4位二进制数的加法器的结构体SIGNAL SINT:STD_LOGIC_VECTOR(4 DOWNTO 0); 类似于在芯片15内部定义的一个数据SIGNAL aa,bb:STD_LOGIC_VECTOR(4 DOWNTO 0);BEGIN aa<='0' & a; 拓展位数,使其成为最高位 bb<='0' &

25、b; SINT<=aa+bb+ci; 相加 s<=SINT(3 DOWNTO 0); co<=SINT(4); 最高位为输出进位位END behave;这是加法器的VHDL语言的第四部分结构体。用来描述电路内部和逻辑功能。结构体的名称可任意取名(这里取的是behave),并以标示符ARCHITECTURE开头,以END结尾。(注.以下的程序是部分的VHDL语言)根据以上设计的两个4位二进制数的加法器,来设计两个8位二进制数的加法器。顶层模块:8位二进制并行进位加法器的部分程序ADDER4B.VHD如下:SIGNAL CARRY_OUT:STD_LOGIC;BEGIN U1:A

26、DDER4B PORT MAP(ci=>ci,a=>a(3 DOWNTO 0),b=>b(3 DOWNTO 0),s=>s(3 DOWNTO 0),co=>CARRY_OUT); U2:ADDER4B PORT MAP(ci=>CARRY_OUT,a=>a(7 DOWNTO 4),b=>b(7 DOWNTO 4),s=>s(7 DOWNTO 4),co=>co);调用两个4位二进制数加法的模块。引脚分布图如下图3-3所示:图3-3 8位加法器电路的引脚分布图仿真波形图(图3-4):图3-4 8位加法器的仿真波形从以上仿真波形中可以作出

27、总结(“0”为低电平,“1”为高电平):若a为“8”,b为“9”时,a+b=“17”,这时的ci为高电平,所以在此基础之上还要再加“1”,得到s=“18”,这时最终的结果。因为最高位没有进位,所以co为“0”即为低电平。3.3.2 减法器的设计首先设计一个两个4位二进制数的减法器。根据以下图3-5的4位全减器的流程图可以看出,此减法器共需要两个输入端口和一个输出端口。减法器的设计可以引用加法器,即通过对减数的求补16,再与被减数相加得到最终的 ,所以还要增设一个进位位输入端口和进位位的输出端口。所以可以设a端口为被减数,b端口为减数,ci为输入借位位,s为结果的输出端口,co为借位的输出端口。

28、减法器的运算过程中首先要引用加法器(上面的加法器的程序中很详细地介绍了加法器的设计,故减法器中加法器的描述部分在这里就省略了)。被减数减数求补4位全加器减法的运算结果显示输入进位求反对进位位求反进位位输出结果图3-5 4位全减器的流程图减法器的部分VHDL语言描述:BEGINbtem(3 DOWNTO 0)<=NOT b(3 DOWNTO 0); 先把减数求反ctem(0)<=NOT ci; 输入进位也求反,从而对减数求补码g1:FOR i IN 0 TO 3 GENERATE 连用四位全加器17add:adder PORT MAP(a(i),btem(i),ctem(i),ste

29、m(i),ctem(i+1);END GENERATE;s(3 downto 0)<=stem(3 downto 0); 把中间变量所得到的值赋给s,因为s是减法器运算出来的结果的输出端口,通过s把计算结果输出co<=NOT ctem(4); 求反输出进位END behave;然后将4位全减器级联起来,就可得到两个8位二进制数的减法器。图3-5是其原理图:图3-6 减法器的原理图减法器的仿真波形:图3-7 减法器的仿真波形图从以上仿真波形图3-7中可以作出总结(“0”为低电平,“1”为高电平):两个数做减法,采用的是4位4位一减,若a为“00111000”,b为“00100010”

30、时,首先将它们各自的低4位先做运算,先将b的第四位求补,之后与a的第四位相加后得到第四位的运算结果“0110”,最高位有进位,但输出时取反就 为“0”,再用同样的方法计算出高四位的运算结果,得“0001”,之后还得加上一个低4位向高4位的进位“0”,所以最终结果s为“00010110”。3.3.3 乘法器的设计乘法器是数字系统中的基本逻辑器件,在很多应用中都会出现如各种滤波器的设计、矩阵的运算等。这里设计的是一个4×4的乘法器。根据乘法器的原理,可以绘出其流程图(图3-8),从流程图中又可以看出可设a端口为被乘数(一个4位二进制数),b端口为乘数(一个4位二进制数),y为乘法运算的结

31、果的输出端口。被乘数乘数乘数的最低位每位二进制数相与得到4次结果位对齐乘数从最低位左移一位二进制数相加最终结果3次图3-8 乘法器的流程图乘法器的部分VHDL语言描述:ENTITY mul IS PORT (a,b : IN STD_LOGIC_VECTOR(3 DOWNTO 0); 被乘数与乘数的输入y : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) 乘积的输出端口);END mul;ARCHITECTURE arch OF mul ISBEGINy(7 DOWNTO 0) <= a(3 DOWNTO 0)*b(3 DOWNTO 0); y=a×bEND

32、 arch;乘法器的引脚图:图3-9 乘法器的引脚图从乘法器的引脚图中也可以看出,乘法器有两个输入引脚,分别来输入乘数和被乘数,一个用来输出运算结果的输出端口,在封装好的乘法器的器件中,就是来实现乘法运算的算法的。乘法器的仿真波形:图3-10 乘法器的仿真波形从乘法器的仿真图3-10中可以看出,y的输出就是a与b的相乘后的结果。例如:若a为“0001”,b为“0010”,则根据左移原理可得出最终结果s,为“00000010”。结果完全正确。这里也可以证实两个4位二进制数的乘积为一个8位二进制数。3.3.4 除法器的设计整个除法器是基于连减和移位操作的,连减实际上就是基于数学上除法的基本原理。例

33、如,a÷b=c余数是d,就等价于ac个b后得到d而且d<b;之所以可以使用移位操作,是因为所有运算的数都用二进制表示。所设计的除法器主要部分为一个控制移位的控制器,另有一个由全加器组成的4位减法器(可引用上面的减法器的设计)。又因为规定了结果为4位,控制器首先比较被除数的高4位与除数的大小,判断是否溢出,溢出则退出,否则就做4位移位和减法得到结果。在每次做完减法以后都要判断是否够减,即判断是否有借位,不够得话,就恢复被减数,移一位再减。除法器的流程图如下图3-11所示:被除数除数高四位clk=1str=1相除在最低位上的到商位相与得到结果减法器余数溢出状态被除数右移一位作为减数

34、作为被减数有借位无借位03次左移图3-11 除法器的流程图设a端口为被除数,b端口为除数,clk为时钟信号的输入端口,str为启动信号的输入端口,此端口的作用是当启动信号为高电平的时候有效,表示启动了除法器开始作除法运算。s为除法运算所得到的商的输出端口,y为除法运算中所得到的余数的输出端口。该除法器的设计中使用了状态机,它有5个状态:start为开始状态,one为第一次移位状态,two为第二次移位状态,three为第三次移位状态(正常运算结果的输出状态),error为溢出出错状态。在除法器的设计中引用了减法器。ain用来寄存被除数,bin用来寄存除数,atem为减法器的被减数输入,btem为

35、减法器的减数输入,stem用来计算内存结果,citem为减法器的借位输入,cotem为减法器的借位输出。除法器的VHDL语言描述的部分程序:BEGINp2:PROCESS(clk)VARIABLE n:INTEGER range 0 to 3; 移位次数计数值BEGINIF clk'EVENT AND clk='1'THEN 时钟脉冲为高电平时,状态开始转换CASE state IS 有限状态机的使用WHEN start=> 开始状态IF str='1'THEN 启动信号为高电平的时候有效 state<=one; 进入第一次移位状态 atem

36、(3 DOWNTO 0)<=a(7 DOWNTO 4); 把被除数的高4位放到减法器的被减数端口 btem(3 DOWNTO 0)<=b(3 DOWNTO 0); 把除数放到减法器的减数端口 ain(7 DOWNTO 0)<=a(7 DOWNTO 0); 寄存被除数 bin(3 DOWNTO 0)<=b(3 DOWNTO 0); 寄存除数END IF; WHEN one=> 第一次移位 IF cotem='0'THEN state<=error; 进入溢出出错状态 ELSE ain(3 downto 1)<=ain(2 downto 0

37、); ain(0)<=not cotem; 在最低位接受该位商值 atem(3 downto 0)<=ain(6 downto 3); 除数寄存器高4位输入到减法器,作为被减数 state<=two; 进入第二次移位的状态 END IF; WHEN two=> 第二次移位 IF n=2 THEN state<=three; 进入第三次移位状态 n:=0; ELSE state<=two; n:=n+1; END IF; IF cotem='1'THEN atem(3 DOWNTO 1)<=stem(2 DOWNTO 0); ELSE a

38、tem(3 DOWNTO 1)<=atem(2 DOWNTO 0); END IF; ain(3 DOWNTO 1)<=ain(2 DOWNTO 0); ain(0)<=ain(3); atem(0)<=ain(3);WHEN three=> 第三次移位 s(3 DOWNTO 1)<=ain(2 DOWNTO 0); s(0)<=NOT cotem; IF cotem='0'THEN y(3 DOWNTO 0)<=atem(3 DOWNTO 0); ELSE y(3 DOWNTO 0)<=atem(3 DOWNTO 0);

39、END IF; atem(3 DOWNTO 0)<="0" btem(3 DOWNTO 0)<="0" state<=start; WHEN error=> 溢出状态 state<=start; 回到开始状态 atem(3 DOWNTO 0)<="0" btem(3 DOWNTO 0)<="0"END CASE;END IF;END PROCESS p2;citem<='0' 借位位输入端为0U1:suber PORT MAP(atem,btem,ci

40、tem,stem,cotem);END behave;除法器的引脚图:图3-12 除法器的引脚图除法器的仿真波形图之一:图3-13 除法器的仿真波形之一除法器的仿真波形图之二:图3-14 除法器的仿真波形之二在以上两幅除法器的仿真图中,我举了好多的例子的除法运算。在启动信号为低电平的时候,整个除法器清零。在启动信号str为高电平时,除法器开始了运算。仿真图3.12是整除的运算,没有余数。如在02H÷1H的除法运算中,得到的商为2H,余数为0H,说明02H能被1H整除。在仿真图3.13中也举了不能被整除的除法。如04H÷8,商为0H,余数4H。3.4 计算器输入部分的设计和实

41、现计算器输入部分的设计最要是按键译码电路的设计和实现。流程图如图3-12所示:reset=1=0清零无按键动作按键显示所按下的键对应的数字(第一个按键对应的是0的显示,以此类推,到按下第十个键的时候对应的是9)有按键动作clk时钟脉冲图3-15 数字按键译码电路的流程图下面的程序是数字按键译码电路的VHDL语言描述。在该程序中,可以设reset是异步复位信号的输入端口,inclk是时钟信号的输入端口,innum端口用来表示输入的按键向量,outnum端口用来表示输入的按键动作对应的输出数字,outflag端口用来输出是否有按键动作。数字按键译码电路的部分VHDL语言描述:BEGIN PROCE

42、SS(inclk,reset) BEGIN IF reset='1'THEN 异步复位信号为高电平的时候 outnum<="0000" 把“0000”赋值给数字的输出端口 ELSIF inclk'EVENT AND inclk='1'THEN 在异步复位信号reset为低电平时,而时钟信号为上升沿(有效电平)的时候 CASE innum IS WHEN"0000000001"=>outnum<="0000"outflag<='1' 按下一个键表示输入为0

43、WHEN"0000000010"=>outnum<="0001"outflag<='1' 按下第二个键表示输入为1 WHEN"0000000100"=>outnum<="0010"outflag<='1' 按下第三个键表示输入为2 WHEN"0000001000"=>outnum<="0011"outflag<='1' 按下第四个键表示输入为3 WHEN"00000

44、10000"=>outnum<="0100"outflag<='1' 按下第五个键表示输入为4 WHEN"0000100000"=>outnum<="0101"outflag<='1' 按下第六个键表示输入为5 WHEN"0001000000"=>outnum<="0110"outflag<='1' 按下第七个键表示输入为6 WHEN"0010000000"=>

45、;outnum<="0111"outflag<='1' 按下第八个键表示输入为7 WHEN"0100000000"=>outnum<="1000"outflag<='1' 按下第九个键表示输入为8 WHEN"1000000000"=>outnum<="1001"outflag<='1' 按下第十个键表示输入为9 WHEN OTHERS=>outnum<=outnum;outflag<

46、='0' 不按键时保持 数字按键译码电路的引脚图图:图3-16 数字按键译码电路的引脚图从下图3-17数字按键译码电路的仿真波形中可以看到要得到的结果,也证实了程序的正确性,如输入按键为“0000010000”时,所对应的是第五个按键为高电平,所以应该显示数字再看输出端口输出的数字确实为4,所以此程序正确。其实,这个程序主要实现的是按下什么就输出什么。一共有十个位,初始值都为低电平“0”,当按下哪个位时哪个位上的电平就跳为高电平(有且仅有一个为高电平),这时就有相应的输出。那十个位分别对应的是09这十个数字,所以当第一个位(从左往右位数依次增高)为高电平时显示0,第十个位上位高

47、电平时,相应的显示为9。如果按下的键是加号、减号、乘号、减号或者是等于号时,也是不显示的,所以此程序称为数字按键译码电路。图3-17 数字按键译码电路的仿真波形3.5 计算器显示部分的设计和实现计算器显示部分的设计和实现,实际上就是7段译码器的设计和实现,其VHDL语言描述如下所示。在这段程序中,indata是输入4位二进制数的端口,outdata是输出7位译码的端口,用WITH语句来实现译码。7段译码器的部分VHDL语言描述BEGINWITH indata SELECToutdata<="1111110"WHEN"0000", 0的显示,十六进制

48、数显示为7E "0110000"WHEN"0001", 1的显示,十六进制数显示为30 "1101101"WHEN"0010", 2的显示,十六进制数显示为6D "1111001"WHEN"0011", 3的显示,十六进制数显示为79 "0110011"WHEN"0100", 4的显示,十六进制数显示为33 "1011011"WHEN"0101", 5的显示,十六进制数显示为5B "10

49、11111"WHEN"0110", 6的显示,十六进制数显示为5F "1110000"WHEN"0111", 7的显示,十六进制数显示为70 "1111111"WHEN"1000", 8的显示,十六进制数显示为7E "1111011"WHEN"1001", 9的显示,十六进制数显示为7B "0000000"WHEN OTHERS; 其它的输入按键均不显示7段译码器的引脚图:图3-18 7段译码器的引脚图7段译码器的仿真波形:图

50、3-19 7段译码器的仿真波形输入什么数,就对应地输出什么数。利用7段译码管来显示。7段译码管的基本结构:agbefcd图3-20 7段译码管的基本结构从以上结构图3-19中可以看出,十六进制数7E的二进制数为1111110,也就是说a、b、c、d、e、f的显示管亮起来(“1为灯亮”,“0”为灯不亮),而g显示不亮,即所得数字在数码管(7段译码管)上的显示就是0。以此类推,“0110000”显示的是1,“1101101”显示的是2,“1111001”显示的是3,“0110011”显示的是4,“1011011”显示的是5,“1011111”显示的是6,“1110000”显示的是7,“111111

51、1”显示的是8,“1111011”显示的是9。3.6位二进制数转换成个位、十位、百位的模块这个设计中,使用一个8位二进制寄存器来存放运算结果,因此要将它们显示出来,就得将8位二进制数转换成个位、十位和百位。流程图如下:清零位(c)c=1c=0全部清零取数产生个位上的数产生十位上的数产生百位上的数做相应地减法图3-21 8位二进制数转换成个位、十位、百位的模块的流程图这里使用一个有限状态机来将8位二进制数转换成各位数,每一位数位都使用一个4位二进制数寄存器,百位使用view1,十位使用view2,个位使用view3,00001001分别代表十进制数的09。状态机有4个状态,即:取数状态、产生百位

52、数状态、产生十位数状态和产生个位数状态。以下程序是8位二进制数转换成个位、十位、百位的过程作为一个进程的VHDL语言描述。8位二进制数转换成个位、十位、百位的进程:BEGIN IF c='1'THEN view1<="0000" view2<="0000" view3<="0000" viewstep<=takenum; ELSIF clk'EVENT AND clk='1'THEN CASE viewstep IS WHEN takenum=> ktemp<

53、=keep; viewstep<=hundred; WHEN hundred=> IF ktemp>="11001000"THEN 如果ktemp大于200 view1<="0010"ktemp<=ktemp-"11001000"百位为2,ktemp200 ELSIF ktemp>="01100100"THEN 如果ktemp大于100 view1<="0001"ktemp<=ktemp-"01100100"百位为1,ktemp

54、100 ELSE view1<="0000" 百位为0 END IF; viewstep<=ten; WHEN ten=> 产生十位数字 IF ktemp>="01011010"THEN 当ktemp大于90的时候 view2<="1001"ktemp<=ktemp-"01011010" 十位上赋值为9,ktemp90 ELSIF ktemp>="01010000"THEN 当ktemp大于80时 view2<="1000"ktemp<=ktemp-"01010000" 十位为8,ktemp80 ELSIF ktemp>="01000110"THEN 当ktemp大于70时 view2<="0111"ktemp<=ktemp-"01000110"十位为7,ktemp70 ELSIF ktemp>="0

温馨提示

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

评论

0/150

提交评论