【发布时间】:2016-05-17 11:21:10
【问题描述】:
您好,我正在尝试从几个 1 位 ALU 创建一个 16 位 ALU 我创建了一个名为 basic_alu1 的包,其中包含 1 位 ALU 的一个组件。代码如下:
library ieee;
use ieee.std_logic_1164.all;
package basic_alu1 is
component alu1
port (a, b: std_logic_vector(1 downto 0);
m: in std_logic_vector(1 downto 0);
result: out std_logic_vector(1 downto 0));
end component;
end package basic_alu1;
library ieee;
use ieee.std_logic_1164.all;
entity alu1 is
port (a, b: std_logic_vector(1 downto 0);
m: in std_logic_vector(1 downto 0);
result: out std_logic_vector(1 downto 0));
end alu1;
architecture arch1 of alu1 is
begin
process(a, b, m)
begin
case m is
when "00" =>
result <= a + b;
when "01" =>
result <= a + (not b) + 1;
when "10" =>
result <= a and b;
when "11" =>
result <= a or b;
end case
end process
end arch1
因此,为了创建 16 位 ALU,我使用了 for generate 循环并实例化 alu1 的多个副本。我的问题是如何将计数器放入和取出,以及如何进行溢出检查。我的主要代码是:
library ieee;
use ieee.std_logic_1164.all;
use work.basic_alu1.all;
entity alu16 is
port (input_a : in std_logic_vector(15 downto 0);
input_b : in std_logic_vector(15 downto 0);
mode : in std_logic_vector(1 downto 0)
result_x4 : out std_logic);
end alu16;
architecture structural of alu16 is
begin
G1 : for i in 0 to 15 generate
begin
alu_16 : entity work.basic_alu1
port map (
a => input_a(i),
b => input_b(i),
m => mode,
result => result_x4(i));
end generate;
【问题讨论】:
-
这是一个半加法器:
result <= a + b;。您将需要一个 full adder(带有一个 carry in 和一个 carry out):(cout, result) <= a + b + ('0'&cin);然后您连接到菊花链进位:每个进位都由前一个(次要)阶段的进位驱动。然后,您可以通过比较 17 位输出的左侧两个位(执行 MSB 和其他 16 个结果)来检测溢出。如果这两个位不同,则说明溢出。 -
您的代码不是Minimal, Complete, and Verifiable example。它也有各种语法错误,您的问题不清楚 - 什么计数器? 正如 Matthew 指出的那样,您不是在构建没有进位链的 16 位 ALU。除了一大堆缺少的分号、缺少的 end 语句、声明为单个 std_logic 的 result_x4 以及缺少其他选择的情况之外,没有用于将抽象文字添加到 std_logic 值的“+”运算符重载。为什么要尝试从 1 位 ALU 构建 16 位 ALU?这是课堂作业吗?
-
Charles Steinkuehler 的回答 (vhdl - Making a 4-bit ALU from several 1-bit ALUs) 提到“暂时忽略进位问题,您通常只需设置一个 for generate 循环并实例化您的按位逻辑的多个副本,可能是第一个特殊套管和/ 或最后一个元素”,警告读者进位没有被覆盖,他显示
result_x4(bitindex) )一个选定的名称暗示 result_x4 是一个数组值。