1

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

有人问我如何轻松地将其转换为 8 位 ALU。我目前的回答是,我会将所有模块(add、sub、bux 或 xor LS、RS 等)更改为 8 位模块以及 ALU 模块中 FPGA 板的开关号。

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

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

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

4

1 回答 1

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

现在,当然,我不知道您的 ALU 实际上是做什么的。这个做的不多。它做的唯一数学运算是加法。(这是一个练习的答案,因此我不会发布所有代码)。

*这是您应该始终做的事情。你提到了Quartus。Quartus 不进行仿真——它从综合开始。您应该始终在合成之前进行模拟:查找错误、找到它们的来源并修复它们要快得多。

于 2016-03-17T15:23:18.937 回答