VHDL: ошибка при использовании оператора With Select When

Я изучаю VHDL, используя Altera Max V и Quartus, чтобы сделать несколько примеров, и у меня возникают проблемы при использовании оператора «With Select when». У меня есть простой декодер 2-4 следующим образом:

library ieee;
use ieee.std_logic_1164.all;

entity lesson9 is
    port(
        x: in std_logic_vector(1 downto 0);
        en: in std_logic;
        y: out std_logic_vector(3 downto 0)
    );
end lesson9;

architecture rtl of lesson9 is

signal outputBuff: std_logic_vector(3 downto 0);

begin
    decoder2to4: process(x)
    begin
        with x select
            outputBuff <= "0001" when "00",
                          "0010" when "01",
                          "0100" when "10",
                          "1000" when "11";
    end process decoder2to4;

    y <= outputBuff;
end rtl;

И я получил сообщение об ошибке:

возле текста "с"; ожидая «конец», или «(», или идентификатор («с» — зарезервированное ключевое слово), pr последовательный оператор

Я пытался проверить свой код, но не смог найти проблему?


person bienle    schedule 03.05.2017    source источник
comment
Какую версию Quartus вы используете? При выборе его конструкция VHDL-2008 не поддерживается более старой версией инструмента. Кроме того, обязательно включите VHDL-2008 для файла, если вы используете более новую версию Quartus.   -  person FritzDC    schedule 03.05.2017
comment
with ... select не является конструкцией VHDL-2008, но with ... select в последовательном коде (например, в процессе) является новым. Вам нужно либо удалить процесс, чтобы сделать with ... select параллельным, либо включить компиляцию с функциями 2008, если ваш инструмент их поддерживает.   -  person Paebbels    schedule 03.05.2017


Ответы (1)


Оператор with ... select представляет собой параллельный оператор присваивания сигнала, используемый вне процесса:

architecture rtl of lesson9 is

signal outputBuff: std_logic_vector(3 downto 0);

begin
    with x select
        outputBuff <= "0001" when "00",
                      "0010" when "01",
                      "0100" when "10",
                      "1000" when "11";

    y <= outputBuff when en='1' else (others=>'0');
end rtl;

Я также добавил сигнал en в оператор присваивания вывода.

Примечание. Я не моделировал этот фрагмент кода.

person Juergen    schedule 03.05.2017
comment
В VHDL 2008 также есть оператор последовательного назначения выбранного сигнала. См. IEEE Std 1076-2008 10.5 Оператор назначения сигнала и 10.5.4 Назначение выбранного сигнала. К сожалению, эта функция не поддерживается Quartus® Prime для синтез. - person ; 03.05.2017
comment
Почему вы добавили сигнал en в оператор вывода? В вопросе нет ничего, чтобы предположить, что это было необходимо. - person Matthew Taylor; 03.05.2017
comment
Что ж, в списке портов есть входной порт en и нетрудно догадаться, для чего он предназначен. Объявление входных портов, которые не используются в архитектуре, конечно, не является ошибкой, но инструменты синтеза/анализа могут жаловаться на это. Поэтому я рекомендую либо использовать порт, либо удалить его из списка портов. - person Juergen; 03.05.2017
comment
@Juergen, если не использовать объявленный сигнал, сигнал будет оптимизирован (то есть удален) в процессе синтеза без каких-либо жалоб. - person Roman; 03.05.2017
comment
Спасибо @Юрген. Я проверю это. - person bienle; 04.05.2017