(VHDL)8位二进制乘法器电路程序

  • 格式:pdf
  • 大小:182.64 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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中,此时锁存器reg_16存放的值即所要求的积。

(1)8位移位寄存器reg_8的设计

(A )电路框图

(B

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_8is --实体描述port(r8_clk,r8_load:in std_logic;

r8_in:in std_logic_vector(7downto 0);r8_out:out std_logic);

end reg_8;

architecture arc_reg_8of reg_8is --结构体描述signal reg8:std_logic_vector(7downto 0);--定义信号变量begin

process(r8_clk,r8_load)begin

if r8_clk'event and r8_clk='1'then --时钟上升沿到来

if r8_load='1'then --锁存新数据

reg8<=r8_in;else

reg8(6downto 0)<=reg8(7downto 1);--数据右移end if;end if;end process;r8_out<=reg8(0);--输出最低位end arc_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 输出。元件实体原理图如右图:其程序如下:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;entity adder_4is --实体描述

port(a4_in :in std_logic;

a4_a,a4_b:in std_logic_vector(3downto 0);a4_s:out std_logic_vector(3downto 0);a4_out:out std_logic);

end adder_4;

architecture arc_adder_4of adder_4is --结构体描述

signal ss:std_logic_vector(4downto 0);--定义信号变量signal aa,bb:std_logic_vector(4downto 0);begin

aa<='0'&a4_a;--为避免溢出,将0与a4_a 连接bb<='0'&a4_b;--将0与a4_b 连接ss<=aa+bb+a4_in;--执行加法运算a4_s<=ss(3downto 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。其连接电路图如下

其程序如下:library ieee;

use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity adder_8is --实体描述port(a8_in :in std_logic;

a8_a,a8_b:in std_logic_vector(7downto 0);a8_s:out std_logic_vector(7downto 0);a8_out:out std_logic);

end adder_8;

architecture arc_adder_8of adder_8is --结构体描述component adder_4--元件例化,调用4位加法器声明port(a4_in :in std_logic;

a4_a,a4_b:in std_logic_vector(3downto 0);a4_s:out std_logic_vector(3downto 0);a4_out:out std_logic);end component;

signal carry_out:std_logic;--定义信号变量begin

u1:adder_4--例化语句

port map(a8_in,a8_a(3downto 0),a8_b(3downto 0),a8_s(3downto 0),carry_out);u2:adder_4

port map(carry_out,a8_a(7downto 4),a8_b(7downto 4),a8_s(7downto 4),a8_out);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 输出全为零。