移位相加乘法器

  • 格式:doc
  • 大小:142.05 KB
  • 文档页数:6

下载文档原格式

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

设计一个8位二进制乘法电路,采用移位相加的方法实现八位二进制数相乘。

二、 设计思路与实现方案:

1.设计思路: 8位二进制乘法采用移位相加的方法。即用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加。直到所有的部分积都被加过一次。

2.实现方案:

图一: 乘法器原理框图

图二:设计流程图

start

锁存器清零 控制器置被乘数A 移位寄存器置乘数B 将控制器设定为8位循环计数 将B 右移一位判断是否为1 将A 与锁存器高八位相加后在下个时钟送到锁存器 end 输出积P

是否计到八个时钟周期

YES NO

模块一:8位右移寄存器:

源程序:library ieee;

use ieee.std_logic_1164.all;

entity sreg8b is

port(clk:IN STD_LOGIC; LOAD:IN STD_LOGIC;

din:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

qb:out std_logic);

end sreg8b;

architecture behave of sreg8b is

signal reg8:std_logic_vector(7 downto 0);

begin

process(clk,load)

begin

if load='1'then reg8<=din;

elsif clk'event and clk='1'then

reg8(6 downto 0 )<=reg8(7 downto 1);

end if;

end process;

qb<=reg8(0);

end behave;

仿真波形:每个时钟周期将输入右移一位输出。

图三:8位右移寄存器仿真结果模块二:8位加法器:

源程序:library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity adder8 is

port(b,a:in std_logic_vector(7 downto 0);

s:out std_logic_vector(8 downto 0));

end adder8;

architecture behave of adder8 is

begin

s<='0'&a+b;

end behave;

仿真波形:

图四:8位加法器仿真结果

模块三、16位锁存器源程序

源程序:library ieee;

use ieee.std_logic_1164.all;

entity reg16b is

port(clk,clr:in std_logic;

d:in std_logic_vector(8 downto 0);

q:out std_logic_vector(15 downto 0);

as:out std_logic_vector(7 downto 0));end reg16b;

architecture behave of reg16b is

signal r16s:std_logic_vector(15 downto 0);

begin

process(clk,clr)

begin

if clr='1'then r16s<=(others=>'0');

elsif clk'event and clk='1' then

r16s(6 downto 0)<=r16s(7 downto 1);

r16s(15 downto 7)<=d;

as<= r16s(15 downto 8);

end if;

end process;

q<=r16s;

end behave;

仿真波形:将输入右移一位锁存在锁存器reg16高8位,as位reg16的高8位输出。

图五、16位锁存器仿真结果

四、遇到问题及结果方法:

问题:1、锁存器为16位向量,无法直接取其高8位输出

2、将综合器件连接后进行仿真时无输出结果

解决方法:1、在锁存器上添加一个输出端为8位向量,编程使其等于锁存器的高8位

2、将时钟周期调大些

五、综合时序仿真结果及功能分析:

图六:8位移位相加乘法器原理框图

功能分析:start信号的上升沿与高电平有两个功能,即16位寄存器清零和被乘数a[7..0]向移位寄存器sreg8加载;它的低电平则作为乘法使能信号,乘法时钟信号从clk输入。当被乘数被加载于8位右移计数器sreg8后,随着每个时钟节拍,最低位在前由低位至高位逐为移出。当为1时与门andarith打开,8位乘数b[7..0] 在同一节拍进入8位加法器,与上一次锁存在16位锁存器reg16中的高8位进行相加,其和在下一时钟周期的上升沿被锁存reg16.而当被乘数的移出位是0时,与门全零输出。如此往复,直至8个时钟周期后,乘法运算过程终止。此时锁存器reg16的输出值即为最后的乘积。

仿真波形:a[7..0]=12,b[7..0]=4 相乘结果为48,由波形知结果正确。