我的VHDL代码有问题,我使用mypackage.VHD,其中包含我的所有组件。 所以我在这里添加了USE WORK.mypackage.ALL;使用此部件的必要组件。这部分使用了2个组件,其中一个在我尝试编译文件时给出了一个错误。如果我完全以相同的格式包含2个组件,我复制粘贴mypackage.VHD中的组件到这个,它工作,但一旦我删除它们从mypackage.VHD使用它,它给了我错误。 我不知道问题是什么,非常感谢你提前帮助。
简而言之:我有2个VHD文件,mypackage.VHD,我的所有组件和第二个(alu.VHD)使用mypackage.VHD组件(USE WORK.mypackage.ALL;),看起来像它无法识别mypackage.VHD中的alu_1组件。但不知道为什么。
这是错误:
** Error (suppressible): C:/../alu_32.vhd(47): (vcom-1141) Identifier "alu_1" does not identify a component declaration.
我的代码使用的2个组件: alu_32没有错误,但alu_1在尝试从mypackage.VHD使用它时出错。
COMPONENT alu_1
PORT (
a, b, c_in, less : IN STD_LOGIC;
ALUControl : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
c_out, result, set : OUT STD_LOGIC
);
END COMPONENT;
COMPONENT alu_32
GENERIC (ALU_SIZE : INTEGER := 31); -- Il suffit de chager la valeur 31 a celle de la taille de lALU desiree!
PORT (
SrcA, SrcB : IN std_logic_vector(ALU_SIZE DOWNTO 0);
ALUControl : IN std_logic_vector (3 DOWNTO 0);
c_out : OUT std_logic;
Result : OUT std_logic_vector (ALU_SIZE DOWNTO 0);
zero : OUT std_logic
);
END COMPONENT;
我的代码:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;
USE WORK.mypackage.ALL;
ENTITY alu_32_generic IS
GENERIC (ALU_SIZE : INTEGER := 31); -- Il suffit de chager la valeur 31 a celle de la taille de lALU desiree!
PORT (
SrcA, SrcB : IN STD_LOGIC_VECTOR (ALU_SIZE DOWNTO 0);
ALUControl : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
c_out : OUT STD_LOGIC;
result : OUT STD_LOGIC_VECTOR (ALU_SIZE DOWNTO 0);
zero : OUT std_logic
);
END alu_32_generic;
ARCHITECTURE alu_32 OF alu_32 IS
SIGNAL less_i : std_logic_vector (ALU_SIZE DOWNTO 0);
SIGNAL result_i : std_logic_vector (ALU_SIZE DOWNTO 0);
SIGNAL c_in_i : std_logic_vector (ALU_SIZE + 1 DOWNTO 0);
SIGNAL set : std_logic_vector (ALU_SIZE DOWNTO 0);
BEGIN
zero <= result_i(31) OR result_i(30);
GEN_REG : FOR i IN ALU_SIZE DOWNTO 0 GENERATE
alu_32 : alu_1
PORT MAP(
a => SrcA(i),
b => SrcB(i),
c_in => C_in_i(i),
ALUControl => ALUControl,
c_out => C_in_i(i + 1),
less => less_i(i),
set => set(i),
result => result_i(i)
);
END GENERATE GEN_REG;
c_in_i(0) <= ALUControl(2);
c_out <= C_in_i(ALU_SIZE + 1);
less_i(0) <= set(31);
less_i(ALU_SIZE DOWNTO 1) <= (OTHERS => '0');
result(ALU_SIZE DOWNTO 0) <= result_i;
END alu_32;
答案 0 :(得分:0)
如果没有确定第47行(您的示例行计数不匹配),您可以注意到实体alu_32_generic声明:
ENTITY alu_32_generic IS
架构实体名称:
ARCHITECTURE alu_32 OF alu_32 IS
不匹配。
在架构声明中更正实体名称并注释掉不需要的三个use子句之后:
-- USE ieee.std_logic_arith.ALL;
-- USE ieee.std_logic_unsigned.ALL;
-- USE WORK.mypackage.ALL;
然后您的代码进行分析(这是vcom的作用)。
请注意,如果启用use子句my mypackage,则作为体系结构声明项的声明将取代包中的声明。 use子句不会影响你的问题。
来自错误:
vcom消息#1141:
语法需要组件名称。给出的名称不表示a 组件声明。
您可以注意到代码中alu_1
的两个用法似乎有效。最接近示例的第47行显示在第40行(下面第二行):
GEN_REG : FOR i IN ALU_SIZE DOWNTO 0 GENERATE
alu_32 : alu_1
您还可以注意到第一次出现在架构声明中的组件声明中:
ARCHITECTURE alu_32 OF alu_32 IS
COMPONENT alu_1
PORT (
这就提出了一个问题,即你是否还有alu_32
潜伏的实体声明。
这里故事的寓意是不要重新宣布你不需要的东西,并在建筑宣言中获得实体名称。