实际答案取决于您拥有的实际 ALU 和您选择的方法。您说您试图找到如何连接两个 4 位 ALU;这里有一些帮助:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.defs_pkg.all;
entity cpu_alu is
port(
opA : in std_logic_vector(15 downto 0); -- operand A
opB : in std_logic_vector(15 downto 0); -- operand B
Op : in std_logic_vector(2 downto 0); -- operator
cIn : in std_logic; -- carry in
invA : in std_logic; -- invert A
result : out std_logic_vector(15 downto 0); -- result
cOut : out std_logic; -- carry out
overflow: out std_logic; -- overflow
zero : out std_logic
);
end entity cpu_alu;
architecture rtl1 of cpu_alu is
signal A: std_logic_vector(7 downto 0);
signal INTERNAL_CARRY: std_logic; -- the carry chain
signal zeroMSB: std_logic; -- because this ALU has a 'zero' output
signal zeroLSB: std_logic;
constant Top : integer := A'left;
begin
MSB : entity work.cpu_alu8
port map ( opA => opA(7 downto 0),
opB => opB(7 downto 0),
Op => Op,
CIn => CIn,
invA => inVa,
result => result(7 downto 0),
cout => INTERNAL_CARRY,
overflow => open,
zero => zeroMSB);
MSL : entity work.cpu_alu8
port map ( opA => opA(15 downto 8),
opB => opB(15 downto 8),
Op => Op,
CIn => INTERNAL_CARRY,
invA => inVa,
result => result(15 downto 8),
cout => cOut,
overflow => overflow,
zero => zeroLSB);
zero <= zeroMSB and zeroLSB;
end architecture rtl1; -- of cpu_alu
这显示了两个 8 位 ALU 连接在一起形成一个 16 位 ALU。我之前已经准备好了一个 16 位 ALU,所以我将它转换为一个 8 位 ALU 并实例化了两次以生成原始的 16 位 ALU(所以我可以对其进行相同的测试以确保我已经完成了它正确*)。我确定您可以将其转换为 2x 4 位 ALU。
8 个 LSB 进入第一个 ALU;8 个 MSB 排在第二位。要看的关键是我如何将第一个 ALU 的进位输出连接到第二个 ALU 的进位输入。另请注意,我overflow
对 LSB ALU 的输出不感兴趣。最后,我需要合并zero
每个的输出。
现在,当然,我不知道您的 ALU 实际上是做什么的。这个做的不多。它做的唯一数学运算是加法。(这是一个练习的答案,因此我不会发布所有代码)。
*这是您应该始终做的事情。你提到了Quartus。Quartus 不进行仿真——它从综合开始。您应该始终在合成之前进行模拟:查找错误、找到它们的来源并修复它们要快得多。