Неизвестная синтаксическая ошибка рядом с оператором ожидания VHDL

Мои операторы «ожидания» в коде моего тестового стенда вызывают синтаксические ошибки, и я не могу отследить источник ошибки, чтобы исправить ее. Ошибка, которую он производит:

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;

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

user16145658 17.11.2022 05:59

Предоставьте минимальный воспроизводимый пример.

user16145658 17.11.2022 06:29

В дополнение к оператору процесса есть параллельный вызов процедуры в этом случае с сигнальными параметрами режима для A, B, SEL и CLK. Без каких-либо параметров сигнала режима in для использования в списке чувствительности процесс будет выполняться только один раз. Параллельные операторы представляют собой эквиваленты операторов блока и/или процесса, которым назначены драйверы для любых сигналов, поэтому вы должны присваивать значения конкретному сигналу в одном процессе.

user16145658 17.11.2022 21:56

Спасибо за помощь, предоставленная вами информация оказалась очень полезной. Кажется, основная проблема заключалась в том, что операторы не находились в блоке процесса, а я не знал, что они должны быть. Теперь я могу запускать симуляции и отлаживать свою логику, так что спасибо!

Adam Porter 17.11.2022 22:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас две ошибки в коде:

  1. wait — это последовательный оператор, разрешенный только в process, но вы написали его как параллельный оператор. Просто подумайте, что это должно означать вне процесса? Все параллельные операторы выполняются параллельно.
  2. Единица времени должна быть отделена от значения пробелом.

Свернутая и исправленная версия вашей проблемы:

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;

Спасибо! Я понятия не имел, что операторы ожидания должны находиться в блоках процессов. Поскольку я поместил его в блок процесса, синтаксическая ошибка устранилась, и я могу запускать симуляции и отлаживать, я ценю помощь!

Adam Porter 17.11.2022 23:01

Рад был помочь, удачи! Пожалуйста, поймите, что VHDL — это не язык программирования, это язык описания. Вы можете написать материал, который выглядит как (последовательная) программа, но большая часть этого возможна только в симуляциях.

the busybee 18.11.2022 08:04

Другие вопросы по теме