Multiplexers are trivially implemented as a logic operation. This form may be compact if the select input is already one-hot encoded, but otherwise has no particular advantage over any other form.
The Verilog version, however, does propagate X's in the select input if the logic equality operator (==) is used, although the resulting X propagation differs from that produced by the conditional operator. The table below shows the output of a 2-to-1 mux, with a select input of X:
| Input | ?: output | AND-OR output |
|---|---|---|
| 11 | 1 | X |
| 10 | X | X |
| 01 | X | X |
| 00 | 0 | 0 |
The AND-OR output is arguably preferable to the ?: output, since this output should also be produced by a gate-level model, and so would allow the RTL and gate-level models to simulate identically (2).
mux8to1_a4.v
module MUX8TO1(input [2:0] SEL, input [7:0] I, output O);
assign O =
((SEL == 0) & I[0]) | // normally use brackets for clarity,
SEL == 1 & I[1] | // but not required here (precedence
SEL == 2 & I[2] | // is: == -> & -> |)
SEL == 3 & I[3] |
SEL == 4 & I[4] |
SEL == 5 & I[5] |
SEL == 6 & I[6] |
SEL == 7 & I[7];
endmodule
VHDL is strongly-typed (3), so it is not possible to directly compare the select input against an integer. The to_integer function is therefore used to convert SEL to an integer (S) before the comparison. It is, similarly, not possible to directly combine boolean and std_logic quantities in an expression without overloading the operators. Rather than overloading the AND operator, this code defines function to_sl to convert the boolean result of the comparison to a std_logic. The std_logic result can then be directly combined with the data inputs. In practice, the subtype definition and the to_sl function would normally be in a project-wide package.
mux8to1_a4.vhd
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all; -- unsigned and to_integer
entity MUX8TO1 is
port (
SEL : in unsigned(2 downto 0);
I : in std_logic_vector(7 downto 0);
O : out std_logic);
end entity MUX8TO1;
architecture A of MUX8TO1 is
subtype int3 is integer range 0 to 7;
signal S : int3;
function to_sl(inp : boolean) return std_logic is
begin
if inp then
return '1';
else
return '0';
end if;
end function to_sl;
begin
S <= to_integer(SEL);
O <= (to_sl(S = 0) and I(0)) or -- brackets required when...
(to_sl(S = 1) and I(1)) or -- mixing 'and' and 'or'
(to_sl(S = 2) and I(2)) or
(to_sl(S = 3) and I(3)) or
(to_sl(S = 4) and I(4)) or
(to_sl(S = 5) and I(5)) or
(to_sl(S = 6) and I(6)) or
(to_sl(S = 7) and I(7));
end architecture A;