• / 11
  • 下载费用:10 金币  

基于(VHDL)的8位二进制乘法电路程序.doc

关 键 词:
基于(VHDL)的8位二进制乘法电路程序.doc
资源描述:
- 1 -8 位二进制乘法电路该乘法器是有由 8 位加法器构成的以时序方式设计的 8 位乘法器,采用逐项移位相加的方法来实现相乘。用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加。直到所有的部分积都被加过一次。例如:被乘数(M7M6M5M4M3M2M1M0)和乘数(N7N6N5N4N3N2N1N0)分别为11010101 和 10010011,其计算过程如下:下面分解 8 位乘法器的层次结构,分为以下 4 个模块:①右移寄存器模块:这是一个 8 位右移寄存器,可将乘法运算中的被乘数加载于其中,同时进行乘法运算的移位操作。②加法器模块:这是一个 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 中,此时锁存器- 2 -reg_16 存放的值即所要求的积。时钟、清零、移位控制信号,控制移位、清零或锁存乘数 a被乘数 b输出结果1×8 位乘法器 multi_18 位加法器adder_88 位移位寄存器 reg_816 位移位寄存器 reg_16开始信号到来,置 newstart 为 1寄存器 reg_16 置 0时钟上升沿到来,寄存器 reg_8 置乘数 a时钟下降沿,置 newstart 为零开始reg_8 移出 1 位后与被乘数放入 multi_1中进行乘法运算,结果送至 adde_8reg_16 取出高 8 位送 adder_8 中,与 multi_1 得到结果进行加法运算,结果送至 reg_16 右移后并进行锁存输出每一步的运算结果,即输出reg_16 的值,其中第八个值即为求得的积结束(A)电路框图(B)简单流程图- 3 -(1)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;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity reg_8 is --实体描述port(r8_clk,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 is --结构体描述signal reg8:std_logic_vector(7 downto 0); --定义信号变量begin process(r8_clk,r8_load)beginif r8_clk'event and r8_clk='1' then --时钟上升沿到来if r8_load='1' then --锁存新数据reg8=r8_in;else reg8(6 downto 0)=reg8(7 downto 1); --数据右移end if;end if;end process;r8_out=reg8(0); --输出最低位end arc_reg_8;仿真波形图如下:reg_8r8_clkr8_load r8_outr8_in[7.0]- 4 -adder_4(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 输出。元件实体原理图如右图:其程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity adder_4 is --实体描述port(a4_in :in std_logic;a4_a,a4_b:in std_logic_vector(3 downto 0);a4_s:out std_logic_vector(3 downto 0);a4_out:out std_logic);end adder_4;architecture arc_adder_4 of adder_4 is --结构体描述signal ss:std_logic_vector(4 downto 0); --定义信号变量signal aa,bb:std_logic_vector(4 downto 0);beginaa='0' --为避免溢出,将 0 与 a4_a 连接bb='0' --将 0 与 a4_b 连接ss=aa+bb+a4_in; --执行加法运算a4_s=ss(3 downto 0); --输出结果a4_out=ss(4); --进位位end arc_adder_4;II)设计 8 位加法器时,采用例化语句,定义信号量 carry_out,将 4 位加法器U1 的 a4_out 赋给 carry_out,再将 carry_out 的值给 4 位加法器 U2 的进位位a4_in,8 位加法器的高四位和低四位分别来自四位加法器 U1 和 U2。其连接电路图如下a4_in a4_s[3.0]a4_a[3.0] a4_b[3.0] a4_out- 5 -元件实体原理图如右图:其程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity adder_8 is --实体描述port(a8_in :in std_logic;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 is --结构体描述component adder_4 --元件例化,调用 4 位加法器声明port(a4_in :in std_logic;a4_a,a4_b:in std_logic_vector(3 downto 0);a4_s:out std_logic_vector(3 downto 0);a4_out:out std_logic);end component;signal carry_out:std_logic; --定义信号变量beginu1:adder_4 --例化语句port map(a8_in,a8_a(3 downto 0),a8_b(3 downto 0),a8_s(3 downto 0),carry_out);u2:adder_4port map(carry_out,a8_a(7 downto 4),a8_b(7 downto 4),a8_s(7 downto 4),a8_out);adder_8a8_in a8_s[7.0]a8_a[7.0] a8_b[7.0] a8_out- 6 -end arc_adder_8; 仿真结果如图所示:(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 输出全为零。元件实体原理图如右图:其程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity multi_1 is --实体描述port(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 is --结构体描述begin process(m1_x,m1_y)beginfor i in 0 to 7 loop --循环完成 8 位与 1 位的乘法运算m1_out(i)=m1_y(i)and m1_x;end loop;end process;end arc_multi_1;其仿真电路图如下:multi_1m1_x m1_out[7.0] m1_y[7.0] - 7 -(4)16 位移位寄存器 reg_16 的设计当清零信号(r16_clr='1')到来时,定义信号变量 reg16 清零;否则在时钟信号 r16_clk 上升沿到来时,将 reg16 的低 8 位进行移位操作,同时将 8 位的数据输入 r16_in 锁存到 reg16 的高 8 位,最后赋值给 r16_out 输出。元件实体原理图如右图:其程序如下:use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity reg_16 is --实体描述port(r16_clk,r16_clr:in std_logic;r16_in:in std_logic_vector(8 downto 0);r16_out:out std_logic_vector(15 downto 0));end reg_16;architecture arc_reg_16 of reg_16 is --结构体描述signal reg16:std_logic_vector(15 downto 0); --定义信号变量begin process(r16_clk,r16_clr)beginif r16_clr='1' then --clr 为高电平,清零reg16=“0000000000000000“;elsif r16_clk'event and r16_clk='1' then --时钟上升沿到来reg16(6 downto 0)=reg16(7 downto 1); --右移,并锁存低八位reg16(15 downto 7)=r16_in; --将输入锁存到高 8 位end if;end process;r16_out=reg16; --数据输出end arc_reg_16;仿真电路图如图所示:reg_16r16_clk r16_clr r16_out[15.0] r16_in[8.0] - 8 -(5)8 位乘法器的顶层设计元件实体原理图如图:其顶层电路如图:如上图所示,当 STAR 上升沿到来,将乘数 a 锁存到 REG_8 中,同时将 16位的移位寄存器 REG_16 清零,然后随着时钟 CLK 上升沿的到来,对 REG_8 中的乘数进行移位操作,最低位在前,由低到高逐位输出。1 位乘法器中进行与 8 位被乘数的相乘运算,并与锁存在 16 位寄存器 reg_16 中的高 8 位进行相加,其和(包含进位)在下一个时钟的上升沿到来时锁存到 16 位寄存器中。如此进行直到第八个时钟上升沿到来时,reg_16 的输出即为所求的乘积。- 9 -其顶层程序如下:use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity multi_8 is --实体描述port(clk,start:in std_logic;a,b:in std_logic_vector(7 downto 0);result:out std_logic_vector(15 downto 0));end multi_8;architecture arc_multi_8 of multi_8 is --结构体描述component multi_1 --调用 1 位乘法器声明port(m1_x:in std_logic;m1_y:in std_logic_vector(7 downto 0);m1_out:out std_logic_vector(7 downto 0));end component;component adder_8 --调用 8 位加法器声明port(a8_in :in std_logic;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 component;component reg_8 --调用 8 位寄存器声明port(r8_clk,r8_load:in std_logic;r8_in:in std_logic_vector(7 downto 0);r8_out:out std_logic);end component;component reg_16 --调用 16 位寄存器声明port(r16_clk,r16_clr:in std_logic;r16_in:in std_logic_vector(8 downto 0);r16_out:out std_logic_vector(15 downto 0));end component;signal gndint,newstart,qb:std_logic; --定义信号变量signal andsd:std_logic_vector(7 downto 0);signal dtbin:std_logic_vector(8 downto 0);signal dtbout:std_logic_vector(15 downto 0);begin result=dtbout;gndint='0';process(clk,start)- 10 -beginif start='1' then newstart='1';elsif clk='0' then newstart='0';end if;end process;u1:reg_8 --例化语句port map(clk,newstart,a,qb);u2:multi_1port map(qb,b,andsd);u3:adder_8port map(gndint,dtbout(15 downto 8),andsd,dtbin(7 downto 0),dtbin(8));u4:reg_16port map(clk,newstart,dtbin,dtbout);end arc_multi_8;仿真波形如图所示:输出波形分析:输入时,置被乘数为 b=D5H=1101 0101,置乘数 a=93H=1001 0011当 START 信号时钟上升沿到来,result 输出为:0000 0000 0000 0000 - 11 -0000=0000H同时将乘数 a 锁存至 8 位寄存器 reg_8 中当第一个时钟上升沿到来,reg_8 输出 a 的最低位 1 与被乘数 a 送至 1 位乘法器进行乘法运算,得到结果:1101 0101 与 16 寄存器 reg_16 的高 8 位,此时即0000 0000 送入 8 位加法器进行相加,得到结果即:0 1101 0101,送入reg_16 并通过 reg_16 进行低 8 位移位后对输入进行锁存,即输出结果 result 为:0110 1010 1000 0000=6A80H当第二个时钟上升沿到来,reg_8 输出 a 的第二低位 1,与被乘数 a 送至 1 位乘法器进行乘法运算,得到结果:1101 0101 与 16 寄存器 reg_16 的高 8 位,此时即 0110 1010 送入 8 位加法器进行相加,得到结果即:1 0011 1111,送入reg_16 并通过 reg_16 进行低 8 位移位后对输入进行锁存,即输出结果 result 为:1001 1111 1100 0000=9FC0H同理,我们可以得到接下来 3~7 个时钟上升沿到来移位相加后放至 reg_16 中移位锁存的结果:4FE0H 27F0H 7E78H 3F3CH 1F9EH 而当第 8 个时钟上升沿到来时,其最终的结果为:7A4FH,即为所要求的 a,b 的乘积
展开阅读全文
  微传网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:基于(VHDL)的8位二进制乘法电路程序.doc
链接地址:https://www.weizhuannet.com/p-10031956.html
微传网是一个办公文档、学习资料下载的在线文档分享平台!

网站资源均来自网络,如有侵权,请联系客服删除!

 网站客服QQ:80879498  会员QQ群:727456886

copyright@ 2018-2028 微传网络工作室版权所有

     经营许可证编号:冀ICP备18006529号-1 ,公安局备案号:13028102000124

收起
展开