2016-03-17 138 views
0

我目前正在学习电气工程学位,并设计了一个4位ALU作为任务的一部分。8位至16位ALU转换

我被问及如何轻松将其转换为8位ALU。我现在的答案是,我将把所有模块(add,sub,bux或xor LS,RS等)更改为8位模块以及ALU模块中FPGA板的开关编号。

这是最简单的方法,还是我能够设计ALU来调用每个4位门或两次添加4位模块的不同名称?

我觉得好像我已经用尽了我的教科书和网络,这是令人沮丧的信息必须在那里!

我正在使用Quartus II进行编程。

+1

“有人问”表明这可能是一项任务。你已经描述了三种方式,它们都可以工作,而且我已经看到它们都被使用了。各有其优点和缺点,我建议你详细说明这些。在你的任务或报告中。 –

+1

询问转换您的现有实施的具体问题。 *最简单的方法*是主观的,你的读者没有足够的细节,答案是没有事实依据的意见。 – user1155120

+0

最简单的方法可能是使用泛型实现,但这取决于_easiest_的定义。或者,您是否真的需要帮助将它从4位ALU中组合出来?您的标题也与您的描述不符。 –

回答

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的进位输出连接到第二个进位输入。另请注意,我对LSB ALU的输出overflow不感兴趣。最后,我需要合并各自的zero输出。

当然,我不知道你的ALU实际上做了什么。这一个并没有太大的作用。它唯一的数学运算是ADD。 (这是一个练习的答案,因此我不会发布所有的代码)。

*这是你应该始终做的。你提到Quartus。 Quartus不模拟 - 它从综合开始。在合成之前,您应该始终进行模拟:找到错误,查找源代码并修复错误要快得多。

+0

*你说你试图找到如何连接两个4位ALU ...... *这个断言看起来不被这个问题或它的编辑历史支持。 – user1155120

+0

将您的代码转换为两个4位ALU的实例可能是可能的,但是记录这些端口会很有帮助。例如,什么是'invA'?最后一段取决于您是否将ModelSim Altera Edition视为Quartus的一部分。 –

+0

@ user1155120 _I_没有做过任何这些事情。问题的海报说他有。 –