Мультиплексор на VHDL

Я попытался создать мультиплексор:

LIBRARY ieee;
USE ieee.std_logic_1164.all;


--  Entity Declaration

ENTITY multiplekser IS
-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
PORT
(
U : IN STD_LOGIC_VECTOR(2 downto 0);
V : IN STD_LOGIC_VECTOR(2 downto 0);
W : IN STD_LOGIC_VECTOR(2 downto 0);
X : IN STD_LOGIC_VECTOR(2 downto 0);
Y : IN STD_LOGIC_VECTOR(2 downto 0);
S : IN STD_LOGIC_VECTOR(2 downto 0);
CS : IN STD_LOGIC;
M : OUT STD_LOGIC_VECTOR(2 downto 0)
);
-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!

END multiplekser;


--  Architecture Body

ARCHITECTURE multiplekser_architecture OF multiplekser IS


BEGIN
    PROCESS(CS)
    BEGIN
    if (CS = '1') then
        with S select
            M<=U when "000",
                V when "001",
                W when "010",
                X when "011",
                Y when others;
    else 
        M<="ZZZ";
    end if;
    END PROCESS;
END multiplekser_architecture;

но произошли некоторые ошибки: errors

Я делал это на Quartus II 64 бит. Вот моя блок-схема: блок-схема

CS - сигнал включения. Когда CS равно 0, M (выход) должен иметь высокий импеданс.


person Kulis    schedule 13.10.2014    source источник
comment
Ваш выбор With S выглядит проблематично. (Изменить: видно, что кто-то уже опубликовал исправление).   -  person Tal.Bary    schedule 13.10.2014


Ответы (1)


Вы используете параллельный оператор вместо ожидаемого последовательного оператора.

Вы должны использовать оператор case или набор операторов if. Например:

architecture multiplekser_architecture of multiplekser is
begin
    process(cs, s, u, v, w, x, y)
    begin
        if cs = '1' then
            case S is
                when "000"  => m <= u;
                when "001"  => m <= v;
                when "010"  => m <= w;
                when "011"  => m <= x;
                when others => m <= y;
            end case;
        else
            m <= "ZZZ";
        end if;
    end process;
end architecture;
person Bill Lynch    schedule 13.10.2014
comment
Код OP должен поддерживаться, если язык установлен на VHDL-2008 (ModelSim прекрасно его компилирует), но я попробовал его с 13.0 (последняя, ​​но, по общему признанию, не последняя версия), и похоже, что Altera's Соответствие требованиям 2008 года позади. - person fru1tbat; 13.10.2014
comment
@fru1tbat: А. Я основывал свой ответ на VHDL 2002. Спасибо, что собрали дополнительную информацию. - person Bill Lynch; 13.10.2014
comment
@Kulis: вы пытались установить язык на 2008? Что случилось? - person fru1tbat; 13.10.2014
comment
У меня только версия 13.1. - person Kulis; 15.10.2014