我目前正在攻读电气工程学位,并设计了一个4位ALU作为任务的一部分。
我被问到如何轻松将其转换为8位ALU。我现在的答案是,我会将所有模块(add,sub,bux或xor LS,RS等)更改为8位模块以及ALU模块中FPGA板的开关编号。
这是最简单的方法还是我可以将ALU设计为在每个4位门上调用两次,或者再次使用不同的名称添加4位模块?
我觉得我已经筋疲力尽了我的教科书和网络令人沮丧,因为信息必须在那里!
我正在使用Quartus II进行编程。
答案 0 :(得分:0)
实际答案取决于您拥有的实际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的进位输入。另请注意,我对LSB ALU的overflow
输出不感兴趣。最后,我需要结合每个zero
输出。
现在,当然,我不知道您的ALU实际上做了什么。这个做得不多;它唯一的数学运算是ADD。 (这是练习的答案,因此我不会发布所有代码)。
*这就是你应该经常做的事情。你提到Quartus。 Quartus没有模拟 - 它从综合开始。你应该总是在合成之前进行模拟:找到错误,找到它们的来源并修复它们要快得多。