我目前正在学习电气工程学位,并设计了一个4位ALU作为任务的一部分。8位至16位ALU转换
我被问及如何轻松将其转换为8位ALU。我现在的答案是,我将把所有模块(add,sub,bux或xor LS,RS等)更改为8位模块以及ALU模块中FPGA板的开关编号。
这是最简单的方法,还是我能够设计ALU来调用每个4位门或两次添加4位模块的不同名称?
我觉得好像我已经用尽了我的教科书和网络,这是令人沮丧的信息必须在那里!
我正在使用Quartus II进行编程。
我目前正在学习电气工程学位,并设计了一个4位ALU作为任务的一部分。8位至16位ALU转换
我被问及如何轻松将其转换为8位ALU。我现在的答案是,我将把所有模块(add,sub,bux或xor LS,RS等)更改为8位模块以及ALU模块中FPGA板的开关编号。
这是最简单的方法,还是我能够设计ALU来调用每个4位门或两次添加4位模块的不同名称?
我觉得好像我已经用尽了我的教科书和网络,这是令人沮丧的信息必须在那里!
我正在使用Quartus II进行编程。
实际答案取决于您的实际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的进位输出连接到第二个进位输入。另请注意,我对LSB ALU的输出overflow
不感兴趣。最后,我需要合并各自的zero
输出。
当然,我不知道你的ALU实际上做了什么。这一个并没有太大的作用。它唯一的数学运算是ADD。 (这是一个练习的答案,因此我不会发布所有的代码)。
*这是你应该始终做的。你提到Quartus。 Quartus不模拟 - 它从综合开始。在合成之前,您应该始终进行模拟:找到错误,查找源代码并修复错误要快得多。
*你说你试图找到如何连接两个4位ALU ...... *这个断言看起来不被这个问题或它的编辑历史支持。 – user1155120
将您的代码转换为两个4位ALU的实例可能是可能的,但是记录这些端口会很有帮助。例如,什么是'invA'?最后一段取决于您是否将ModelSim Altera Edition视为Quartus的一部分。 –
@ user1155120 _I_没有做过任何这些事情。问题的海报说他有。 –
“有人问”表明这可能是一项任务。你已经描述了三种方式,它们都可以工作,而且我已经看到它们都被使用了。各有其优点和缺点,我建议你详细说明这些。在你的任务或报告中。 –
询问转换您的现有实施的具体问题。 *最简单的方法*是主观的,你的读者没有足够的细节,答案是没有事实依据的意见。 – user1155120
最简单的方法可能是使用泛型实现,但这取决于_easiest_的定义。或者,您是否真的需要帮助将它从4位ALU中组合出来?您的标题也与您的描述不符。 –