基于EDA的4位乘法器的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档