选题3基于FPGA的计算器设计.docx
- 文档编号:13769770
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:26
- 大小:234.47KB
选题3基于FPGA的计算器设计.docx
《选题3基于FPGA的计算器设计.docx》由会员分享,可在线阅读,更多相关《选题3基于FPGA的计算器设计.docx(26页珍藏版)》请在冰点文库上搜索。
选题3基于FPGA的计算器设计
选题3实验讲义
实验名称:
基于FPGA的计算器设计
1基于VHDL的运算系统设计原理分析
本设计是基于VHDL的运算系统设计,目的是为了实现4位BCD码的加、减、乘、除的运算功能。
运算时能够通过键盘输入运算类型和运算所需要的数据,然后通过BCD码转二进制电路将数据转化成运算所需要的二进制数,再将数据和运算类型反馈到相应的运算电路得到运算结果,最后将运算结果通过译码电路传送给数码管将结果显示出来。
整个设计过程是在QuartusⅡ的环境中进行的,采用自顶向下的设计方法,系统的结构框图如图2-1所示。
图2-1系统结构框图
2加法器设计
为了能够实现4位BCD码的加法运算,设计中被加数和加数都为16位二进制数,由于2个16位二进制数相加可能会产生进位,同时为了方便数码管显示,和采用了20位二进制。
此外还有清零信号rst和加法使能信号add,当rst=’1’时对和进行清零,否则当add=‘1’时进行加法运算。
3减法器设计
为了实现4位BCD码的减法运算,设计中被减数和减数为16位二进制数,差为20位二进制数。
输入的信号有清零信号rst、减法使能信号sub、被减数a、减数b,输出的信号有差cha和借位co。
由于两个数相减的差有可能为正数也有可能为负数,当差为负数时表现为补码的形式,必须要将负数的补码进行修正,修正时对差的低16位求补码运算,而差的正负用借位co来表示,co=‘1’表示差为负,否则为正。
4乘法器设计
4.1乘法器设计的原理分析
乘法运算的方法可以通过以下实例来说明:
设被乘数A=1110,乘数B=1101,求A×B。
由以上实际例子可以看出,16位二进制乘法运算可以使用移位相加的方法来实现,被乘数左移16次,乘数右移16次,当时钟上升沿到来时都对乘数的最低位进行判断,如果乘数的最低位为1则乘积加上已经移位的被乘数,否则加0。
4.2乘法器电路结构框图
根据乘法原理,采用移位相加的办法来实现乘法运算,如图5-1。
图5-1乘法器设计结构框图
4.2.1乘法器控制电路设计
由于此次设计的是16位二进制乘法器电路,被乘数和乘数必须要移动16次,因此必须要使时钟信号只有16个脉冲。
控制电路采用计数的办法,当乘法运算使能信号mul=‘1’时,将计数值cnt16b清零,否则当cnt16b小于16时,cnt16b加1且cp等于clk;否则cp等于0,这样就保证了cp输出只有16个脉冲。
关键的VHDL程序如下:
process(clk,mul)--描述了一个移位脉冲计数器,产生移位脉冲
begin
ifmul='1'thencnt16b<="00000";
elsifclk'eventandclk='1'then
ifcnt16b<16thencnt16b<=cnt16b+1;endif;
endif;
endprocess;
process(clk,cnt16b,mul)
begin
ifmul='0'then
ifcnt16b<16thencp<=clk;
elsecp<='0';
endif;
elsecp<=clk;
endif;
endprocess;
4.2.2乘数右移电路设计
乘数右移的目的是为了判断乘数的最低位是0还是1,如果为0则乘机加上移位后的被乘数,否则加上0。
关键的VHDL程序如下:
process(clk,mul)
begin
ifclk'eventandclk='1'then
ifmul='1'thenshifter16<=multiplier;--当mul='1'装载入乘数
elseshifter16(14downto0)<=shifter16(15downto1);--将乘数右移一位
endif;
endif;
qb<=shifter16(0);
endprocess;
4.2.3被乘数左移电路设计
被乘数左移在乘法运算中是必须的,根据乘法运算的原理,当乘数的最低位为‘1’时左移后的被乘数作为加法电路的一个加数。
当乘法运算使能信号mul为‘1’时,在被乘数前添加16个0,之后当脉冲到来的时候左移一位。
关键的VHDL程序如下:
process(mul,clk)
begin
ifmul='1'thenseg8<="00000"&multiplicand;--当mul='1'在被乘数前添加16个0
elsifclk'eventandclk='1'then
seg8(31downto1)<=seg8(30downto0);seg8(0)<='0';
endif;
endprocess;
4.2.4加法电路
加法电路负责判断右移后的乘数的最低位是‘0’还是‘1’,如果是‘1’则将乘积和左移后的被乘数相加,否则加0。
当乘法运算使能信号mul为‘1’时,乘积初始化为0。
关键的VHDL程序如下:
process(mul,clk)
begin
ifmul='1'thensum<=(others=>'0');--当mul='1'乘积清零
elsifclk'eventandclk='1'then
ifqb='1'then
sum<=sum+d;
endif;
endif;
endprocess;
4.3乘法器顶层设计
将控制电路、乘数右移电路、被乘数左移电路以及加法电路都打包后,采用原理图的方式将各个模块连接成顶层电路,顶层实体端口定义如图5-2。
图5-2乘法器顶层实体
端口信号说明:
clk:
时钟脉冲
mul:
乘法运算使能信号
a:
被乘数
b:
乘数
product:
乘积
乘法器顶层电路的连接图如图5-3。
图5-3乘法器顶层连接图
4.4波形仿真及结果分析
利用QUARTUSⅡ软件将乘法器电路的顶层电路运行后,进行时序仿真,仿真波形如图5-4。
图5-4乘法运算时序仿真波形
在波形仿真时设置被乘数a=9999,乘数b=998,从波形图可以看出,运算完成时的乘积为9979002这说明运算结果正确。
在mul=1,时候开始进行乘法运算,经过16个脉冲之后得到乘积,综上所述,4位BCD码乘法器电路已经设计完成。
5除法器的设计
5.1除法器设计原理分析
此次设计的16位二进制除法器采用的是比较相减的方法,先在被除数前添加16个0,当时钟脉冲上升沿到来时将前一次高16位与除数比较,若大于或等于则将被除数的高16位减去除数,同时左移并将被除数的第1位置1,若小于则只是将被除数左移,等到下一个脉冲到来时再循环此操作,直到第16个脉冲之后停止操作。
这样进行16个脉冲周期之后,被除数的高16位为余数,低16位为商。
除法运算的原理可以通过以下实例来说明:
设被除数A=1110,除数B=0110,求解A÷B的过程如下:
5.2除法器电路结构框图
根据前面的算法分析,可知除法器设计要用到锁存器和移位寄存器,还有定时器判断运算过程。
设计框图如图6-1。
图6-1除法器电路结构图
除法器电路由控制电路、比较电路、减法电路和移位电路组成。
控制电路负责产生16个脉冲的时钟信号、转载信号、运算结束信号;比较电路则是将被除数的高16位和除数进行比较,若大于或等于则great为‘1’,否则为‘0’;减法电路先判断比较电路输出的great是否为‘1’,若为‘1’则将被除数的高16位和除数相减,否则不进行运算只保存被除数的高16位;移位电路是将被除数进行左移,并对great进行判断,若为‘1’则将被除数的第一位置‘1’。
5.3除法器顶层设计
除法器顶层设计的端口信号定义如图6-2。
图6-2除法器电路顶层实体
信号说明:
clk:
:
系统时钟脉冲
load:
除法运算使能信号(即装载信号)
a:
被除数
b:
除数
q:
商
r:
余数
除法器顶层电路的连接图如图6-3。
图6-3除法器顶层连接图
5.4除法器波形仿真及结果分析
利用QUARTUSⅡ软件将除法器电路的顶层电路运行后,进行时序仿真,仿真波形如图6-4。
图6-4除法器时序仿真波形
在波形仿真时设置被除数a=9999,除数b=534,从波形图可以看出,运算完成时的商q为18,余数r为387,这说明运算结果正确。
在load=1,时候开始进行除法运算,经过16个脉冲之后得到商和余数,综上所述,4位BCD码除法器电路已经设计完成。
6键盘扫描电路设计
6.1矩阵式键盘的原理
矩阵式键盘是一种常见的输入装置,在日常生活中,矩阵式键盘在计算机、电话、手机等各式电子产品上已经被广泛应用[3]。
图7.1是一个4×4矩阵式键盘的面板配置图,其中数字0~9作为各种运算的数字输入键,#为清零功能键,=为运算结果键,+、-、×、÷为运算的选择键。
键盘上的每一个按键其实就是一个开关,每个键都有一个上拉电阻,当某键按下时,该按键的接点会呈现低电平状态,反之,未按下时则呈现高电平状态。
图7-14×4矩阵式键盘的面板配置
6.2扫描电路设计
6.2.1键盘扫描电路原理
对键盘采用0~15计数的方式,输入信号为键盘的列信号,对键盘进行逐行扫描。
扫描键盘的编码方式如图7-2,当没有按下键盘时,键盘输入到按键检测电路col的值均为1,此时key=‘1’;否则当使用者按下键盘按钮时,键盘检测到按键电路col的值为0,此时key=‘0’[4]。
图7-2扫描键盘的编码方式
6.2.2键盘扫描电路组成
键盘扫描电路由键盘扫描计数器电路、键盘检测电路、键盘消抖动电路以及键盘编码电路组成。
6.3键盘扫描计数器电路
时钟信号clk频率为1KHz,按键(key_pressed)为使能信号,当未按下键盘时key_pressed=‘1’,此时由0~15反复计数,并将计数值作为按键检测电路的输入信号,直到按下键key_pressed=‘0’时计数器停止输出计数值。
扫描计数器电路的关键VHDL程序如下:
process(clk,key_pressed)
begin
ifclk'eventandclk='1'then
ifkey_pressed='0'then
q<=q+1;
endif;
endif;
endprocess;
6.4按键检测电路
按键检测电路的输入信号为col和scan_cnt,输出信号为row和key_pressed。
检测电路根据计数值scan_cnt判断row和key_pressed,scan_cnt的低2位用于判断扫描的列,scan_cnt的低2位“00”、“01”、“10”、“11”分别代表第一列、第二列、第三列、第四列;而scan_cnt的高2位“00”、“01”、“10”、“11”分别代表第一行、第二行、第三行、第四行。
按键检测电路的关键VHDL程序如下:
row<="1110"whenscan_cnt(3downto2)="00"else
"1101"whenscan_cnt(3downto2)="01"else
"1011"whenscan_cnt(3downto2)="10"else
0111";
key_pressed<=col(0)whenscan_cnt(1downto0)="00"else
col
(1)whenscan_cnt(1downto0)="01"else
col
(2)whenscan_cnt(1downto0)="10"else
col(3);
6.5消抖动电路
由于键盘的按钮采用机械开关,当按下键盘按钮时,有可能会产生误动作,因此要使用键盘消抖动电路。
此次设计的消抖动电路采用的是倒数计数器电路,将key_pressed作为计数器的输入端,当多次检测到key_pressed=‘0’才判定为按下键盘,否则被认定为没按下键盘。
消抖动电路的关键VHDL程序如下:
process(clk,key_pressed)
variableq:
std_logic_vector(5downto0);
begin
if(key_pressed='1')thenq:
="111111";
elsifclk'eventandclk='1'then
ifq/="00001"thenq:
=q-1;
endif;
endif;
ifq="00010"thenkeyed<='1';
elsekeyed<='0';
endif;
endprocess;
6.6键盘编码电路
将键盘16个键的每个键进行编码,然后按照每个键的编码值译码成实际的数值。
键盘编码表如图7-3所示。
键盘编码电路的关键VHDL程序如下:
process(clk)
begin
ifclk'eventandclk='1'then
casescan_cntis
when"0000"=>code<="0001";--1
when"0001"=>code<="0010";--2
when"0010"=>code<="0011";--3
when"0011"=>code<="1100";--用c代表-键
when"0100"=>code<="0100";--4
when"0101"=>code<="0101";--5
when"0110"=>code<="0110";--6
when"0111"=>code<="1101";--用d代表-键
when"1000"=>code<="0111";--7
when"1001"=>code<="1000";--8
when"1010"=>code<="1001";--9
when"1011"=>code<="1110";--用e代表×键
when"1100"=>code<="1010";--用a代表清零键#
when"1101"=>code<="0000";--0
when"1110"=>code<="1011";--用b代表=键
whenothers=>code<="1111";--用f代表÷键
endcase;
endif;
endprocess;
图7-3键盘编码表
6.7键盘扫描电路顶层设计
将键盘扫描计数器电路、键盘检测电路、键盘消抖动电路以及键盘编码电路各模块连接成的顶层电路的端口信号定义如图7-4。
图7-4键盘扫描电路顶层实体
端口信号说明:
clk:
系统时钟脉冲,频率为1KHz
col:
键盘的列输入
row:
键盘的行输出
keyed:
按键确定信号
code:
键盘的编码值
键盘扫描电路顶层电路的连接图如图7-5。
图7-5键盘扫描顶层连接图
6.8仿真波形及结果分析
利用QUARTUSⅡ软件将键盘扫描电路的顶层电路运行后,进行时序仿真,仿真波形如图7-6。
图7-6键盘扫描电路仿真波形
在波形仿真时设置键盘的列输入col分别为“1110”、“1101”、“1011”、“0111”时,输出的行row的值为“1110”表示此时扫描的是第一行,输出的译码值code分别为1、2、3、C,这与设置的键盘值一致,这说明结果正确。
时钟脉冲clk的频率为1KHz,在时钟脉冲到来时,根据输入的列值,输出当前扫描的行值和当前扫描到的译码值,综上所述,键盘扫描电路已经设计完成。
7控制电路
7.1控制电路的原理
当按下键盘按键时,由键盘扫描电路译码出按下的键值,但是根据通常的运算顺序,先输入一个运算数据,然后输入运算功能键,再输入另一个运算数据,最后才是输入等于号显示运算结果,这就需要一个控制电路,用于控制当输入运算功能键时第一个运算数据输入停止;而输入运算功能键后开始输入第二个运算数据,当输入等于号码时停止输入第二个运算数据;当输入等于号时,开始显示运算结果。
7.2控制电路时序
控制电路关键是对于时序的控制,首先必须先设计一个控制模块用于确定键盘输入的键值是清零键、数据键、还是功能键,然后根据控制模块控制第一个和第二个运算数据输入的使能信号,当检测到数据输入使能信号有效时,必须对输入信号进行左移处理以便储存输入的数据。
第一个和第二个数据输入的使能信号时序如图8-1。
图8-1第一个和第二个数据输入的使能信号时序
7.3控制电路顶层电路设计
控制电路的顶层端口信号定义如图8-2。
图8-2控制电路顶层实体
端口信号说明:
en:
键盘按下使能信号
clk:
时钟脉冲信号
d:
键盘的译码值
a:
第一个运算数据
b:
第二个运算数据
add:
加法运算的使能输出信号
sub:
减法运算的使能输出信号
mul:
乘法运算的使能输出信号
div:
除法运算的使能输出信号
控制电路顶层电路的连接图如图8-3。
图8-3控制电路顶层连接图
7.4控制电路顶层电路仿真波形及结果分析
利用QUARTUSⅡ软件将控制电路的顶层电路运行后,进行时序仿真,仿真波形如图8-4。
图8-4控制电路仿真波形
在波形仿真时,设置键盘译码值d分别为“1010”、“0100”、“0001”、“0010”、“1100”、“1001”、“1000”、“0010”、“1011”、“0101”、“0111”时,可以当看到时钟脉冲clk到来且键盘按下使能信号en=‘1’的条件下,当d=“1010”时,清零信号rst有效,当d=“1100”时,运算功能信号fun有效,当d=“1110”时,显示结果信号result有效,而第一个运算数据a在rst失效且fun有效之前将数据左移,最终得到的数据a=“01100”;第二个运算数据b在fun失效且result有效之前将数据左移,最终得到的数据b=“01011”,与理论上结果一致,这说明结果正确。
当en有效和clk脉冲到来的时候,第一个运算数据arst失效且fun有效之前将数据左移,而在fun有效之后值保持不变;第二个运算数据b在fun失效且result有效之前将数据左移,而在result有效之后值保持不变,综上所述,控制电路已经设计完成。
8BCD码转化为二进制电路设计
8.1BCD码转二进制的原理
经过控制电路输出的两个运算数据是BCD码形式的,而此次设计的加、减、乘、除运算的数据形式都是二进制的,因此必须要将控制电路输出的两个运算数据转化为BCD码。
二进制转化为BCD码的方法是将数据从最左边开始4位组成一组,16位数据可组成4组,然后分别将第1、2、3、4组分别乘以1、10、100、1000后相加便可以得到相应BCD码的十进制表示,而计算机中的十进制数默认用二进制表示,再用修正电路将用二进制表示的十进制补0。
8.2BCD码转二进制的顶层设计
BCD码转化为二进制电路的顶层端口信号定义如图9-1。
图9-1BCD码转二进制电路顶层实体
端口信号说明:
c:
控制电路输出的第一个运算数据的BCD码形式
d:
控制电路输出的第二个运算数据的BCD码形式
a:
第一个运算数据的二进制形式
b:
第二个运算数据的二进制形式
BCD码转化为二进制电路的顶层电路连接图如图9-2。
图9-2BCD码转化为二进制电路顶层连接图
8.3BCD码转二进制电路仿真波形及结果分析
利用QUARTUSⅡ软件将控制电路的顶层电路运行后,进行时序仿真,仿真波形如图9-3。
图8-4BCD码转二进制电路仿真波形
在波形仿真时设置第一个运算数据c=10101(255的BCD码形式),第二个运算数据d=10101(15的BCD码形式),从波形图可以看出,第一个运算数据a=255,第二个运算数据b=15,这说明运算结果正确。
16位BCD码在分为四位一组后分别乘以BCD相应的权后相加就可以得到该BCD码的十进制数,综上所述,BCD码转化为二进制电路已经设计完成。
9二进制转化为BCD码电路设计
由于加法、减法、乘法、除法电路输出的结果都是二进制形式的,并且数码管显示需要的数据是BCD码形式的,因此要把运算结果通过数码管显示出来,必须先将运算结果转化为BCD码。
9.1二进制转化为十进制电路
二进制不能直接转化为BCD码,所以通过VHDL语言中的con_integer语句将二进制数转化为十进制,转化成的十进制数在软件中将会以二进制的形式表示出来,但是表示的二进制数不一定是要求的位数,因此需要将转化后的数进行修正,即在前面添加0来实现。
以加法运算的和转化为十进制数为例,顶层端口定义如图10-1。
图10-1加法运算二进制和转化成十进制数电路顶层实体
端口信号说明:
sum:
加法运算输出的和
result:
运算结果显示使能信号
sum_display:
将和转化成十进制后的输出信号
加法运算的和转化成十进制数电路其连接电路图如10-2。
图10-2加法运算二进制和转化成十进制数电路连接图
加法运算二进制和转化成十进制数的关键VHDL程序如下:
architectureoneofadder_bin_ten1is
begin
process(result)
begin
ifresult='1'then
d<=conv_integer(din);
endif;
endprocess;
end;
9.2十进制转化成BCD码电路
将十进制转化成BCD码比较容易实现,由于先前已经将二进制数转化成了十进制数,而VHDL支持整数除法,所以可以将十进制数通过除以10、100、1000……来获得各个位数上的值。
以加法运算的十进制数转化为BCD码为例,顶层端口定义如图10-3。
图10-3加法运算十进制数转化成BCD码电路顶层实体
端口信号说明:
a:
二进制转化为十进制后的数
d1:
个位数
d2:
十位数
d3:
百位数
d4:
千位数
d5:
万位数
加法运算的十进制数转化为BCD码的关键VHDL程序如下:
architectureoneofadder_ten_bcdis
signalb:
integer;
signalb1,b2,b3,b4,b5:
integer;
begin
process(a)
begin
b<=conv_integer(a);
b5<=b/10000;--万位
b4<=(b-b1*10000)/1000;--千位
b3<=(b-b1*10000-b2*1000)/100;--百位
b2<=(b-b1*10000-b2*1000-b1*100)/10;--十位
b1<=b-b1*10000-b2*1000-b1*100-b2*10;--个位
endprocess;
d1<=b1;
d2<=b2;
d3<=b3;
d4<=b4;
d5<=b5;
end;
9.3二进制转化为BCD码顶层电路设计
将二进制转化为十进制电路和十进制转化为BCD码电路连接成顶层电路,这样就可以实现将二进制转化为数码管显示所需要的BCD码。
各运算电路二进制结果转化成BCD码都采用这个原理来实现,以加法运算的二进制转BCD码为例,顶层端口定义如图10-4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 选题 基于 FPGA 计算器 设计