Compiler errors 用VHDL生成关键字
我正在尝试使用VHDL创建一个进位先行加法器/减法器单元,作为ALU的一部分。 与传统加法器不同,该装置必须识别32位未压缩数据和16位压缩数据,并对其进行相应处理。所以,如果我选择添加两个32位的未压缩量,它应该会给出一个32位的未压缩结果。但是,如果我想添加四个16位压缩量,它应该会给出两个16位压缩结果 即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 我曾尝试使用一个模式位来实现这样一个功能,该模式位将确定我使用的是打包数据还是解包
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太生疏了,我忘了你不能这么做。我同意。不幸的是,任务要求我们以一种结构化的方式(我想是为了教育方面)制作一个进位先行加法器。然而,我确实按照你的建议做了倍增,取而代之的是
*
。我同意。不幸的是,任务要求我们以一种结构化的方式(我想是为了教育方面)制作一个进位先行加法器。但是,我确实按照您的建议使用了一个*
来实现乘数。