У меня проблема с кодом 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;
У меня есть другой вопрос. Я не очень хорошо разбираюсь в 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) ...); как я могу сделать это короче ха-ха? Благодарю. –
Это зависит от того, как объявлен 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