複数の制御信号を使用してマルチプレクサを実装することは可能ですか? たとえば、次のようなことをしたい:
with (sig1 & sig2) select
output <= A when "00",
B when "01",
C when "10",
D when "11",
'0' when others;
それらを新しい信号に割り当てて使用できることはわかっていますが、それはできれば避けたいことです。
複数の制御信号を使用してマルチプレクサを実装することは可能ですか? たとえば、次のようなことをしたい:
with (sig1 & sig2) select
output <= A when "00",
B when "01",
C when "10",
D when "11",
'0' when others;
それらを新しい信号に割り当てて使用できることはわかっていますが、それはできれば避けたいことです。
コンパイラで VHDL2008 モードを有効にして動作させる必要があります。
代替案(2008年も):
muxing: process (sig1, sig2) is
begin -- process muxing
case sig1 & sig2 is
when "00" => output <= '1';
when "01" => output <= '0';
when "10" => output <= '0';
when "11" => output <= '1';
when others => output <= '0';
end case;
end process muxing;
コンパイラに VHDL-2008 モードがない場合、次のエラーで失敗します。
Array type case expression must be of a locally static subtype.
または類似。
sig1 & sig2
コンパイラを VHDL-2008 に準拠させることができない場合は、何が起こっているかをコンパイラに明示的に伝えるために を囲むために使用できる型を作成することで、これを回避する必要があります。
subtype twobits is bit_vector(0 to 1);
それで:
with twobits'(sig1 & sig2) select
output <= '1' when "00",
-- etc.
また:
case twobits'(sig1 & sig2) is
when "00" => -- etc.
これを見てください、多分それはあなたを助けるでしょう
entity MUX is
port ( a, i0, i1 : in bit;
o : out bit );
end MUX;
architecture behave of MUX is
begin
process ( a, i0, i1 ) begin
if a = '1' then
o <= i1;
else
o <= i0;
end if;
end process;
end behave;