欢迎来到天天文库
浏览记录
ID:22512672
大小:30.91 KB
页数:20页
时间:2018-10-29
《fpga矩阵讲义》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、选题3实验讲义实验名称:实验名称:基于FPGA的计算器设计1基于VHDL的运算系统设计原理分析本设计是基于VHDL的运算系统设计,目的是为了实现4位BCD码的加、减、乘、除的运算功能。运算时能够通过键盘输入运算类型和运算所需要的数据,然后通过BCD码转二进制电路将数据转化成运算所需要的二进制数,再将数据和运算类型反馈到相应的运算电路得到运算结果,最后将运算结果通过译码电路传送给数码管将结果显示出来。整个设计过程是在QuartusⅡ的环境中进行的,采用自顶向下的设计方法,系统的结构框图如图2-1所示。图2-1系统结构框图2加法器设计为了能够实现4位BCD码的加法运算,设计中被加数和
2、加数都为16位二进制数,由于2个16位二进制数相加可能会产生进位,同时为了方便数码管显示,和采用了20位二进制。此外还有清零信号rst和加法使能信号add,当rst=’1’时对和进行清零,否则当add=‘1’时进行加法运算。3减法器设计为了实现4位BCD码的减法运算,设计中被减数和减数为16位二进制数,差为20位二进制数。输入的信号有清零信号rst、减法使能信号sub、被减数a、减数b,输出的信号有差cha和借位co。由于两个数相减的差有可能为正数也有可能为负数,当差为负数时表现为补码的形式,必须要将负数的补码进行修正,修正时对差的低16位求补码运算,而差的正负用借位co来表示,
3、co=‘1’表示差为负,否则为正。44.1乘法器设计乘法器设计的原理分析乘法运算的方法可以通过以下实例来说明:设被乘数A=1110,乘数B=1101,求A×B。1由以上实际例子可以看出,16位二进制乘法运算可以使用移位相加的方法来实现,被乘数左移16次,乘数右移16次,当时钟上升沿到来时都对乘数的最低位进行判断,如果乘数的最低位为1则乘积加上已经移位的被乘数,否则加0。4.2乘法器电路结构框图根据乘法原理,采用移位相加的办法来实现乘法运算,如图5-1。图5-1乘法器设计结构框图乘法器控制电路设计由于此次设计的是16位二进制乘法器电路,被乘数和乘数必须要移动16次,因此必须要使时钟
4、信号只有16个脉冲。控制电路采用计数的办法,当乘法运算使能信号mul=‘1’时,将计数值cnt16b清零,否则当cnt16b小于16时,cnt16b加1且cp等于clk;否则cp等于0,这样就保证了cp输出只有16个脉冲。关键的VHDL程序如下:process(clk,mul)--描述了一个移位脉冲计数器,产生移位脉冲beginifmul='1'thencnt16b<="00000";elsifclk'eventandclk='1'thenifcnt16b<16thencnt16b<=cnt16b+1;endif;endif;endprocess;process(clk,cnt1
5、6b,mul)beginifmul='0'thenifcnt16b<16thencp<=clk;elsecp<='0';endif;elsecp<=clk;endif;4.2.12endprocess;乘数右移电路设计乘数右移的目的是为了判断乘数的最低位是0还是1,如果为0则乘机加上移位后的被乘数,否则加上0。关键的VHDL程序如下:process(clk,mul)beginifclk'eventandclk='1'thenifmul='1'thenshifter16<=multiplier;--当mul='1'装载入乘数elseshifter16(14downto0)<=shi
6、fter16(15downto1);--将乘数右移一位endif;endif;qb<=shifter16(0);endprocess;4.2.24.2.3被乘数左移电路设计被乘数左移在乘法运算中是必须的,根据乘法运算的原理,当乘数的最低位为‘1’时左移后的被乘数作为加法电路的一个加数。当乘法运算使能信号mul为‘1’时,在被乘数前添加16个0,之后当脉冲到来的时候左移一位。关键的VHDL程序如下:process(mul,clk)beginifmul='1'thenseg8<="0000000000000000"&multiplicand;--当mul='1'在被乘数前添加16个0
7、elsifclk'eventandclk='1'thenseg8(31downto1)<=seg8(30downto0);seg8(0)<='0';endif;endprocess;4.2.4加法电路加法电路负责判断右移后的乘数的最低位是‘0’还是‘1’,如果是‘1’则将乘积和左移后的被乘数相加,否则加0。当乘法运算使能信号mul为‘1’时,乘积初始化为0。关键的VHDL程序如下:process(mul,clk)beginifmul='1'thensum<=(others=>'0
此文档下载收益归作者所有