EDA大作业简易计算器目录EDA大作业简易计算器 (1)目的 (2)任务 (2)内容及步骤 (3)实验设计及实现过程 (3)设计一个1位全加器 (3)设计四位全加器 (4)(1)设计四位加法器 (5)(2)设计可进行加减运算的四位全加器 (6)(3)实现四位全加器的原码输出 (7)设计四位乘法器 (10)(1)设计八位加法器 (10)(2)设计四位乘法器 (11)(3)将乘积结果转化为十进制数 (13)构成简易计算器 (15)下载到实验箱上验证功能 (17)小结与收获 (18)目的1、学习面向可编程器件的FPGA的简单数字系统的设计流程;2、掌握EDA软件Quartus II的原理图输入方式,以及硬件描述语言描述方式;3、熟悉实验装置——实验箱。
任务在可编程逻辑器件上实现一个简易计算器,可以进行4位二进制数的加法和乘法运算,其中被加(乘)数取值范围0~15,加(乘)数取值范围-15~15。
要求用原理图的输入方式及硬件描述语言的结构描述方式完成。
用实验箱上的按键开关模拟输入,用数码管显示十进制计算结果。
内容及步骤1、设计一个1位全加器。
运用波形仿真检查功能正确后,将其封装成1位全加器模块。
2、以1中已封装的1位全加器模块为基础设计一个4位全加器并将其封装成模块,要求:(1) 加数为正时,实现两个4位二进制数与来自低位进位的加法运算,输出显示和及高位进位。
(2) 加数为负时,实现两个4位二进制数的减法运算,输出显示差的原码和正负数标志。
3、以全加器为基础设计一个4位乘法器并封装成乘法器模块,输出显示乘积和正负数标志。
4、以2、3中生成的器件模块为基础构成一个简易计算器,实现如下图功能。
根据S的输入,分别完成Y=A+B或Y=A×B。
5、下载到实验箱上验证功能。
实验设计及实现过程设计一个1位全加器电路图如下:其中A1、B1分别为两个加数,C1为来自低位的进位,S为输出的全加和,C01为向高位的进位。
在Quartus II中构建原理图如下:进行编译后,建立波形文件,功能仿真如下图检查正确无误后,进行全编译,然后将其封装成一位全加器模块,如下图:封装后的一位全加器模块A1、B1分别为两个加数,C1为来自低位的进位,S 为输出的全加和,C01为向高位的进位。
设计四位全加器要实现一个四位全加器,能进行加减法且以原码方式输出结果,分三步进行,流程如下。
具体实现过程如下。
译码(1)设计四位加法器用四个一位全加器的串行接法,即可得到四位串行加法器,实现四位二进制数的加法,用原理图的方式在Quartus II中构建原理图如下:图中A3A2A1A0、B3B2B1B0为两个加数,CO1为来自低位的进位,S3S2S1S0为全加和,CO2为向高位的进位。
先进行半编译,然后建立波形文件,进行功能仿真,结果如下检查正确无误后,进行全编译,然后将其封装成四位加法器模块,如下图:图中A3A2A1A0、B3B2B1B0为两个加数,CO1为来自低位的进位,S3S2S1S0为全加和,CO2为向高位的进位。
(2)设计可进行加减运算的四位全加器在四位全加器电路中增设控制端k,当k=0时,对输入的两数进行加法运算,当k=1时,对输入的两数进行减法运算,并以原码形式输出差值。
思路:将控制端k与加数和低位进位进行异或运算,这样k=1时,异或后得到原加数的反码,低位进位为1,此时被加数和加数的补码相加,得到差的补码,再将补码取反加1后得到差的原码;k=0时,异或后原加数不变,此时被加数和加数相加,进行的是加法运算。
主要通过控制端k的各种异或运算实现,具体电路图如下:其中A3A2A1A0为被加数,B3B2B1B0为加数,k为控制端,当k=0时,进行加法运算,CO1为来自低位的进位,和为Y3Y2Y1Y0,CO为和向高位的进位;当k=1时,进行减法运算,即A3A2A1A0−B3B2B1B0,CO为差的符号,CO=0表示差为正数,差值为Y3Y2Y1Y0,CO=1表示差为负数,差的原码为Y3Y2Y1Y0。
通过半编译后,建立波形文件,进行功能仿真如下图:检查正确无误后,进行全编译,然后将其封装成四位全加器模块,如下图封装后的四位全加器模块其中A3A2A1A0为被加数,B3B2B1B0为加数,k 为控制端,其功能如下:当k=0时,进行加法运算,CO1为来自低位的进位,和为Y3Y2Y1Y0,CO 为和向高位的进位;当k=1时,进行减法运算,即A3A2A1A0− B3B2B1B0, CO 为差的符号,CO=0表示差为正数,差值为Y3Y2Y1Y0,CO=1表示差为负数,差的原码为Y3Y2Y1Y0。
(3)实现四位全加器的原码输出(2)中得到的四位全加器模块,其输出和是二进制原码,要想用数码管显示,需要将其转换成对应的十进制数。
该全加器模块的最大和为30,需用两个数码管显示结果,因此需要将(2)中结果Y3Y2Y1Y0表示成两个十进制的数,符号位CO 接到发光二极管上,用于指示和的正负。
具体思路及实现过程如下。
用Q3Q2Q1Q0、P3P2P1P0分别表示个位和十位的数码管的输入端,SF 为符号位,现在需要找出Q3Q2Q1Q0、P3P2P1P0与Y3Y2Y1Y0及CO 的关系。
首先只考虑将二进制数转化成十进制数,即先不考虑正负数,通过列真值表发现,当CO1Y3Y2Y1Y0表示的十进制数为0~9时,P3P2P1P0=0000,Q3Q2Q1Q0= Y3Y2Y1Y0;当CO1Y3Y2Y1Y0表示的十进制数为10~19时,P3P2P1P0=0001,Q3Q2Q1Q0=Y3Y2Y1Y0+0110;当CO1Y3Y2Y1Y0表示的十进制数为20~29时,P3P2P1P0=0010,Q3Q2Q1Q0=Y3Y2Y1Y0+1100;当CO1Y3Y2Y1Y0表示的十进制数为30~39时,P3P2P1P0=0011,Q3Q2Q1Q0=Y3Y2Y1Y0+0010。
其中CO1、SF与k及CO的关系如下表:因此,CO1= K’ CO,SF= KCO。
由上述知,可以通过一个四位加法器来实现CO1Y3Y2Y1Y0到Q3Q2Q1Q0的变换。
四位全加器的输入端为A3A2A1A0和B3B2B1B0。
将Y3Y2Y1Y0接到B3B2B1B0端,现在求A3A2A1A0与CO1Y3Y2Y1Y0的关系。
通过真值表、卡诺图化简得到:A3= (Y3⨁Y2+ Y3Y1’) CO1A2= CO1(Y3Y2Y1)’+ CO1’ Y3 (Y2+Y1)A1= CO1’ Y3 (Y2+Y1)+ CO1(Y3’Y2’+ Y3Y2 Y1Y0’)A0=0按照此关系连接好电路后,四位加法器的输出端S3S2S1S0即是Q3Q2Q1Q0。
P3P2P1P0与CO1Y3Y2Y1Y0的关系也可类似得到:P3=P2=0P1= CO1(Y3⨁Y2+ Y3(Y1’+Y0’))P0= A1.这样就得到了Q3Q2Q1Q0、P3P2P1P0、SF与Y3Y2Y1Y0及CO的关系。
连接电路图如下:半编译后,建立波形文件,进行功能仿真,波形如下检查正确无误后,进行全编译,然后将其封装成四位译码全加器模块,如下图封装后的四位译码全加器模块其中A3A2A1A0为被加数,B3B2B1B0为加数,k为控制端,CO1为来自低位的进位,k=0时,进行加法运算,k=1时,进行减法运算。
SF为符号位,SF=0表示结果为正数,SF=1表示结果为负数,将Q3Q2Q1Q0、P3P2P1P0分别连到表示个位和十位的数码管上,则数码管既可以显示结果。
如,结果为-13时,SF=1,Q3Q2Q1Q0=0011,P3P2P1P0=0001设计四位乘法器要实现两个四位二进制数的乘法运算,即是实现相乘、移位、相加的功能,为此分三步进行,过程如下。
具体实现过程如下。
(1)设计八位加法器利用2(1)中的四位加法器实现一个八位的串行加法器电路,如下图半编译后,建立波形文件,进行功能仿真结果如下检查正确无误后,进行全编译,然后将其封装成八位加法器模块,如下图封装后的八位加法器模块其中A7A6A5A4A3A2A1A0、B7B6B5B4B3B2B1B0为两个加数,CO1为来自低位的进位,S7S6S5S4S3S2S1S0为和,CO2为向高位的进位。
(2)设计四位乘法器A3A2A1A0为被乘数,B3B2B1B0为乘数,BSF 为乘数的符号位。
思路:将A3A2A1A0分别与B3、B2、B1、B0相乘,得到四个八位二进制数,将这四个八位二进制数相加即得到乘积的结果。
S7S6S5S4S3S2S1S0表示乘积,SF表示乘积的符号。
原理图如下:半编译后,建立波形文件,进行功能仿真,结果如下:检查正确无误后,进行全编译,然后将其封装成四位乘法器模块,如下图全加器的输入端,将A3A2A1A0、B3B2B1B0分别与S ’进行与运算后接到四位乘法器的输入端,最后将加法器和乘法器的对应输出做或运算,作为最终的输出。
这样,S=0时,加法器输出0,乘法器输出两个数的乘积,最终得到的是乘积,即进行了乘法运算;S=1时,乘法器输出0,加法器输出两个数的和,最终得到的是和,即进行了加法运算。
原理图如下半编译后,建立波形文件,进行功能仿真,结果如下:检查正确无误后,进行全编译,然后将其封装成简易计算器模块,如下图A3A2A1A0为被加数(被乘数),B3B2B1B0为加数(乘数),BSF为B3B2B1B0的符号,S 为控制端,将P11P10P9P8、P7P6P5P4、P3P2P1P0分别接到数码管ABC上,SF接到发光二极管上,功能如下:S=0时,ABC显示两个输入的数的乘积,二极管显示符号,发光表示负数,不发光表示正数;S=1时,ABC显示两个输入的数的和,二极管显示符号,发光表示负数,不发光表示正数。
下载到实验箱上验证功能按照上述过程最终得到了简易计算器,在实验室对简易计算器进行管脚锁定后下载到实验箱上,得到了预期的结果,验证过程进行得十分顺利。
验证功能完毕后,助教老师要求我在calculator工程下,新建一个波形文件,只进行7-15的运算(不记得当时要求的是什么运算了,以7-15为例),由于我之前已经建立过波形文件,因此在建立新的波形文件时,我用了默认的文件名Waveform1.vwf,结果仿真出来的波形却不符合要求。
后来我发现了这个错误,将新建的波形名改为calculator.vwf,结果就正确了,如下图所示:从图中看出,A3A2A1A0=0111, B3B2B1B0=1111,BSF=1, S=1,结果为SF=1,P11P10P9P8=0000,P7P6P5P4=0000, P3P2P1P0=1000,即7-15=-8。
通过这个问题的解决,我认识到在进行波形仿真时,每个工程的波形文件名称应该与其工程名称一致,这样才能得到正确的仿真结果,因此,在每个工程下每次只能存在一个波形文件,在建立新的波形文件时,应该将原来的波形文件覆盖。