8位到16位ALU转换

时间:2016-03-17 14:13:30

标签: vhdl alu quartus

我目前正在攻读电气工程学位,并设计了一个4位ALU作为任务的一部分。

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

这是最简单的方法还是我可以将ALU设计为在每个4位门上调用两次,或者再次使用不同的名称添加4位模块?

我觉得我已经筋疲力尽了我的教科书和网络令人沮丧,因为信息必须在那里!

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

1 个答案:

答案 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没有模拟 - 它从综合开始。你应该总是在合成之前进行模拟:找到错误,找到它们的来源并修复它们要快得多。