首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >8位到16位ALU转换

8位到16位ALU转换
EN

Stack Overflow用户
提问于 2016-03-17 22:13:30
回答 1查看 1.1K关注 0票数 1

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

有人问我如何才能轻松地将其转换为8位算术逻辑单元。我现在的回答是我会修改所有的模块(add,sub,bux,or,xor LS,RS等)到8位1,以及ALU模块中FPGA板的开关号。

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-03-17 23:23:19

实际答案取决于你实际拥有的算术逻辑单元和你选择的方法。你说你已经试图找到如何连接两个4位ALU;这里有一些帮助:

代码语言:javascript
复制
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 (这样我就可以在它上运行相同的测试,以确保我做得正确*)。我相信你可以把它转换成2倍的4位算术逻辑单元。

8个LSB连接到第一个ALU;8个MSB连接到第二个ALU。要看到的关键是我如何将第一个算术逻辑单元的进位输出连接到第二个算术逻辑单元的进位输入。还要注意,我对LSB ALU的overflow输出不感兴趣。最后,我需要将每个脚本的zero输出组合在一起。

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

*这是你应该一直做的事情。你提到了Quartus。Quartus不会模拟--它从合成开始。你应该总是在合成之前进行模拟:找到bug,找到它们的来源并修复它们要快得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36063113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档