A multiplexer helps choose one input from many and sends it to the output. It saves wiring and makes circuits simpler.
Multiplexer design in VHDL
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity mux is Port ( sel : in STD_LOGIC_VECTOR(n-1 downto 0); inputs : in STD_LOGIC_VECTOR(2**n-1 downto 0); output : out STD_LOGIC ); end mux; architecture Behavioral of mux is begin process(sel, inputs) begin case sel is when "00" => output <= inputs(0); when "01" => output <= inputs(1); when "10" => output <= inputs(2); when "11" => output <= inputs(3); when others => output <= '0'; end case; end process; end Behavioral;
The sel input chooses which input to send to the output.
The number of inputs is 2 to the power of the number of bits in sel.
entity mux2to1 is Port ( sel : in STD_LOGIC; a, b : in STD_LOGIC; y : out STD_LOGIC ); end mux2to1; architecture Behavioral of mux2to1 is begin y <= a when sel = '0' else b; end Behavioral;
entity mux4to1 is Port ( sel : in STD_LOGIC_VECTOR(1 downto 0); d0, d1, d2, d3 : in STD_LOGIC; y : out STD_LOGIC ); end mux4to1; architecture Behavioral of mux4to1 is begin process(sel, d0, d1, d2, d3) begin case sel is when "00" => y <= d0; when "01" => y <= d1; when "10" => y <= d2; when "11" => y <= d3; when others => y <= '0'; end case; end process; end Behavioral;
This program defines a 4-to-1 multiplexer and a testbench that changes the selector to show which input is passed to the output.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity mux4to1 is Port ( sel : in STD_LOGIC_VECTOR(1 downto 0); d0, d1, d2, d3 : in STD_LOGIC; y : out STD_LOGIC ); end mux4to1; architecture Behavioral of mux4to1 is begin process(sel, d0, d1, d2, d3) begin case sel is when "00" => y <= d0; when "01" => y <= d1; when "10" => y <= d2; when "11" => y <= d3; when others => y <= '0'; end case; end process; end Behavioral; -- Testbench library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity tb_mux4to1 is end tb_mux4to1; architecture Behavioral of tb_mux4to1 is signal sel : STD_LOGIC_VECTOR(1 downto 0) := "00"; signal d0, d1, d2, d3 : STD_LOGIC := '0'; signal y : STD_LOGIC; begin uut: entity work.mux4to1 port map(sel => sel, d0 => d0, d1 => d1, d2 => d2, d3 => d3, y => y); process begin d0 <= '0'; d1 <= '1'; d2 <= '0'; d3 <= '1'; sel <= "00"; wait for 10 ns; report "sel=00, y=" & STD_LOGIC'image(y); sel <= "01"; wait for 10 ns; report "sel=01, y=" & STD_LOGIC'image(y); sel <= "10"; wait for 10 ns; report "sel=10, y=" & STD_LOGIC'image(y); sel <= "11"; wait for 10 ns; report "sel=11, y=" & STD_LOGIC'image(y); wait; end process; end Behavioral;
Use process and case statements to clearly select inputs based on selector bits.
Remember to include all possible selector values and a default when others case to avoid latches.
Test your multiplexer with a testbench to verify it works as expected.
A multiplexer selects one input from many using selector bits.
In VHDL, use case inside a process or conditional assignments to design multiplexers.
Testing with different selector values ensures your design works correctly.
Practice
Solution
Step 1: Understand the function of a multiplexer
A multiplexer chooses one input from many inputs based on selector signals.Step 2: Identify the correct purpose
It outputs the selected input to a single output line.Final Answer:
To select one input from multiple inputs and send it to the output -> Option CQuick Check:
Multiplexer = input selector [OK]
- Confusing multiplexer with arithmetic unit
- Thinking multiplexer stores data
- Assuming multiplexer generates clocks
Solution
Step 1: Determine selector size for 4 inputs
For 4 inputs, selector needs 2 bits (log2(4) = 2).Step 2: Match selector declaration
std_logic_vector(1 downto 0) is 2 bits wide, correct for 4-to-1 mux.Final Answer:
signal sel : std_logic_vector(1 downto 0); -> Option DQuick Check:
2-bit selector for 4 inputs [OK]
- Using 4 bits for selector of 4 inputs
- Using single bit for multiple inputs
- Using integer instead of std_logic_vector
y when sel = '1' and inputs are a = '0', b = '1'?
process(sel, a, b)
begin
if sel = '0' then
y <= a;
else
y <= b;
end if;
end process;Solution
Step 1: Check selector value and inputs
Selector sel = '1', inputs a = '0', b = '1'.Step 2: Follow if-else logic
If sel = '0', output y = a; else y = b. Since sel = '1', y = b = '1'.Final Answer:
'1' -> Option AQuick Check:
sel=1 outputs b=1 [OK]
- Confusing sel '0' and '1' cases
- Assuming output is 'Z' (high impedance)
- Ignoring input values
process(sel, d0, d1, d2, d3)
begin
case sel is
when "00" => y <= d0;
when "01" => y <= d1;
when "10" => y <= d2;
when others => y <= d3;
end case;
end process;Solution
Step 1: Check selector declaration
The code uses sel as 2-bit vector ("00", "01", "10"), so sel must be declared as std_logic_vector(1 downto 0).Step 2: Identify missing or incorrect declaration
If sel is not declared as 2 bits wide, the case statement will cause errors.Final Answer:
Selector signal sel is not declared as 2 bits wide -> Option AQuick Check:
Selector width must match case values [OK]
- Forgetting to declare selector width
- Leaving out signals in sensitivity list
- Misusing 'when others' in case
case statement. Which of the following selector signal declarations and case statement headers is correct?Solution
Step 1: Determine selector size for 8 inputs
8 inputs require 3 bits selector (log2(8) = 3), so sel must be 3 bits wide.Step 2: Match selector declaration and case values
signal sel : std_logic_vector(2 downto 0); ... case sel is when "000" => ... when "111" => ... uses std_logic_vector(2 downto 0) which is 3 bits, and case values from "000" to "111" which is correct.Final Answer:
signal sel : std_logic_vector(2 downto 0); ... case sel is when "000" => ... when "111" => ... -> Option BQuick Check:
3-bit selector for 8 inputs [OK]
- Using 4 bits for 8 inputs selector
- Using 1 or 2 bits for 8 inputs
- Mismatching case values and selector width
Ready to prove it?
Pass the test and this pattern moves unknown
