Compiler errors 用VHDL生成关键字

Compiler errors 用VHDL生成关键字,compiler-errors,vhdl,hdl,alu,Compiler Errors,Vhdl,Hdl,Alu,我正在尝试使用VHDL创建一个进位先行加法器/减法器单元,作为ALU的一部分。 与传统加法器不同,该装置必须识别32位未压缩数据和16位压缩数据,并对其进行相应处理。所以,如果我选择添加两个32位的未压缩量,它应该会给出一个32位的未压缩结果。但是,如果我想添加四个16位压缩量,它应该会给出两个16位压缩结果 即 32位A+32位B=32位A+B 16位A+16位B,16位C+16位D=16位A+B,16位C+D 我曾尝试使用一个模式位来实现这样一个功能,该模式位将确定我使用的是打包数据还是解包

我正在尝试使用VHDL创建一个进位先行加法器/减法器单元,作为ALU的一部分。 与传统加法器不同,该装置必须识别32位未压缩数据和16位压缩数据,并对其进行相应处理。所以,如果我选择添加两个32位的未压缩量,它应该会给出一个32位的未压缩结果。但是,如果我想添加四个16位压缩量,它应该会给出两个16位压缩结果



32位A+32位B=32位A+B

16位A+16位B,16位C+16位D=16位A+B,16位C+D

我曾尝试使用一个模式位来实现这样一个功能,该模式位将确定我使用的是打包数据还是解包数据,但是,我的VHDL编译器一直告诉我,它需要
generate
关键字,还有其他一些我相当困惑的错误我应该注意到,这种设计可以完美地编译未打包的数据,也就是说,没有条件语句以及cla4和cla5。我希望能解释一下我做错了什么。谢谢

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity thirty_two_bit_cla is
    port
    (
    A : in std_logic_vector(31 downto 0);  -- 32-bit augend
    B : in std_logic_vector(31 downto 0);  -- 32-bit addend
    SUM : out std_logic_vector(31 downto 0);  -- 32-bit sum
    CARRY_OUT : out std_logic;                -- carry out
    CARRY_IN  : in  std_logic;                -- carry in
    P_G       : out std_logic;                -- group propagate
    G_G       : out std_logic;                -- group generate
    MODE      : in  std_logic                 -- 16 or 32-bit addition (0 or 1 respectively)
    );
end thirty_two_bit_cla;

architecture structural of thirty_two_bit_cla is

signal G : std_logic_vector(1 downto 0);      --generate signals         
signal P : std_logic_vector(1 downto 0);      --propagate signals
signal C : std_logic_vector(2 downto 0);      --carry signals

begin
    --Treat data as 32-bit unpacked
    if(MODE = '1') then
    sixteen_bit_cla0: entity sixteen_bit_cla port map(A=>A(15 downto 0),
                                                      B=>B(15 downto 0),
                                                  SUM=>SUM(15 downto 0),
                                                         CARRY_IN=>C(0),
                                                            P_G => P(0),
                                                           G_G => G(0));

    sixteen_bit_cla1: entity sixteen_bit_cla port map(A=>A(31 downto 16),
                                                      B=>B(31 downto 16),
                                                  SUM=>SUM(31 downto 16),
                                                          CARRY_IN=>C(1),
                                                             P_G => P(1),
                                                            G_G => G(1));


    C(0) <= CARRY_IN;
    C(1) <= G(0) or (P(0) and C(0));
    C(2) <= G(1) or (P(1) and C(1));


    CARRY_OUT <= C(2);
    G_G<=C(2);
    P_G <= P(0) and P(1);

    --Treat data as 16-bit packed
    elsif (MODE = '0') then
    sixteen_bit_cla4: entity sixteen_bit_cla port map(A=>A(15 downto 0),
                                                      B=>B(15 downto 0),
                                                  SUM=>SUM(15 downto 0),
                                                    CARRY_IN=>CARRY_IN);

    sixteen_bit_cla5: entity sixteen_bit_cla port map(A=>A(31 downto 16),
                                                      B=>B(31 downto 16),
                                                  SUM=>SUM(31 downto 16),
                                                     CARRY_IN=>CARRY_IN);
    end if;

end structural;

您试图在进程之外使用顺序IF语句。它希望关键字IF是generate scheme和generate语句的一部分

(不,您不想使用generate语句)。您希望控制数据,而不是实例化。如果您的16位加法器连接正确,看起来您只是在操作进位链。这样做不需要复制加法器

这将为您提供与您选择的模式操作等效的操作,除非没有要执行的空赋值,G和p\G:

begin
--Treat data as 32-bit unpacked
-- if(MODE = '1') then
sixteen_bit_cla0: entity sixteen_bit_cla port map(A=>A(15 downto 0),
                                                  B=>B(15 downto 0),
                                              SUM=>SUM(15 downto 0),
                                                     CARRY_IN=>C(0),
                                                        P_G => P(0),
                                                       G_G => G(0));

sixteen_bit_cla1: entity sixteen_bit_cla port map(A=>A(31 downto 16),
                                                  B=>B(31 downto 16),
                                              SUM=>SUM(31 downto 16),
                                                      CARRY_IN=>C(1),
                                                         P_G => P(1),
                                                        G_G => G(1));


