4 位 乘 法 器 的 设 计
设计思想: 确定该乘法器工作的基本原理是首先生成部分积,再将这些部分积相加得到
乘积。设计的基本思想为:从被乘数的最低位开始移位,若移出位为 1,则乘数左移后与上
一次的和相加,若移出位为 0,则乘数左移后以全 0 相加,循环上述操作,直至被乘数的最
高位。主要是进行移位、相加两项操作的重复。
乘法器设计
根据乘法器工作原理可知,确定输入与输出。输入的两个乘数分别为 din[4 .. 0]、din1 [4..
0],另外 clk、clr 作为控制输入,dout[7..0]作为输出。 由分析可知乘法器原理框图包括右
移寄存器(sregb)、8 位寄存器(regb)、选通与门(andarith)、4 位加法器(adder4)四部
分。其中,sreg4b 对被乘数进行右移移位,andarith 对乘数与被乘数相乘过程中的部分积进
行相与,adder4 对右移寄存器的移位位数进行计数,regb 对乘数和被乘数相乘之后的结果
进行存储。下面分别对各部分元件进行设计,然后再由这些元件构成整个乘法器电路图。
1) 设计一个右移寄存器(sregb)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY sregb IS
PORT
(
clk : IN STD_LOGIC;
load : IN STD_LOGIC;
din : IN STD_LOGIC_VECTOR(3 downto 0);
qb : OUT STD_LOGIC
);
END sregb;
ARCHITECTURE sregb_architecture OF sregb IS
SIGNAL regb : STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
PROCESS (clk, load)
BEGIN
IF
ELSIF CLK'EVENT AND CLK = '1' THEN
load = '1' THEN regb<= din;
regb(2 DOWNTO 0) <= regb(3 DOWNTO 1);
qb <= regb(0);
END IF;
END PROCESS;
END sregb_architecture;
2) 设计一个选通与门(andarith)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY andarith IS
PORT
qb: IN STD_LOGIC;
din1 : IN STD_LOGIC_VECTOR(3 downto 0);
dout1 : OUT STD_LOGIC_VECTOR(3 downto 0)
(
);
END andarith;
ARCHITECTURE andarith_architecture OF andarith IS
BEGIN
PROCESS(qb, din1)
BEGIN
FOR i IN 0 TO 3 LOOP
DOUT1(i) <= DIN1(i) AND qb;
END LOOP;
END PROCESS;
END andarith_architecture;
3) 设计一个计数器(adder4)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY adder4 IS
PORT
(
dout1 : IN STD_LOGIC_VECTOR(3 downto 0);
dout : IN STD_LOGIC_VECTOR(7 downto 4);
s : OUT STD_LOGIC_VECTOR(4 downto 0)
);
END adder4;
ARCHITECTURE adder4_architecture OF adder4 IS
BEGIN
s <= ('0' & dout1) + ('0'& dout)
END adder4_architecture;
4) 设计一个 8 位寄存器(rega)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY rega IS
PORT
(
clk : IN STD_LOGIC;
load : IN STD_LOGIC;
s : IN STD_LOGIC_VECTOR(3 downto 0);
dout : OUT STD_LOGIC_VECTOR(7 downto 0)
);
END rega;
ARCHITECTURE rega_architecture OF rega IS
SIGNAL R8S : STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(clk, load)
BEGIN
IF load = '1' THEN R8S <= (OTHERS =>'0')
ELSIF rising_edge(clk) THEN
--清零部分积
R8S(2 DOWNTO 0)
R8S(7 DOWNTO 3) <= s;
Load= '0 ';
<= R16S(3 DOWNTO 1); -- 右 移 低 3 位
-- 将 加 法 和 输 入 锁 到 高 5 位
END IF;
END PROCESS;
dout <= R8S;
END rega_architecture;