A decoder changes a small input code into a bigger output with one active line. An encoder does the opposite, turning many inputs into a smaller output code.
Decoder and encoder design in VHDL
library ieee; use ieee.std_logic_1164.all; entity decoder_2to4 is port( input : in std_logic_vector(1 downto 0); output : out std_logic_vector(3 downto 0) ); end decoder_2to4; architecture behavior of decoder_2to4 is begin process(input) begin output <= (others => '0'); case input is when "00" => output(0) <= '1'; when "01" => output(1) <= '1'; when "10" => output(2) <= '1'; when "11" => output(3) <= '1'; when others => output <= (others => '0'); end case; end process; end behavior;
Use std_logic_vector for input and output signals representing bits.
The case statement helps select which output line to activate based on input.
entity encoder_4to2 is port( input : in std_logic_vector(3 downto 0); output : out std_logic_vector(1 downto 0) ); end encoder_4to2; architecture behavior of encoder_4to2 is begin process(input) begin case input is when "0001" => output <= "00"; when "0010" => output <= "01"; when "0100" => output <= "10"; when "1000" => output <= "11"; when others => output <= "00"; -- default end case; end process; end behavior;
architecture behavior of decoder_3to8 is begin process(input) begin output <= (others => '0'); case input is when "000" => output(0) <= '1'; when "001" => output(1) <= '1'; when "010" => output(2) <= '1'; when "011" => output(3) <= '1'; when "100" => output(4) <= '1'; when "101" => output(5) <= '1'; when "110" => output(6) <= '1'; when "111" => output(7) <= '1'; when others => output <= (others => '0'); end case; end process; end behavior;
This program defines a 2-to-4 decoder and a testbench that cycles through all inputs. It prints the input number and the output vector showing which output line is active.
library ieee; use ieee.std_logic_1164.all; entity decoder_2to4 is port( input : in std_logic_vector(1 downto 0); output : out std_logic_vector(3 downto 0) ); end decoder_2to4; architecture behavior of decoder_2to4 is begin process(input) begin output <= (others => '0'); case input is when "00" => output(0) <= '1'; when "01" => output(1) <= '1'; when "10" => output(2) <= '1'; when "11" => output(3) <= '1'; when others => output <= (others => '0'); end case; end process; end behavior; -- Testbench library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity tb_decoder is end tb_decoder; architecture test of tb_decoder is signal input : std_logic_vector(1 downto 0) := "00"; signal output : std_logic_vector(3 downto 0); begin uut: entity work.decoder_2to4 port map( input => input, output => output ); process begin for i in 0 to 3 loop input <= std_logic_vector(to_unsigned(i, 2)); wait for 10 ns; report "Input: " & integer'image(i) & " Output: " & std_logic_vector(output).to_string; end loop; wait; end process; end test;
Decoders usually have one active output line for each input code.
Encoders assume only one input line is active at a time to avoid confusion.
Use testbenches to verify your design by simulating different inputs.
A decoder turns a small input code into one active output line.
An encoder converts one active input line into a smaller output code.
Both are useful for selecting devices or compressing signals in digital circuits.
Practice
What is the main function of a decoder in VHDL?
Solution
Step 1: Understand the role of a decoder
A decoder takes a small binary input and activates exactly one output line corresponding to that input.Step 2: Compare with other options
Options A, B, and C describe other components or functions, not a decoder's main role.Final Answer:
It converts a binary input code into one active output line. -> Option AQuick Check:
Decoder = binary input to one active output [OK]
- Confusing decoder with encoder
- Thinking decoder stores data
- Assuming decoder performs arithmetic
Which of the following is the correct VHDL syntax to declare a 2-to-4 decoder output signal named Y as a 4-bit std_logic_vector?
Solution
Step 1: Understand std_logic_vector indexing
In VHDL, vectors are often declared with 'downto' for descending indices, so 3 downto 0 means 4 bits indexed 3,2,1,0.Step 2: Check options for correct 4-bit declaration
signal Y : std_logic_vector(3 downto 0); uses '3 downto 0' which is standard and correct. The other options are incorrect: B '0 downto 3' (invalid direction), C '3 downto 1' (3 bits), D '4 to 1' (invalid direction).Final Answer:
signal Y : std_logic_vector(3 downto 0); -> Option CQuick Check:
4-bit vector usually declared as 3 downto 0 [OK]
- Using incorrect index ranges
- Confusing 'to' and 'downto' keywords
- Declaring wrong vector size
Given the following VHDL code for a 2-to-4 decoder, what is the output Y when input A = "10"?
process(A)
begin
case A is
when "00" => Y <= "0001";
when "01" => Y <= "0010";
when "10" => Y <= "0100";
when "11" => Y <= "1000";
when others => Y <= "0000";
end case;
end process;Solution
Step 1: Match input A with case branches
The input A is "10", so the case statement matches the third when clause: when "10" => Y <= "0100".Step 2: Confirm output value
The output Y is assigned "0100" for input "10".Final Answer:
"0100" -> Option AQuick Check:
Input "10" activates third output "0100" [OK]
- Mixing up binary input values
- Choosing output for wrong input
- Ignoring 'when others' clause
Identify the error in this VHDL code snippet for a 4-to-2 encoder:
process(I) begin if I = "0001" then Y <= "00"; elsif I = "0010" then Y <= "01"; elsif I = "0100" then Y <= "10"; elsif I = "1000" then Y <= "11"; else Y <= "00"; end if; end process;
Solution
Step 1: Analyze input and output declarations
Input I is likely a 4-bit vector representing active lines; output Y is 2 bits encoding which input is active.Step 2: Check logic for multiple active inputs
The code assumes only one input bit is active at a time. It does not handle cases where multiple bits in I are '1', which is invalid for an encoder.Step 3: Review other options
Input I should be declared as std_logic_vector(3 downto 0). is likely true but not an error in this snippet. The process sensitivity list should include Y. is incorrect; Y should not be in sensitivity list. The output Y should be declared as std_logic_vector(3 downto 0). is wrong because Y is 2 bits, not 4.Final Answer:
The code does not handle multiple active inputs correctly. -> Option BQuick Check:
Encoder needs single active input line [OK]
- Ignoring multiple active inputs
- Incorrect sensitivity list
- Wrong output size declaration
You need to design a 3-to-8 decoder in VHDL that activates one output line based on a 3-bit input A. Which of the following code snippets correctly implements this decoder?
process(A)
begin
Y <= (others => '0');
case A is
when "000" => Y(0) <= '1';
when "001" => Y(1) <= '1';
when "010" => Y(2) <= '1';
when "011" => Y(3) <= '1';
when "100" => Y(4) <= '1';
when "101" => Y(5) <= '1';
when "110" => Y(6) <= '1';
when "111" => Y(7) <= '1';
when others => Y <= (others => '0');
end case;
end process;Solution
Step 1: Check output initialization
The line 'Y <= (others => '0');' sets all outputs to zero before activating one output line.Step 2: Verify case statement logic
Each case sets exactly one bit of Y to '1' based on input A, which is correct for a decoder.Step 3: Confirm syntax correctness
The case statement and assignments follow proper VHDL syntax.Final Answer:
This code correctly sets one output bit high and resets others to zero. -> Option DQuick Check:
Initialize outputs then activate one line [OK]
- Not resetting outputs before setting one
- Setting multiple outputs high
- Incorrect case statement syntax
Ready to prove it?
Pass the test and this pattern moves unknown
