基于EDA的4位乘法器的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4位乘法器的设计
一、设计目的
设计一个四位乘法器。
编写VHDL 源代码,得出正确的仿真波形,并在实验开发系统上进行硬件演示。
二、乘法器设计原理
四位二进制乘法采用移位相加的方法。即用乘数的各位数码,从高位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次得到的部分积左移一位并与第二次得到的部分积相加,将加得的和左移一位再与第三次得到的部分积相加,再将相加的结果左移一位与第四次得到的部分积相加,直到所的部分积都被加过一次。
原理框图:
三、设计程序代码
1)选通与门模块的源程序ANDARITH.VHD
library ieee;
use ieee.std_logic_1164.all;
entity andarith is
port(abin:in std_logic;
din:in std_logic_vector(3 downto 0);
dout:out std_logic_vector(3 downto 0));
end;
architecture art3 of andarith is
begin
process(abin,din)
begin
for i in 0 to 3 loop
dout(i)<=din(i) and abin;
end loop; 锁存器 寄存器
加法器
选通与门 clk
输入 输出
end process;
end art3;
2)4位右移寄存器的源程序SREG4B.VHD library ieee;
use ieee.std_logic_1164.all;
entity sreg4b is
port(clk,en:in std_logic;
load:in std_logic;
din:in std_logic_vector(3 downto 0);
qb:out std_logic);
end;
architecture art1 of sreg4b is
signal reg4:std_logic_vector(3 downto 0); begin
process(clk,load,en)
begin
if clk'event and clk ='1' and en='1' then if load='0' then reg4<=din;
else
reg4(2 downto 0)<=reg4(3 downto 1);
end if;
end if;
end process;
qb<=reg4(0);
end art1;
3)8位锁存器的源程序REG8.VHD
library ieee;
use ieee.std_logic_1164.all;
entity reg8 is
port(clk,clr,en:in std_logic;
d:in std_logic_vector(4 downto 0);
q: out std_logic_vector(7 downto 0)); end;
architecture art4 of reg8 is
signal r8s:std_logic_vector(7 downto 0); begin
process(clk,clr)
begin
if clr='0' then r8s<=(others=>'0');
elsif clk'event and clk='1' and en='1' then r8s(2 downto 0)<=r8s(3 downto 1);
r8s(7 downto 3)<=d;
end if;
end process;
q<=r8s;
end art4;
4)乘法运算控制器的源程序ARICTL.VHD library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity arictl is
port(clk,start: in std_logic;
en,rstall,ariend:out std_logic);
end;
architecture art5 of arictl is
signal cnt2b:std_logic_vector(2 downto 0); begin
rstall<=start;
process(clk,start) is
begin
if start='0' then cnt2b<="000";
elsif clk'event and clk='1' then
if cnt2b<4 then
cnt2b<=cnt2b+1;
end if;
end if;
end process;
process(clk,cnt2b,start) is
begin
if start='1' then
if cnt2b<4 then
en<='1';ariend<='0';
else en<='0';ariend<='1';
end if;
else en<='1';ariend<='0';
end if;
end process;
end art5;