移位相加乘法器
- 格式:doc
- 大小:142.05 KB
- 文档页数:6
设计一个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,由波形知结果正确。