OP не показывает полное сообщение об ошибке.
Похоже, он находится в списке конфиденциальности для процесса, где inp
– это сигнал_name, а конкретный синтаксический анализатор не использует синтаксические предикаты:
IEEE Std 1076-2008 10.2 Операторы ожидания
чувствительность_список ::= имя_сигнала { , имя_сигнала }
и здесь все выбранные имена (8.3) являются статическими именами (8.1), и все элементы как sel
, так и inp
оцениваются в операторе процесса if (10.8) и должны быть включены в набор чувствительности (10.2).
1.3.2 Синтаксическое описание
Форма описания VHDL описывается с помощью контекстно-свободного синтаксиса с использованием простого варианта формы Бэкуса-Наура (БНФ); особенно:
...
g) Если название какой-либо синтаксической категории начинается с выделенной курсивом части, оно эквивалентно названию категории без выделенной курсивом части. Выделенная курсивом часть предназначена для передачи некоторой семантической информации. Например, type_name и subtype_name синтаксически эквивалентны одному имени
...
Можно написать синтаксический анализатор, который использует таблицу символов, содержащую объявления именованных сущностей (которые предшествуют использованию имени в описании). Он упрощает как синтаксический, так и семантический анализ, позволяя отслеживать правила видимости и охвата.
В любом случае неиспользование синтаксических предикатов приводит к другому сообщению об ошибке. Вместо ошибки, описывающей сигнал как не имеющий сигнатуры, вы получаете сообщение об ошибке, в котором говорится, что сигнатура искажена или неприменима (существует несколько правил, которые могут быть применимы без синтаксических предикатов).
На самом деле ошибка возникает для первой левой квадратной скобки. В выбранных именах используются круглые скобки (круглые скобки в частях или Европе) вместо квадратных скобок. Также inp
сам по себе имеет элементы 3 до 0 или 0 до 3 (обратите внимание, что inp : in STD_LOGIC_VECTOR (0 downto 3)
имеет нулевой диапазон (5,2 .1) и без элементов).
5.2.1 абзацы 3 и 4:
Диапазон определяет подмножество значений скалярного типа. Диапазон называется нулевым диапазоном, если указанное подмножество пусто.
Диапазон от L до R называется возрастающим диапазоном; если L > R, то диапазон является нулевым диапазоном. Диапазон от L до R называется нисходящим диапазоном; если L ‹ R, то диапазон является нулевым диапазоном. ...
При использовании списка чувствительности процесса предполагается, что оператор процесса (11.3) имеет один неявный оператор ожидания в качестве последнего последовательного оператора. Правило построения набора чувствительности для неявного оператора ожидания в операторе процесса находится в 10.2 Оператор ожидания, где неявный оператор ожидания будет использовать самый длинный статический префикс (8.1) любого имени сигнала в списке чувствительности процесса и будет эквивалентен до process (sel, inp)
.
11.3 Пункт 4 описания процесса:
Если список чувствительности процесса появляется после зарезервированного слова process, то предполагается, что оператор процесса содержит неявный оператор ожидания в качестве последнего оператора части оператора процесса; этот неявный оператор ожидания имеет форму
подождать сенситивность_список ;
где список чувствительности определяется одним из двух способов. Если список конфиденциальности процесса указан как список конфиденциальности, то список конфиденциальности оператора ожидания следует за зарезервированным словом process. ...
10.2 Пункты 3 и 4 оператора ожидания:
Предложение чувствительности определяет набор чувствительности оператора ожидания, то есть набор сигналов, к которым чувствителен оператор ожидания. Каждое имя сигнала в списке чувствительности идентифицирует данный сигнал как элемент набора чувствительности. Каждое имя сигнала в списке чувствительности должно быть статическим именем сигнала, и каждое имя должно обозначать сигнал, для которого разрешено считывание. Если предложение чувствительности не появляется, набор чувствительности строится в соответствии со следующим (рекурсивным) правилом:
Изначально набор чувствительности пуст. Для каждого основного в условии пункта условия, если основной
— Простое имя, обозначающее сигнал, добавьте самый длинный статический префикс имени в набор чувствительности.
— Расширенное имя, обозначающее сигнал, добавьте самый длинный статический префикс имени в набор чувствительности.
— Выбранное имя, префикс которого обозначает сигнал, добавить самый длинный статический префикс имени в набор чувствительности.
— Индексированное имя, префикс которого обозначает сигнал, добавить самый длинный статический префикс имени в набор чувствительности и применить это правило применяется ко всем выражениям в индексированном имени.
— имя среза, префикс которого обозначает сигнал, добавить самый длинный статический префикс имени к набору чувствительности и применить это правило ко всем выражениям, появляющимся в дискретном диапазоне среза. имя.
...
Это правило также используется для построения наборов чувствительности операторов ожидания в эквивалентных операторах процесса для параллельных операторов вызова процедур (11.4), параллельных операторов подтверждения (11.5) и параллельных операторов назначения сигналов (11.6). Кроме того, это правило используется для создания списка чувствительности неявного оператора ожидания в операторе процесса, список чувствительности процесса которого представляет собой зарезервированное слово all (11.3).
Это говорит нам о том, что в списке конфиденциальности достаточно самого длинного статического префикса.
8.1 пункт 7:
Имя статического сигнала — это статическое имя, обозначающее сигнал. Самый длинный статический префикс имени сигнала — это само имя, если имя является статическим именем сигнала; в противном случае это самый длинный префикс имени, который является именем статического сигнала. ...
С ненулевым диапазоном для inp
, используя круглые скобки вместо квадратных скобок, ваш mux_41 could be expressed
:
library ieee;
use ieee.std_logic_1164.all;
entity mux_41 is
port (
inp: in std_logic_vector (3 downto 0);
outp: out std_logic;
sel: in std_logic_vector (1 downto 0)
);
end entity mux_41;
architecture behavioral of mux_41 is
begin
process (sel, inp)
begin
if sel = "00" then
outp <= inp(0);
elsif sel = "01" then
outp <= inp(1);
elsif sel = "10" then
outp <= inp(2);
else
outp <= inp(3);
end if;
end process;
end architecture behavioral;
Здесь список чувствительности процесса снабжен самым длинным статическим префиксом.
Этот код будет успешно проанализирован (скомпилирован).
person
Community
schedule
10.09.2019