您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 基于VHDL的8位二进制乘法电路程序
-1-8位二进制乘法电路该乘法器是有由8位加法器构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加。直到所有的部分积都被加过一次。例如:被乘数(M7M6M5M4M3M2M1M0)和乘数(N7N6N5N4N3N2N1N0)分别为11010101和10010011,其计算过程如下:下面分解8位乘法器的层次结构,分为以下4个模块:①右移寄存器模块:这是一个8位右移寄存器,可将乘法运算中的被-2-乘数加载于其中,同时进行乘法运算的移位操作。②加法器模块:这是一个8位加法器,进行操作数的加法运算。③1位乘法器模块:完成8位与1位的乘法运算。④锁存器模块:这是一个16位锁存器,同时也是一个右移寄存器,在时钟信号的控制下完成输入数值的锁存与移位。按照上述算法,可以得到下图所示之框图和简单流程图。图中8位移位寄存器reg_8存放乘数a,从a的最低位开始,每次从reg_8中移出一位,送至1×8位乘法器multi_1中,同时将被乘数加至multi_1中,进行乘法运算,运算的结果再送至8位加法器adder_8中,同时取出16位移位寄存器reg_16的高8位与之进行相加,相加后结果即部分积存入reg_16中,进行移位后并保存。这样经过8次对乘数a的移位操作,所以的部分积已全加至reg_16中,此时锁存器reg_16存放的值即所要求的积。输出结果8位加法器adder_816位移位寄存器reg_16(A)电路框图-3-时钟、清零、移位控制信号,控制移位、清零或锁存乘数a被乘数b1×8位乘法器multi_18位移位寄存器reg_8开始信号到来,置newstart为1寄存器reg_16置0时钟上升沿到来,寄存器reg_8置乘数a时钟下降沿,置newstart为零开始reg_8移出1位后与被乘数放入multi_1中进行乘法运算,结果送至adde_8(B)简单流程图-4-(1)8位移位寄存器reg_8的设计8位移位寄存器是在时钟(r8_clk'eventandr8_clk='1')信号作用下,当r8_load='1'时,将8位乘数加载进入;而当r8_load='0'时,对数据进行移位操作,同时定义一个信号reg8用来装载新数据及移位后的操作数,完成这些操作后,寄存器的最低位reg8(0)传送给r8_out输出。元件实体原理图如右图:reg_16取出高8位送adder_8中,与multi_1得到结果进行加法运算,结果送至reg_16右移后并进行锁存输出每一步的运算结果,即输出reg_16的值,其中第八个值即为求得的积结束r8_clkr8_loadr8_outr8_in[7...0]-5-该模块元件的程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityreg_8is--实体描述port(r8_clk,r8_load:instd_logic;r8_in:instd_logic_vector(7downto0);r8_out:outstd_logic);endreg_8;architecturearc_reg_8ofreg_8is--结构体描述signalreg8:std_logic_vector(7downto0);--定义信号变量beginprocess(r8_clk,r8_load)beginifr8_clk'eventandr8_clk='1'then--时钟上升沿到来ifr8_load='1'then--锁存新数据reg8=r8_in;elsereg_8-6-reg8(6downto0)=reg8(7downto1);--数据右移endif;endif;endprocess;r8_out=reg8(0);--输出最低位endarc_reg_8;仿真波形图如下:(2)8位加法器adder_8的设计I)该加法器由两个四位二进制加法器组成。其中设计四位二进制加法器时,为了避免加法运算时产生溢出,故定义了三个信号量ss,aa,bb,将加数a4_a,a4_b分别与0连接后赋值给aa,bb,形成5位二进制数,然后aa,bb与进位位a4_in相加赋值给ss,最后将ss的低四位赋值给和a4_s,同时将ss的最高位送给a4_out输出。元件实体原理图如右图:其程序如下:libraryieee;a4_ina4_s[3...0]a4_a[3...0]a4_b[3...0]a4_out-7-adder_4useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityadder_4is--实体描述port(a4_in:instd_logic;a4_a,a4_b:instd_logic_vector(3downto0);a4_s:outstd_logic_vector(3downto0);a4_out:outstd_logic);endadder_4;architecturearc_adder_4ofadder_4is--结构体描述signalss:std_logic_vector(4downto0);--定义信号变量signalaa,bb:std_logic_vector(4downto0);beginaa='0'&a4_a;--为避免溢出,将0与a4_a连接bb='0'&a4_b;--将0与a4_b连接ss=aa+bb+a4_in;--执行加法运算a4_s=ss(3downto0);--输出结果a4_out=ss(4);--进位位endarc_adder_4;II)设计8位加法器时,采用例化语句,定义信号量carry_out,将4位加法器U1的a4_out赋给carry_out,再将carry_out的值给4位加-8-法器U2的进位位a4_in,8位加法器的高四位和低四位分别来自四位加法器U1和U2。其连接电路图如下元件实体原理图如右图:其程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityadder_8is--实体描述port(a8_in:instd_logic;a8_a,a8_b:instd_logic_vector(7downto0);a8_s:outstd_logic_vector(7downto0);a8_out:outstd_logic);endadder_8;adder_8a8_ina8_s[7...0]a8_a[7...0]a8_b[7...0]a8_out-9-architecturearc_adder_8ofadder_8is--结构体描述componentadder_4--元件例化,调用4位加法器声明port(a4_in:instd_logic;a4_a,a4_b:instd_logic_vector(3downto0);a4_s:outstd_logic_vector(3downto0);a4_out:outstd_logic);endcomponent;signalcarry_out:std_logic;--定义信号变量beginu1:adder_4--例化语句portmap(a8_in,a8_a(3downto0),a8_b(3downto0),a8_s(3downto0),carry_out);u2:adder_4portmap(carry_out,a8_a(7downto4),a8_b(7downto4),a8_s(7downto4),a8_out);endarc_adder_8;仿真结果如图所示:-10-(3)1位乘法器multi_1的设计利用循环语句FOR-LOOP完成8位二进制数与1位二进制的乘法运算,将8位二进制数m1_y从最低位到最高位与1位二进制m1_x分别做与运算,最后将结果依次送到m1_out输出。即当m1_x为1时,m1_out输出为m1_y;当m1_x为0时,m1_out输出全为零。元件实体原理图如右图:其程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entitymulti_1is--实体描述port(m1_x:instd_logic;m1_y:instd_logic_vector(7downto0);m1_out:outstd_logic_vector(7downto0));multi_1m1_xm1_out[7...0]m1_y[7...0]-11-endmulti_1;architecturearc_multi_1ofmulti_1is--结构体描述beginprocess(m1_x,m1_y)beginforiin0to7loop--循环完成8位与1位的乘法运算m1_out(i)=m1_y(i)andm1_x;endloop;endprocess;endarc_multi_1;其仿真电路图如下:(4)16位移位寄存器reg_16的设计当清零信号(r16_clr='1')到来时,定义信号变量reg16清零;否则在时钟信号r16_clk上升沿到来时,将reg16的低8位进行移位操作,同时将8位的数据输入r16_in锁存到reg16的高8位,最后赋值给r16_out输出。-12-元件实体原理图如右图:其程序如下:useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityreg_16is--实体描述port(r16_clk,r16_clr:instd_logic;r16_in:instd_logic_vector(8downto0);r16_out:outstd_logic_vector(15downto0));endreg_16;architecturearc_reg_16ofreg_16is--结构体描述signalreg16:std_logic_vector(15downto0);--定义信号变量beginprocess(r16_clk,r16_clr)beginifr16_clr='1'then--clr为高电平,清零reg16=0000000000000000;elsifr16_clk'eventandr16_clk='1'then--时钟reg_16r16_clkr16_clrr16_out[15...0]r16_in[8...0]-13-上升沿到来reg16(6downto0)=reg16(7downto1);--右移,并锁存低八位reg16(15downto7)=r16_in;--将输入锁存到高8位endif;endprocess;r16_out=reg16;--数据输出endarc_reg_16;仿真电路图如图所示:(5)8位乘法器的顶层设计元件实体原理图如图:-14-其顶层电路如图:如上图所示,当STAR上升沿到来,将乘数a锁存到REG_8中,同时将16位的移位寄存器REG_16清零,然后随着时钟CLK上升沿的到来,对REG_8中的乘数进行移位操作,最低位在前,由低到高逐位输出。1位乘法器中进行与8位被乘数的相乘运算,并与锁存在16位寄存器reg_16中的高8位进行相加,其和(包
本文标题:基于VHDL的8位二进制乘法电路程序
链接地址:https://www.777doc.com/doc-2535267 .html