2015-06-14 4 views
0

У меня проблема с кодом VHDL, я использую mypackage.VHD, который содержит все мои компоненты. Итак, здесь я добавил USE WORK.mypackage.ALL; для использования необходимых компонентов для этой части. Эта часть использует 2 компонента, одна из которых дает мне ошибку при попытке скомпилировать файл. Если я включу 2 компонента точно в том же формате, я скопирую компоненты с mypackage.VHD на этот, и он работал, но как только я удалю их, чтобы использовать их из mypackage.VHD, это дает мне ошибку. Я не могу понять, в чем проблема, спасибо вам за помощь в продвижении.VHDL, используя два компонента из второго файла

Вкратце: у меня есть 2 файла VHD, mypackage.VHD, с моими моими компонентами и с другим (alu.VHD), который использует компоненты mypackage.VHD с (USE WORK.mypackage.ALL;), выглядит он не может идентифицировать компоненты alu_1 из mypackage.VHD. Но не знаю почему.

Здесь ошибка:

** 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

Без идентификации, которая является строка 47 (ваши отсчеты пример строки не совпадают), можно отметить, что для объекта alu_32_generic декларации:

ENTITY alu_32_generic IS 

Название организации:

ARCHITECTURE alu_32 OF alu_32 IS 

не соответствует.

После коррекции имени лица в декларации архитектуры и закомментировать три использование положения не нужно:

-- USE ieee.std_logic_arith.ALL; 
    -- USE ieee.std_logic_unsigned.ALL; 
    -- USE WORK.mypackage.ALL; 

Вашего код анализирует (что Vcom делает).

Обратите внимание, что если вы включите предложение use more mypackage, декларация, найденная как декларативный элемент архитектуры, вытеснит ее в пакете. Предложение использования не влияет на вашу проблему.

От verror:

vcom Message # 1141:
The syntax requires a component name. The name given does not denote a component declaration.

Вы могли бы отметить два обычаи 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, скрывающейся.

Мораль этой истории здесь не повторяет объявления, которые вам не нужны, и получить имя объекта в объявлении архитектуры.

+0

У меня есть другой вопрос. Я не очень хорошо разбираюсь в VHDL, но у меня этот очень длинный код: zero <= result_i (31) ИЛИ result_i (30) ИЛИ result_i (29) ИЛИ result_i (28) ИЛИ result_i (27) ИЛИ result_i (26) ИЛИ result_i (25) ИЛИ result_i (24) ИЛИ result_i (23) ИЛИ result_i (22) ИЛИ result_i (21) ИЛИ result_i (20) ИЛИ result_i (19) ИЛИ result_i (18) ИЛИ result_i (17) ИЛИ result_i (16) ИЛИ result_i (15) ИЛИ result_i (14) ИЛИ result_i (13) ИЛИ result_i (12) ИЛИ result_i (11) ИЛИ result_i (10) ИЛИ result_i (9) ИЛИ result_i (8) ИЛИ result_i (7) ИЛИ result_i (6) ИЛИ result_i (5) ...); как я могу сделать это короче ха-ха? Благодарю. –

+0

Это зависит от того, как объявлен result_i и есть ли у вас инструмент синтеза IEEE Std 1076-2008. Если позже, то имеется единственный доступный оператор OR ('zero <= not или result_i;' - zero, если ни один бит result_i не установлен). Различные пакеты имеют логические операторы восстановления (например, Synopsys std_logic_misc 'zero <= not or_reduce (result_i);'), которые выполняют ту же самую функцию, что и вызовы функций. Существует также параллельное назначение ('zero <= '1', когда result_i = (others => '0') else '0';'). Существует эквивалент if. – user1155120