📄 mult8_comb_seq_mux.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.std_logic_arith.all;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY mult8_comb_seq_mux IS
--GENERIC(datawidth:INTEGER:=4); --乘数的数据宽度
PORT (
clk : IN STD_LOGIC; --时钟
A : IN STD_LOGIC_VECTOR (7 DOWNTO 0); --第一个乘数
B : IN STD_LOGIC_VECTOR (7 DOWNTO 0); --第二个乘数
P : OUT STD_LOGIC_VECTOR (15 DOWNTO 0); --乘法器的结果
start : IN STD_LOGIC; --计算开始信号
finished : BUFFER STD_LOGIC --计算结束信号
);
END mult8_comb_seq_mux;
ARCHITECTURE rtl OF mult8_comb_seq_mux IS
COMPONENT mult4_comb
GENERIC(datawidth:INTEGER:=4);
PORT (
A : IN STD_LOGIC_VECTOR (datawidth-1 DOWNTO 0); --第一个乘数
B : IN STD_LOGIC_VECTOR (datawidth-1 DOWNTO 0); --第二个乘数
P : OUT STD_LOGIC_VECTOR (datawidth*2-1 DOWNTO 0) --乘法器的结果
);
END COMPONENT;
COMPONENT adder8_arith
PORT(
cin : IN STD_LOGIC; --进位输入
a,b : IN UNSIGNED(7 DOWNTO 0); --加数
s : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --和
cout : OUT STD_LOGIC); --进位输出
END COMPONENT;
SIGNAL count : INTEGER RANGE 0 to 5; --节拍计数器
SIGNAL A_mult4 : STD_LOGIC_VECTOR (3 DOWNTO 0); --4位乘法器乘数输入
SIGNAL B_mult4 : STD_LOGIC_VECTOR (3 DOWNTO 0); --4位乘法器乘数输入
SIGNAL P_mult4 : STD_LOGIC_VECTOR (7 DOWNTO 0); --4位乘法器积输出
SIGNAL P_sig : STD_LOGIC_VECTOR (15 DOWNTO 0); --结果寄存器
SIGNAL a_adder8 : UNSIGNED(7 DOWNTO 0); --加法器的输入a
SIGNAL b_adder8 : UNSIGNED(7 DOWNTO 0); --加法器的输入b
SIGNAL s_adder8 : STD_LOGIC_VECTOR(7 DOWNTO 0); --加法器的和
SIGNAL cout_adder8 : STD_LOGIC; --加法器的进位输出
SIGNAL cin_adder8 : STD_LOGIC; --加法器进位输入
BEGIN
--实例化4bit乘法器
mult: mult4_comb
GENERIC MAP (datawidth =>4)
PORT MAP (A => A_mult4,
B => B_mult4,
P => P_mult4);
--实例化adder8
add: adder8_arith
PORT MAP ( cin => cin_adder8,
a => a_adder8,
b => b_adder8,
s => s_adder8,
cout => cout_adder8);
cin_adder8<='0'; --加法器进位,常为'0'
a_adder8 <= unsigned(p_mult4); --加法器固定输入:4位乘法器的输出
--主进程,负责结果寄存器的操作:1、从4位乘法器积取数,做加法运算。2、负责加法进位
PROCESS(clk)
VARIABLE sum : STD_LOGIC_VECTOR (8 DOWNTO 0);
BEGIN
IF(clk'event and clk='0') THEN
IF(count=0) THEN
P_sig <= B"0000000000000000";
ELSIF(count=1) THEN
P_sig(7 DOWNTO 0) <= P_mult4;
ELSIF(count=2) THEN
P_sig(11 DOWNTO 4) <= s_adder8;
ELSIF(count=3) THEN
P_sig(11 DOWNTO 4)<= s_adder8;
P_sig(12) <= cout_adder8;
ELSIF(count=4) THEN
P_sig(15 DOWNTO 8) <= s_adder8;
ELSE
P_sig<=P_sig;
END IF;
END IF;
END PROCESS;
--产生4位乘法器输入和加法器的输入b(三个多路选通器)
PROCESS(clk)
BEGIN
IF(count=0) THEN
A_mult4 <= A(3 DOWNTO 0);
B_mult4 <= B(3 DOWNTO 0);
ELSIF(count=1) THEN
A_mult4 <= A(3 DOWNTO 0);
B_mult4 <= B(3 DOWNTO 0);
ELSIF(count=2) THEN
A_mult4 <= A(3 DOWNTO 0);
B_mult4 <= B(7 DOWNTO 4);
b_adder8 <= unsigned(P_sig(11 DOWNTO 4));
ELSIF(count=3) THEN
A_mult4 <= A(7 DOWNTO 4);
B_mult4 <= B(3 DOWNTO 0);
b_adder8 <= unsigned(P_sig(11 DOWNTO 4));
ELSIF(count=4) THEN
A_mult4 <= A(7 DOWNTO 4);
B_mult4 <= B(7 DOWNTO 4);
b_adder8 <= unsigned(P_sig(15 DOWNTO 8));
ELSE
A_mult4<=B"0000";
B_mult4<=B"0000";
END IF;
END PROCESS;
--进程:节拍计数器
PROCESS(clk)
BEGIN
IF(Start='1') and finished='1' THEN
--在乘法器空闲并时来了开始信号
--则节怕计数器复位
count<=0;
ELSIF(clk'event and clk='1') THEN
IF(count=count'high) THEN
--计算完成,节拍计数器停止
count<=count;
--输出指示乘法器空闲
finished<='1';
ELSE
count<=count+1;
finished<='0';
END IF;
END IF;
END PROCESS;
--输出进程
PROCESS(finished)
BEGIN
IF(finished='1') THEN
p<=P_sig;
END IF;
END PROCESS;
END RTL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -