Мои операторы «ожидания» в коде моего тестового стенда вызывают синтаксические ошибки, и я не могу отследить источник ошибки, чтобы исправить ее. Ошибка, которую он производит:
Error: Syntax error near 'wait' Error: type error near ns ; current type time; expected type void Error: 'ns' is not a subprogram
Чего я не понимаю, поскольку все примеры, в том числе в учебнике для примеров с использованием операторов wait
и wait for
, были точно такими же, как я использую.
Я всю жизнь смотрел на этот файл тестового стенда, пытаясь понять, что это за синтаксическая ошибка. Я не могу определить, является ли это чем-то более ранним в моем коде с использованием неправильного типа, отсутствием знака препинания или чем-то еще. Предполагается, что это просто тестовый стенд для конечного автомата, который будет переключаться между сложением, вычитанием и умножением. A и B являются 4-битными входами, SEL — это кнопка, которая, когда она равна 1, изменяет состояние, а CLK использует нарастающий фронт для передачи любых изменений. Результат - 8-битный вывод.
Я даже не могу запустить симуляцию для проверки объекта и архитектуры, поскольку, когда я пытаюсь запустить симуляцию на Vivado, это не произойдет из-за синтаксиса рядом с оператором ожидания. Для контекста, в приведенном ниже фрагменте кода единственная подчеркнутая проблема, связанная с Vivado, связана со строкой wait for 10ns;
. Если я отформатирую его как wait for 10 ns;
, он выдает идентичные ошибки.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity HW9_TB is
end HW9_TB;
architecture Behavioral of HW9_TB is
component HW9 is
Port ( A : in signed (3 downto 0);
B : in signed (3 downto 0);
SEL : in STD_LOGIC;
Q : out STD_LOGIC_VECTOR (1 downto 0);
Result : out signed (7 downto 0);
CLK : in STD_LOGIC);
end component;
signal A : signed (3 downto 0) := "0000";
signal B : signed (3 downto 0) := "0000";
signal SEL : std_logic := '0';
signal CLK : std_logic := '0';
begin
T1 : HW9 PORT MAP (
A => A, B => B, SEL => SEL, CLK => CLK);
-- A=0, B=0, SEL=0, CLK=0
A <= "0000";
B <= "0000";
SEL <= '0';
CLK <= '0';
wait for 10ns;
Предоставьте минимальный воспроизводимый пример.
В дополнение к оператору процесса есть параллельный вызов процедуры в этом случае с сигнальными параметрами режима для A, B, SEL и CLK. Без каких-либо параметров сигнала режима in для использования в списке чувствительности процесс будет выполняться только один раз. Параллельные операторы представляют собой эквиваленты операторов блока и/или процесса, которым назначены драйверы для любых сигналов, поэтому вы должны присваивать значения конкретному сигналу в одном процессе.
Спасибо за помощь, предоставленная вами информация оказалась очень полезной. Кажется, основная проблема заключалась в том, что операторы не находились в блоке процесса, а я не знал, что они должны быть. Теперь я могу запускать симуляции и отлаживать свою логику, так что спасибо!
У вас две ошибки в коде:
wait
— это последовательный оператор, разрешенный только в process
, но вы написали его как параллельный оператор. Просто подумайте, что это должно означать вне процесса? Все параллельные операторы выполняются параллельно.Свернутая и исправленная версия вашей проблемы:
entity TB is
end TB;
architecture Behavioral of TB is
begin
--wait for 10 ns; -- Produces an error message, because not allowed here.
process
begin
wait for 10 ns; -- Here it is allowed.
end process;
end Behavioral;
Спасибо! Я понятия не имел, что операторы ожидания должны находиться в блоках процессов. Поскольку я поместил его в блок процесса, синтаксическая ошибка устранилась, и я могу запускать симуляции и отлаживать, я ценю помощь!
Рад был помочь, удачи! Пожалуйста, поймите, что VHDL — это не язык программирования, это язык описания. Вы можете написать материал, который выглядит как (последовательная) программа, но большая часть этого возможна только в симуляциях.
Оператор ожидания — это последовательный оператор. Он появляется здесь, в теле архитектуры, в месте параллельных операторов. Оператор ожидания и, возможно, предшествующие назначения сигналов должны быть в операторе процесса.