VHDL使用第二个文件中的两个组件

时间:2015-06-14 01:34:51

标签: components vhdl modelsim

我的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;

1 个答案:

答案 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潜伏的实体声明。

这里故事的寓意是不要重新宣布你不需要的东西,并在建筑宣言中获得实体名称。