Ошибка синтаксического анализа VHDL, неожиданный INTEGER_LITERAL, ожидание RETURN, IDENTIFIER или RSQBRACK Ошибка проверки синтаксиса процесса

Я пишу программу VHDL для MUX 4:1 и сталкиваюсь с ошибкой в ​​строке, где начинается предложение процесса.


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity mux_41 is
    Port ( inp : in  STD_LOGIC_VECTOR (0 downto 3);
           outp : out  STD_LOGIC;
           sel : in  STD_LOGIC_VECTOR (1 downto 0));
end mux_41;

architecture Behavioral of mux_41 is

begin
    Process(inp[0],inp[1],inp[2],inp[3],sel[0],sel[1])
        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 Behavioral;

Это правильный способ передать список конфиденциальности в процесс?


person KshitijV97    schedule 10.09.2019    source источник


Ответы (2)


В VHDL, когда вы хотите получить доступ к определенному элементу массива (std_logic_vector — это массив), вы должны использовать () вместо [].

Process(inp(0),inp(1),inp(2),inp(3),sel(0),sel(1))
  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;
person Gautitho    schedule 10.09.2019

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 называется нисходящим диапазоном; если LR, то диапазон является нулевым диапазоном. ...

При использовании списка чувствительности процесса предполагается, что оператор процесса (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