【问题标题】:8 bit to 16 bit ALU conversion8 位到 16 位 ALU 转换
【发布时间】:2016-03-17 14:13:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • “已被询问”表明这可能是一项任务。您已经描述了三种方法,它们都有效,我已经看到它们都使用过。各有优缺点,建议你详细说一下。在您的作业或报告中。
  • 询问转换现有实施的具体问题。 最简单的方法是主观的,你的读者没有足够的细节,答案将是没有事实依据的意见。
  • 最简单的方法可能是使用通用实现,但这取决于您对最简单的定义。或者您真的需要帮助来编写 4 位 ALU 吗?还有您的标题,与您的描述不符。

标签: vhdl alu quartus


【解决方案1】:

实际答案取决于您拥有的实际 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 实际做了什么。这个做的不多。它做的唯一数学运算是加法。 (这是一个练习的答案,因此我不会发布所有代码)。

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

【讨论】:

  • 您说您试图找到如何连接两个 4 位 ALU ... 问题或编辑历史似乎不支持此断言。
  • 将您的代码转换为两个 4 位 ALU 的实例化是可能的,但记录端口会很有帮助。例如,invA 是什么?最后一段取决于您是否将 ModelSim Altera 版视为 Quartus 的一部分。
  • @user1155120 没有做过任何这些事情。问题的海报说他有。
  • @Martin Zabel 我为 I/O 添加了标签。老实说,我想我已经记录了回答这个问题的重要内容。我不认为 Modelsim 是 Quartus 的一部分——它是一个完全独立的 EDA 工具。不用费心去模拟似乎在 FPGA 社区中很常见:我在这里看到了,我在我教的人身上看到了。我只是指出最好先模拟。
  • “我会改变”或“或者我能够设计 ALU 来调用每个 4 位门两次”似乎是将来时态。无论如何,问题并不具体,您的答案也不可能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2014-08-18
  • 2012-07-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多