C(0) <= CARRY_IN;  -- both modes
C(1) <= G(0) or (P(0) and C(0)) when MODE = '1' else
        CARRY_IN;
C(2) <= G(1) or (P(1) and C(1));


CARRY_OUT <= C(2) when MODE = '1' else
             '0';
G_G<=C(2)  when MODE = '1' else
      '0';
P_G <= P(0) and P(1) when MODE = '1' else
       '0';
-- 
-- --Treat data as 16-bit packed
-- elsif (MODE = '0') then
-- sixteen_bit_cla4: entity sixteen_bit_cla port map(A=>A(15 downto 0),
--                                                   B=>B(15 downto 0),
--                                               SUM=>SUM(15 downto 0),
--                                                 CARRY_IN=>CARRY_IN);
-- 
-- sixteen_bit_cla5: entity sixteen_bit_cla port map(A=>A(31 downto 16),
--                                                   B=>B(31 downto 16),
--                                               SUM=>SUM(31 downto 16),
--                                                  CARRY_IN=>CARRY_IN);
-- end if;

end structural;
开始
--将数据视为32位未打包数据
--如果(模式='1'),则
十六位cla0:实体十六位cla端口映射(A=>A(15到0),
B=>B(15到0),
SUM=>SUM(15到0),
进位=>C(0),
P_G=>P(0),
G_G=>G(0));
十六位cla1:实体十六位cla端口映射(A=>A(31到16),
B=>B(从31降到16),
SUM=>SUM(31到16),
进位=>C(1),
P_G=>P(1),
G_G=>G(1));
C(0)B(31至16),,
--SUM=>SUM(31到16),
--进位=>进位);
--如果结束;
端部结构;

我不会停下来写16位cla和一个测试台来验证它。注意清空。

您试图在进程之外使用顺序IF语句。它希望关键字IF是generate scheme和generate语句的一部分

(不,您不想使用generate语句)。您希望控制数据,而不是实例化。如果您的16位加法器连接正确,看起来您只是在操作进位链。这样做不需要复制加法器

这将为您提供与您选择的模式操作等效的操作,除非没有要执行的空赋值,G和p\G:

begin
--Treat data as 32-bit unpacked
-- if(MODE = '1') then
sixteen_bit_cla0: entity sixteen_bit_cla port map(A=>A(15 downto 0),
                                                  B=>B(15 downto 0),
                                              SUM=>SUM(15 downto 0),
                                                     CARRY_IN=>C(0),
                                                        P_G => P(0),
                                                       G_G => G(0));

sixteen_bit_cla1: entity sixteen_bit_cla port map(A=>A(31 downto 16),
                                                  B=>B(31 downto 16),
                                              SUM=>SUM(31 downto 16),
                                                      CARRY_IN=>C(1),
                                                         P_G => P(1),
                                                        G_G => G(1));


C(0) <= CARRY_IN;  -- both modes
C(1) <= G(0) or (P(0) and C(0)) when MODE = '1' else
        CARRY_IN;
C(2) <= G(1) or (P(1) and C(1));


CARRY_OUT <= C(2) when MODE = '1' else
             '0';
G_G<=C(2)  when MODE = '1' else
      '0';
P_G <= P(0) and P(1) when MODE = '1' else
       '0';
-- 
-- --Treat data as 16-bit packed
-- elsif (MODE = '0') then
-- sixteen_bit_cla4: entity sixteen_bit_cla port map(A=>A(15 downto 0),
--                                                   B=>B(15 downto 0),
--                                               SUM=>SUM(15 downto 0),
--                                                 CARRY_IN=>CARRY_IN);
-- 
-- sixteen_bit_cla5: entity sixteen_bit_cla port map(A=>A(31 downto 16),
--                                                   B=>B(31 downto 16),
--                                               SUM=>SUM(31 downto 16),
--                                                  CARRY_IN=>CARRY_IN);
-- end if;

end structural;
开始
--将数据视为32位未打包数据
--如果(模式='1'),则
十六位cla0:实体十六位cla端口映射(A=>A(15到0),
B=>B(15到0),
SUM=>SUM(15到0),
进位=>C(0),
P_G=>P(0),
G_G=>G(0));
十六位cla1:实体十六位cla端口映射(A=>A(31到16),
B=>B(从31降到16),
SUM=>SUM(31到16),
进位=>C(1),
P_G=>P(1),
G_G=>G(1));
C(0)B(31至16),,
--SUM=>SUM(31到16),
--进位=>进位);
--如果结束;
端部结构;

我不会停下来写16位cla和一个测试台来验证它。买主注意。

你为什么不写一封感谢信呢!我对我的VHDL太生疏了,我忘了你不能这么做。谢谢,看起来很有魅力!我对我的VHDL太生疏了,我忘了你不能这么做。我同意。不幸的是,任务要求我们以一种结构化的方式(我想是为了教育方面)制作一个进位先行加法器。然而,我确实按照你的建议做了倍增,取而代之的是
*
。我同意。不幸的是,任务要求我们以一种结构化的方式(我想是为了教育方面)制作一个进位先行加法器。但是,我确实按照您的建议使用了一个
*
来实现乘数。