文档介绍:选题3 实验讲义
实验名称:基于FPGA的计算器设计
基于VHDL的运算系统设计原理分析
本设计是基于VHDL的运算系统设计,目的是为了实现4位BCD码的加、减、乘、除的运算功能。运算时能够通过键盘输入运算类型和运算所需要的数据,然后通过BCD码转二进制电路将数据转化成运算所需要的二进制数,再将数据和运算类型反馈到相应的运算电路得到运算结果,最后将运算结果通过译码电路传送给数码管将结果显示出来。
整个设计过程是在Quartus Ⅱ的环境中进行的,采用自顶向下的设计方法,系统的结构框图如图2-1所示。
图2-1 系统结构框图
加法器设计
为了能够实现4位BCD码的加法运算,设计中被加数和加数都为16位二进制数,由于2个16位二进制数相加可能会产生进位,同时为了方便数码管显示,和采用了20位二进制。此外还有清零信号rst和加法使能信号add,当rst=’1’时对和进行清零,否则当add=‘1’时进行加法运算。
减法器设计
为了实现4位BCD码的减法运算,设计中被减数和减数为16位二进制数,差为20位二进制数。
输入的信号有清零信号rst、减法使能信号sub、被减数a、减数b,输出的信号有差cha和借位co。由于两个数相减的差有可能为正数也有可能为负数,当差为负数时表现为补码的形式,必须要将负数的补码进行修正,修正时对差的低16位求补码运算,而差的正负用借位co来表示,co=‘1’表示差为负,否则为正。
乘法器设计
乘法器设计的原理分析
乘法运算的方法可以通过以下实例来说明:
设被乘数A=1110,乘数B=1101,求A×B。
由以上实际例子可以看出,16位二进制乘法运算可以使用移位相加的方法来实现,被乘数左移16次,乘数右移16次,当时钟上升沿到来时都对乘数的最低位进行判断,如果乘数的最低位为1则乘积加上已经移位的被乘数,否则加0。
乘法器电路结构框图
根据乘法原理,采用移位相加的办法来实现乘法运算,如图5-1。
图5-1 乘法器设计结构框图
乘法器控制电路设计
由于此次设计的是16位二进制乘法器电路,被乘数和乘数必须要移动16次,因此必须要使时钟信号只有16个脉冲。控制电路采用计数的办法,当乘法运算使能信号mul=‘1’时,t16b清零,t16b加1且cp等于clk;否则cp等于0,这样就保证了cp输出只有16个脉冲。关键的VHDL程序如下:
process(clk,mul)--描述了一个移位脉冲计数器,产生移位脉冲
begin
if mul='1' t16b<="00000";
elsif clk'event and clk='1' then
t16b<16 t16b<=cnt16b+1; end if;
end if;
end process;
process(t16b,mul)
begin
if mul='0' then
t16b<16 then cp<=clk;
else cp<='0';
end if;
else cp<=clk;
end if;
end process;
乘数右移电路设计
乘数右移的目的是为了判断乘数的最低位是0还是1,如果为0则乘机加上移位后的被乘数,否则加上0。关键的VHDL程序如下:
process(clk,mul)
begin
if clk'event and clk='1' then
if mul='1' then shifter16<=multiplier;--当 mul='1'装载入乘数
else shifter16(14 downto 0)<=shifter16(15 downto 1);--将乘数右移一位
end if;
end if;
qb<=shifter16(0);
end process;
被乘数左移电路设计
被乘数左移在乘法运算中是必须的,根据乘法运算的原理,当乘数的最低位为‘1’时左移后的被乘数作为加法电路的一个加数。当乘法运算使能信号mul为‘1’时,在被乘数前添加16个0,之后当脉冲到来的时候左移一位。关键的VHDL程序如下:
process(mul,clk)
begin
if mul='1' then seg8<="0000000000000000"&multiplicand;--当mul='1'在被乘数前添加16个0
elsif clk'event and clk='1' then
seg8(31 downto 1)<=seg8(30 downto 0); seg8(0)<='0';
end if;
end process;
加法电路
加法电路负责判断右移后的乘数的最低位是‘0’还是‘1’,如果