课程名称电子设计自动化题目十六位硬件乘法器电路院系班级信息学院11电子信息工程A班姓名学号指导老师凌朝东2013 年 12 月 5 日题目名称:十六位硬件乘法器电路摘要:设计一个16位硬件乘法器电路.要求2位十进制乘法,能用LED数码管同时显示乘数,被乘数和积的值.本设计利用Quartus II软件为设计平台,通过移位相加的乘法原理:即从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
经软件仿真和硬件测试验证后,以达到实验要求。
目录1.题目名称 (2)2.摘要 (2)3.目录 (3)4.正文 (4)4.1. 系统设计 (4)4.1 设计要求 (4)4.2 系统设计方案 (4)4.2 单元电路设计 (4)4.2.1十进制计算模块 (5)4.2.2 BCD码转二进制模块 (5)4.2.3 8位右移寄存器模块 (6)4.2.4 8位加法器模块 (7)4.2.5 1乘法器multi_1模块 (7)4.2.6 16位移位寄存器reg_16模块 (8)4.2.7 16位二进制转BCD码B_BCD模块 (9)4.2.8 8位乘法器multi_8x8顶层设计 (10)4.3 软件设计 (12)4.3.1设计平台和开发工具 (12)4.3.2程序流程方框图 (13)4.4 系统测试 (14)4.1仿真分析 (14)4.2硬件验证 (15)5. 结论 (15)6. 参考文献 (15)7. 附录 (15)4.正文4.1系统设计1.1设计要求题目要求设计一个16位硬件乘法器电路.要求2位十进制乘法;能用LED数码管同时显示乘数,被乘数和积的信息.设置一个乘法使能端,控制乘法器的计算和输出.1.2系统设计方案此设计问题可分为乘数和被乘数输入控制模块,乘法模块和输出乘积显示模块基本分.乘数和被乘数的输入模块使输入的十进制数转化为二进制数输入乘法模块,乘法模块利用移位相加的方法将输入的两组二进制数进行相乘,并将16位乘积输出到乘积输出显示模块.显示模块将输入的二进制数按千,百,十,个位分别转化为十进制数输出.乘数和被乘数的输入可用数据开关K1~K10分别代表数字1,2,…,9,0,用编码器对数据开关K1~K10的电平信号进行编码后输入乘法器进行计算.但此方案所用硬件资源较多,输入繁琐,故不采取.方案二是利用硬件箱自带16进制码发生器,由对应的键控制输出4位2进制构成的1位16进制码,数的范围是0000~1111,即0H~FH.每按键一次,输出递增1,输出进入目标芯片的4位2进制数将显示在该键对应的数码管.乘数和被乘数的输入模块将16进制码的A~F码设计成输出为null.使得减少了无用码的输入.两数相乘的方法很多,可以用移位相加的方法,也可以将乘法器看成计数器,乘积的初始值为零,每一个时钟周期将乘数的值加到积上,同时乘数减一,这样反复执行,直到乘数为零.本设计利用移位相加的方法使得程序大大简化.系统总体电路组成原理图如下图所示:4.2单元电路设计下面分解8位乘法器的层次结构,分为以下7个模块:1. 十进制计算模块:使用4个十进制计数模块,输入乘数的十位个位,被乘数的十位个位。
2. BCD码转二进制模块:实现将输入的8位BCD码转化成二进制3. 右移寄存器模块:这是一个8位右移寄存器,可将乘法运算中的被乘数加载于其中,同时进行乘法运算的移位操作。
4. 加法器模块:这是一个8位加法器,进行操作数的加法运算。
5. 1位乘法器模块:完成8位与1位的乘法运算。
6. 锁存器模块:这是一个16位锁存器,同时也是一个右移寄存器,在时钟信号的控制下完成输入数值的锁存与移位。
7. 二进制转BCD码模块:将16位寄存器的值(积)转化成BCD码,配合数码管显示4.2.1 十进制加计数器设计十进制计数器在每个时钟来临时计数,clk=1时清零,用于输入乘数,被乘数的个位,十位Library ieee; --0到9计数器Use ieee.std_logic_unsigned.all;Use ieee.std_logic_1164.all;Entity cnt10 isPort (clk,clr: in std_logic;q: out std_logic_vector(3 downto 0));end cnt10;architecture behav of cnt10 isbeginprocess(clk,clr)variable cqi: std_logic_vector(3 downto 0);beginif clr='1' then cqi:="0000";elsif clk'event and clk='1' thenif cqi=9 then cqi:="0000";else cqi:=cqi+1;end if;end if;q<=cqi;end process;end behav;4.2.2 BCD码转二进制码BCD_B的设计将十进制计数器产生的十位和个位合并后,为BCD码,而计算时使用二进制码计算,所以采用该模块来转化Library ieee; --(0到99)BCD码转二进制码Use ieee.std_logic_unsigned.all;Use ieee.std_logic_1164.all;Entity BCD_B isPort ( a: in std_logic_vector(7 downto 0);q: out std_logic_vector(7 downto 0));end BCD_B;architecture behav of BCD_B issignal a1,a2,a3,a4,cq: std_logic_vector(7 downto 0);beginprocess(a)begina1<="0000"&a(3 downto 0);a2<="0000"&a(7 downto 4);a3<=a2(6 downto 0)&'0';a4<=a2(4 downto 0)&"000";cq<=a4+a3+a1;q<=cq;end process;end behav;4.2.3 8位移位寄存器reg_8的设计8位移位寄存器是在时钟(r8_clk'event and r8_clk='1')信号作用下,当r8_load='1'时,将8位乘数加载进入;而当r8_load='0'时,对数据进行移位操作,同时定义一个信号reg8用来装载新数据及移位后的操作数,完成这些操作后,寄存器的最低位reg8(0)传送给r8_out输出。
library ieee; ---8位移位寄存器use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity reg_8 isport(r8_clk,clr,r8_load:in std_logic;r8_in:in std_logic_vector(7 downto 0);r8_out:out std_logic);end reg_8;architecture arc_reg_8 of reg_8 issignal reg8:std_logic_vector(7 downto 0);beginprocess(r8_clk,clr,r8_load)beginif clr='1'thenreg8<="00000000";elsif r8_clk'event and r8_clk='1' thenif r8_load='1' thenreg8<=r8_in;elsereg8(6 downto 0)<=reg8(7 downto 1);end if;end if;end process;r8_out<=reg8(0);end arc_reg_8;4.2.4 8位加法器adder_8的设计该加法器由八位二进制加法器组成。
其中设计八位二进制加法器时,为了避免加法运算时产生溢出,故定义了三个信号量ss,aa,bb,将加数a8_a,a8_b分别与0连接后赋值给aa,bb,形成9位二进制数,然后aa,bb相加赋值给ss,最后将ss的低八位赋值给和a8_s,同时将ss的最高位送给a8_out输出。
library ieee; --8位加法器use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity adder_8 isport(a8_a,a8_b:in std_logic_vector(7 downto 0);a8_s:out std_logic_vector(7 downto 0);a8_out:out std_logic);end adder_8;architecture arc_adder_8 of adder_8 issignal ss:std_logic_vector(8 downto 0);signal aa,bb:std_logic_vector(8 downto 0);beginaa<='0'&a8_a; bb<='0'&a8_b; ss<=aa+bb;a8_s<=ss(7 downto 0);a8_out<=ss(8);end arc_adder_8;4.2.5 1位乘法器multi_1的设计利用if语句来完成8位二进制数与1位二进制的乘法运算,最后将结果送到m1_out输出。
即当m1_x为1时,m1_out输出为m1_y;当m1_x为0时,m1_out输出全为零。
library ieee; --1位乘法器use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity multi_1 isport(m1_x:in std_logic;m1_y:in std_logic_vector(7 downto 0);m1_out:out std_logic_vector(7 downto 0));end multi_1;architecture arc_multi_1 of multi_1 isbeginprocess(m1_x,m1_y)beginif m1_x='1' then m1_out<=m1_y;else m1_out<="00000000";end if;end process;end arc_multi_1;4.2.6 16位移位寄存器reg_16的设计当清零信号(clr='1')到来时,定义信号变量reg_16归零;信号(r16_clr='1')到来时,定义信号变量reg16清零;否则在时钟信号r16_clk上升沿到来时,将reg16的低8位进行移位操作,同时将8位的数据输入r16_in锁存到reg16的高8位,最后赋值给r16_out输出,cout控制位输出1。