四位二进制加法器与乘法器.docx
- 文档编号:5658814
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:17
- 大小:120.42KB
四位二进制加法器与乘法器.docx
《四位二进制加法器与乘法器.docx》由会员分享,可在线阅读,更多相关《四位二进制加法器与乘法器.docx(17页珍藏版)》请在冰豆网上搜索。
四位二进制加法器与乘法器
1引言
EDA(ElectronicDesignAutomatic)技术的应用引起电子产品及系统开发的革命性变革。
VHDL语言作为可编程逻辑器件的标准语言描述能力强,覆盖面广,抽象能力强,在实际应用中越来越广泛。
1.1设计的目的
本次设计的目的就是在掌握EDA实验开发系统的初步使用基础上,了解EDA技术,了解并掌握VHDL硬件描述语言的设计方法和思想,通过学习的VHDL语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识,学习VHDL基本单元电路的综合设计应用。
通过对四位二进制加法器和四位二进制乘法器的设计,巩固和综合运用所学课程,加深对数字电路和VHDL基本单元的理解,理论联系实际,提高设计能力,提高分析、解决计算机技术实际问题的独立工作能力。
通过课程设计深入理解VHDL语言的精髓,达到课程设计的目标,加法器的设计可以加深对门电路的理解,乘法器的设计可以使对计算机怎样工作有了更深了解。
1.2设计的基本内容
本文是设计的一个四位二进制加法器和四位二进制乘法器。
四位二进制加法器使用门电路构成,用VHDL语言对其实现。
乘法器使用VHDL语言里的乘法运算符实现,使用数码管动态显示一个三位数结果。
然后用VHDL语言编写相应的程序,在计算机上实现,最后进行了加法器和乘法器的仿真分析。
2EDA、VHDL简介
2.1EDA简介
EDA是电子设计自动化(ElectronicDesignAutomation)缩写,是90年代初从CAD(计算机辅助设计)、CAM(计算机辅助制造)、CAT(计算机辅助测试)和CAE(计算机辅助工程)的概念发展而来的。
EDA技术是以计算机为工具,根据硬件描述语言HDL(HardwareDescriptionlanguage)完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线、仿真以及对于特定目标芯片的适配编译和编程下载等工作。
典型的EDA工具中必须包含两个特殊的软件包,即综合器和适配器。
综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形描述,针对给定的硬件系统组件,进行编译、优化、转换和综合,最终获得我们欲实现功能的描述文件。
综合器在工作前,必须给定所要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来。
也就是说,综合器是软件描述与硬件实现的一座桥梁。
综合过程就是将电路的高级语言描述转换低级的、可与目标器件FPGA/CPLD相映射的网表文件。
适配器的功能是将由综合器产生的王表文件配置与指定的目标器件中,产生最终的下载文件,如JED文件。
适配所选定的目标器件(FPGA/CPLD芯片)必须属于在综合器中已指定的目标器件系列。
硬件描述语言HDL是相对于一般的计算机软件语言,如:
C、PASCAL而言的。
HDL语言使用与设计硬件电子系统的计算机语言,它能描述电子系统的逻辑功能、电路结构和连接方式。
设计者可利用HDL程序来描述所希望的电路系统,规定器件结构特征和电路的行为方式;然后利用综合器和适配器将此程序编程能控制FPGA和CPLD内部结构,并实现相应逻辑功能的的门级或更底层的结构网表文件或下载文件。
目前,就FPGA/CPLD开发来说,比较常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL。
2.2硬件描述语言——VHDL
2.2.1VHDL简介
VHDL语言是一种用于电路设计的高级语言。
它在80年代的后期出现。
最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。
但是,由于它在一定程度上满足了当时的设计需求,于是他在1987年成为AI/IEEE的标准(IEEESTD1076-1987)。
1993年更进一步修订,变得更加完备,成为AI/IEEE的AI/IEEESTD1076-1993标准。
目前,大多数的CAD厂商出品的EDA软件都兼容了这种标准。
VHDL的英文全写是:
VHSIC(VeryHigheedIntegratedCircuit)HardwareDescriptiongLanguage.翻译成中文就是超高速集成电路硬件描述语言。
因此它的应用主要是应用在数字电路的设计中。
目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。
当然在一些实力较为雄厚的单位,它也被用来设计ASIC。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
VHDL比其它硬件描述语言相比有以下优点:
(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。
强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。
符合市场需求的大规模系统高效,
高速的完成必须有多人甚至多个代发组共同并行工作才能实现。
(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
2.2.2VHDL语言特点
应用VHDL进行系统设计,有以下几方面的特点。
(一)功能强大
VHDL具有功能强大的语言结构。
它可以用明确的代码描述复杂的控制逻辑设计。
并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。
VHDL是一种设计、仿真和综合的标准硬件描述语言。
(二)可移植性
VHDL语言是一个标准语言,其设计描述可以为不同的EDA工具支持。
它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。
此外,通过更换库再重新综合很容易移植为ASIC设计。
(三)独立性
VHDL的硬件描述与具体的工艺技术和硬件结构无关。
设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。
程序设计的硬件目标器件有广阔的选择范围,可以是各系列的CPLD、FPGA及各种门阵列器件。
(四)可操作性
由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。
(五)灵活性
VHDL最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。
使其在任何大系统的设计中,随时可对设计进行仿真模拟。
所以,即使在远离门级的高层次(即使设计尚未完成时),设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。
3设计规划过程
3.1加法器与乘法器的原理
3.1.1四位二进制加法器的组成原理
加法器是运算电路的核心。
计算机中实现减法、乘法和除法都要最终转化成加法来运算。
本实验才没有用VHDL语言中的加法运算符。
而是用基本门电路来实现的。
一方面可以提高运算速度,另一方面可以使我们加深对数字电路的认识。
图3.1所示是四位二进制加法器的原理框图。
图3.1加法器系统框图
3.1.2四位二进制乘法器的组成原理
本实验学习VHDL中乘法的使用。
在VHDL语言中,一般有c(7downto0)=a(3downto0)*b(3downto0)。
所以4位二进制数的乘积是8位二进制数,为了更符合习惯,我们把结果转化成了十进制。
所以结果范围是0—225,即0—15*15。
本实验采用的三位数在数码管上显示的方法是:
分别确定百位、十位和个位。
送数码管动态显示。
采用与各个数逐一比较的方法确定。
如百位的确定可以将结果与200和100比较,若比200大则百位为2,在100到200之间则百位为1,小于100则百位为0,不显示。
十位的确定可以将结果去掉百位,然后与10,20,….90比较而得。
本文设计的四位二进制乘法器系统框图如图3.2所示。
图3.2乘法器系统框图
3.2加法器与乘法器的设计
四位二进制加法器和乘法器由VHDL实现后,利用EDA工具对各模块进行了时序仿真(TimingSimulation),其目的是通过时序可以更清楚的了解程序的工作过程。
3.2.1加法器的设计
1位全加器的VHDL程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityadd1is--1位全加器
port(a,b:
instd_logic;
cin:
instd_logic;
cout:
outstd_logic;
s:
outstd_logic
);
endadd1;
architecturertlofadd1is
begin
process(a,b,cin)--列举所有情况对应的输出
variabletemp,temp1:
std_logic;
begin
temp:
=axorb;
temp1:
=tempxorcin;
cout<=(tempandcin)or(aandb);
s<=temp1;
endprocess;
endrtl;--以上是对add1的定义
以上是对一位全加器的定义,运用一位全加器构成四位全加器。
其中引脚分配如下:
备注:
cin接地。
四位二进制加法器仿真图如下所示:
仿真分析:
cin为输入信号,表示上一次的进位,b,a为输入信号,表示两个相加的数,s为输出信号,表示本次运算的结果,cout为进位输出信号,表示本次运算的进位,如图所示:
当cin为0,a,b为1时,输出为:
s=0,cout=1,当cin=1,a=1,b=0时,输出为:
s=0,cout=1,当cin=1,a=1,b=1时候,输出为:
s=1,cout=1。
3.2.2乘法器的设计
乘法器的设计用VHDL乘法运算符实现。
在VHDL语言中,一般有c(7downto0)=a(3downto0)*b(3downto0)。
所以4位二进制数的乘积是8位二进制数,为了更符合习惯,我们把结果转化成了十进制。
所以结果范围是0—225,即0—15*15。
本实验采用的三位数在数码管上显示的方法是:
分别确定百位、十位和个位。
送数码管动态显示。
采用与各个数逐一比较的方法确定。
如百位的确定可以将结果与200和100比较,若比200大则百位为2,在100到200之间则百位为1,小于100则百位为0,不显示。
十位的确定可以将结果去掉百位,然后与10,20,….90比较而得。
VHDL语言设计如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitymultiplyis--构造体描述4位乘法器
port(clk:
instd_logic;
a,b:
instd_logic_vector(3downto0);
led_data:
outstd_logic_vector(7downto0);
seg_sel:
outstd_logic_vector(2downto0)
);
endmultiply;
architecturertlofmultiplyis
signalled_data2,led_data1,led_data0:
std_logic_vector(7downto0);--LED显示代码,寄存十位个位的数
signaldisplayclk:
std_logic;
begin
process(a,b)
variables:
std_logic_vector(7downto0);--乘积
variablebai,shiwei,gewei:
std_logic_vector(3downto0);--乘积的十位个位
begin
s(7downto0):
=a(3downto0)*b(3downto0);
ifs>="11001000"thenbai:
="0010";s:
=s-"11001000";--200以上
elsifs>="01100100"thenbai:
="0001";s:
=s-"01100100";--100以上
elsebai:
="0000";
endif;
ifs>="01011010"thenshiwei:
="1001";s:
=s-"01011010";gewei:
=s(3downto0);--90以上
elsifs>="01010000"thenshiwei:
="1000";s:
=s-"01010000";gewei:
=s(3downto0);--80以上
elsifs>="01000110"thenshiwei:
="0111";s:
=s-"01000110";gewei:
=s(3downto0);--70以上
elsifs>="00111100"thenshiwei:
="0110";s:
=s-"00111100";gewei:
=s(3downto0);--60以上
elsifs>="00110010"thenshiwei:
="0101";s:
=s-"00110010";gewei:
=s(3downto0);--50以上
elsifs>="00101000"thenshiwei:
="0100";s:
=s-"00101000";gewei:
=s(3downto0);--40以上
elsifs>="00011110"thenshiwei:
="0011";s:
=s-"00011110";gewei:
=s(3downto0);--30以上
elsifs>="00010100"thenshiwei:
="0010";s:
=s-"00010100";gewei:
=s(3downto0);--20以上
elsifs>="00001010"thenshiwei:
="0001";s:
=s-"00001010";gewei:
=s(3downto0);--10以上
elsegewei:
=s(3downto0);shiwei:
="0000";
endif;
casebaiis
when"0001"=>led_data2<="11111001";
when"0010"=>led_data2<="10100100";
whenothers=>led_data2<="11111111";
endcase;
caseshiweiis
when"0000"=>led_data1<="11000000";
when"0001"=>led_data1<="11111001";
when"0010"=>led_data1<="10100100";
when"0011"=>led_data1<="10110000";
when"0100"=>led_data1<="10011001";
when"0101"=>led_data1<="10010010";
when"0110"=>led_data1<="10000010";
when"0111"=>led_data1<="11111000";
when"1000"=>led_data1<="10000000";
when"1001"=>led_data1<="10010000";
whenothers=>led_data1<="11111111";
endcase;
casegeweiis
when"0000"=>led_data0<="11000000";
when"0001"=>led_data0<="11111001";
when"0010"=>led_data0<="10100100";
when"0011"=>led_data0<="10110000";
when"0100"=>led_data0<="10011001";
when"0101"=>led_data0<="10010010";
when"0110"=>led_data0<="10000010";
when"0111"=>led_data0<="11111000";
when"1000"=>led_data0<="10000000";
when"1001"=>led_data0<="10010000";
whenothers=>led_data0<="11111111";
endcase;
endprocess;
process(clk)
variablecnt:
integerrange0to20000;--1KHZ扫描显示时钟
begin
ifclk'eventandclk='1'thencnt:
=cnt+1;
ifcnt<10000thendisplayclk<='1';
elsifcnt<20000thendisplayclk<='0';
elsecnt:
=0;displayclk<='0';
endif;
endif;
endprocess;
process(displayclk)--显示两位
variablecnt2:
std_logic_vector(1downto0);
begin
ifdisplayclk'eventanddisplayclk='1'thencnt2:
=cnt2+1;
ifcnt2="01"then
seg_sel<="001";
led_data<=led_data0;
elsifcnt2="010"then
seg_sel<="010";
led_data<=led_data1;
elsifcnt2="11"then
cnt2:
="00";
seg_sel<="100";
led_data<=led_data2;
endif;
endif;
endprocess;
endrtl;
实验引脚分配如下:
四位二进制乘法器仿真图如下所示:
仿真分析:
clk为时钟脉冲输入信号,a,b是输出信号表示要参与运算的两个数,
Led_data,seg_set为输出信号,表示计算的结果。
结束语
通过两周的紧张工作,最后完成了我的设计任务——四位二进制加法器和乘法器的设计。
通过本次课程设计的学习,我深深的体会到设计课的重要性和目的性所在。
本次设计课不仅仅培养了我们实际操作能力,也培养了我们灵活运用课本知识完成工作的能力。
加法器和乘法器虽然是比较简单的设计课程,但它给了我一个锻炼的机会和检验的机会,也给我复习计算机组成原理这门课提供了方便。
希望学校以后多安排一些类似的实践环节,让同学们学以致用。
加法器和乘法器的设计让我对门电路更有清楚了解,对VHDL语言也有了一定的了解。
加法器是计算机运算中的重要组成部分,而且是其他运算实现的基础。
在设计中要求我要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,感谢肖晓丽老师耐心的给我指出了错误,让我面对错误的检查有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事设计工作会有一定的帮助。
在应用VHDL的过程中让我真正领会到了其并行运行与其他软件顺序执行的差别及其在电路设计上的优越性。
VHDL语言具有多层次描述系统硬件功能的能力,可以从系统的数学模型直到门级电路,用来进行数字系统的设计方便灵活。
致谢
在此次课程设计中,非常感谢肖晓丽老师对我的指导与大力的帮助。
如果没有她严谨细致、一丝不苟地批阅和指正,本文很难在这个短时间(两周)内完成。
在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意!
参考文献
[1]DavidA.Patterson.计算机组成和设计[M].清华大学出版社,2003年12月
[2]WilliamStallings.计算机组织与结构[M].高等教育出版社,2001年8月
[3]曾繁泰,陈美金.VHDL程序设计[M].清华大学出版社,2001
[4]潘松.VHDL实用教程[M].电子科技大学出版社,2000
[5]王爱英.计算机组成与结构[M].清华大学出版社.2001年2月
附件:
加法器的VHDL语言设计:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityadd1is--1位全加器
port(a,b:
instd_logic;
cin:
instd_logic;
cout:
outstd_logic;
s:
outstd_logic
);
endadd1;
architecturertlofadd1is
begin
process(a,b,cin)--列举所有情况对应的输出
variabletemp,temp1:
std_logic;
begin
temp:
=axorb;
temp1:
=tempxorcin;
cout<=(tempandcin)or(aandb);
s<=temp1;
endprocess;
endrtl;--以上是对add1的定义
libraryieee;--整体组装
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityadder4is--4位全加器
port(a0,a1,a2,a3:
instd_logic;--四位二进制输出
b0,b1,b2,b3:
instd_logic;--四位二进制输出
cin:
instd_logic;--进位输入,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二进制 加法器 乘法器