A decoder helps turn a small number of input signals into many output signals. It is like a translator that picks one output based on the input.
When you want to select one device out of many using a few control signals.
When you need to convert binary input into a one-hot output signal.
When building memory address decoding circuits.
When designing control units that activate only one operation at a time.
When you want to simplify complex decision-making in hardware.
Syntax
Verilog
module decoder #(parameter n = 2) (input [n-1:0] in, output reg [2**n-1:0] out);
always @(*) begin
out = 0;
case(in)
0: out = 1 << 0;
1: out = 1 << 1;
// ... other cases ...
default: out = 0;
endcase
end
endmodule
The input is a binary number with n bits.
The output is a one-hot signal with 2^n bits, where only one bit is 1.
Examples
This is a 2-to-4 decoder. It takes 2 input bits and activates one of 4 outputs.
Verilog
module decoder2to4(input [1:0] in, output reg [3:0] out);
always @(*) begin
out = 4'b0000;
case(in)
2'b00: out = 4'b0001;
2'b01: out = 4'b0010;
2'b10: out = 4'b0100;
2'b11: out = 4'b1000;
default: out = 4'b0000;
endcase
end
endmodule
This is a 3-to-8 decoder. It activates one output out of 8 based on 3 input bits.
Verilog
module decoder3to8(input [2:0] in, output reg [7:0] out);
always @(*) begin
out = 8'b00000000;
case(in)
3'b000: out = 8'b00000001;
3'b001: out = 8'b00000010;
3'b010: out = 8'b00000100;
3'b011: out = 8'b00001000;
3'b100: out = 8'b00010000;
3'b101: out = 8'b00100000;
3'b110: out = 8'b01000000;
3'b111: out = 8'b10000000;
default: out = 8'b00000000;
endcase
end
endmodule
Sample Program
This program defines a 2-to-4 decoder and a testbench that shows how the output changes for each input.
Verilog
module decoder2to4(input [1:0] in, output reg [3:0] out);
always @(*) begin
out = 4'b0000;
case(in)
2'b00: out = 4'b0001;
2'b01: out = 4'b0010;
2'b10: out = 4'b0100;
2'b11: out = 4'b1000;
default: out = 4'b0000;
endcase
end
endmodule
// Testbench
module test_decoder;
reg [1:0] in;
wire [3:0] out;
decoder2to4 uut(.in(in), .out(out));
initial begin
$display("Input | Output");
in = 2'b00; #10 $display("%b | %b", in, out);
in = 2'b01; #10 $display("%b | %b", in, out);in = 2'b10; #10 $display("%b | %b", in, out);
in = 2'b11; #10 $display("%b | %b", in, out);
$finish;
end
endmodule
OutputSuccess
Important Notes
Always initialize the output inside the always block to avoid latches.
Use 'case' statements for clear and readable decoder logic.
Make sure output width matches 2^n where n is input width.
Summary
A decoder converts binary inputs into one-hot outputs.
It is useful for selecting one option out of many.
Verilog 'case' statements make decoder design simple and clear.
Practice
(1/5)
1. What is the main function of a decoder in Verilog?
easy
A. Add two binary numbers
B. Convert binary inputs into one-hot outputs
C. Store data temporarily
D. Generate clock signals
Solution
Step 1: Understand decoder purpose
A decoder takes binary inputs and activates exactly one output line corresponding to the input value.
Step 2: Compare options
Only Convert binary inputs into one-hot outputs describes converting binary inputs into one-hot outputs, which matches the decoder function.
Final Answer:
Convert binary inputs into one-hot outputs -> Option B
Quick Check:
Decoder = binary to one-hot [OK]
Hint: Remember: decoder activates one output per input [OK]
Common Mistakes:
Confusing decoder with adder
Thinking decoder stores data
Mixing decoder with clock generator
2. Which of the following is the correct syntax to start a 2-to-4 decoder module in Verilog?
easy
A. module decoder2to4(input [1:0] in, output reg [3:0] out);
B. module decoder2to4(output [1:0] in, input [3:0] out);
C. module decoder2to4(input in[1:0], output out[3:0]);
D. module decoder2to4(input [3:0] in, output [1:0] out);
Solution
Step 1: Check input and output declaration
Inputs and outputs must be declared with direction and bit width inside square brackets before the variable name.
Step 2: Validate syntax correctness
module decoder2to4(input [1:0] in, output reg [3:0] out); correctly declares input as 2 bits and output as 4 bits with proper syntax.
Final Answer:
module decoder2to4(input [1:0] in, output reg [3:0] out); -> Option A
Hint: Inputs before outputs, use [msb:lsb] notation [OK]
Common Mistakes:
Swapping input and output directions
Placing bit width after variable name
Using wrong bit widths
3. Given this Verilog code snippet for a 2-to-4 decoder:
always @(*) begin
case(in)
2'b00: out = 4'b0001;
2'b01: out = 4'b0010;
2'b10: out = 4'b0100;
2'b11: out = 4'b1000;
default: out = 4'b0000;
endcase
end
What is the value of out when in = 2'b10?
medium
A. 4'b0100
B. 4'b0010
C. 4'b0001
D. 4'b1000
Solution
Step 1: Locate matching case for input
Input 2'b10 matches the third case line: 2'b10: out = 4'b0100;
Step 2: Determine output value
Output is assigned 4'b0100 for input 2'b10.
Final Answer:
4'b0100 -> Option A
Quick Check:
Input 2'b10 maps to 4'b0100 [OK]
Hint: Match input bits to case labels exactly [OK]
Common Mistakes:
Confusing binary values
Ignoring default case
Misreading bit order
4. Identify the error in this 3-to-8 decoder Verilog code snippet:
always @(*) begin
case(in)
3'b000: out = 8'b00000001;
3'b001: out = 8'b00000010;
3'b010: out = 8'b00000100;
3'b011: out = 8'b00001000;
3'b100: out = 8'b00010000;
3'b101: out = 8'b00100000;
3'b110: out = 8'b01000000;
// Missing case for 3'b111
endcase
end
medium
A. Case statement syntax is invalid
B. Output width is incorrect
C. Input width should be 4 bits
D. Missing default case to cover all inputs
Solution
Step 1: Check case coverage
The case statement covers inputs 3'b000 to 3'b110 but misses 3'b111.
Step 2: Importance of default case
Without a default case, input 3'b111 leads to undefined output, which is an error.
Final Answer:
Missing default case to cover all inputs -> Option D
Quick Check:
Always include default case in decoders [OK]
Hint: Always add default case for full input coverage [OK]
Common Mistakes:
Forgetting default case
Assuming all inputs covered without default
Incorrect input or output widths
5. You want to design a 4-to-16 decoder in Verilog using a case statement. Which approach correctly handles all inputs and ensures only one output bit is high at a time?
hard
A. Use if-else statements checking each bit of input separately to assign outputs
B. Use a case statement with only 8 cases and assign outputs for the rest as zeros
C. Use a case statement with 16 cases for inputs 4'b0000 to 4'b1111, assigning one-hot outputs, plus a default output of all zeros
D. Use a for loop inside always block to assign outputs based on input value
Solution
Step 1: Understand decoder requirements
A 4-to-16 decoder must cover all 16 input combinations with one-hot outputs.
Step 2: Evaluate options for completeness and correctness
Use a case statement with 16 cases for inputs 4'b0000 to 4'b1111, assigning one-hot outputs, plus a default output of all zeros uses a case statement with all 16 input cases plus a default, ensuring exactly one output bit is high per input.
Final Answer:
Use a case statement with 16 cases for inputs 4'b0000 to 4'b1111, assigning one-hot outputs, plus a default output of all zeros -> Option C
Quick Check:
Complete case coverage with one-hot outputs = Use a case statement with 16 cases for inputs 4'b0000 to 4'b1111, assigning one-hot outputs, plus a default output of all zeros [OK]
Hint: Cover all inputs explicitly with one-hot outputs [OK]
Common Mistakes:
Missing cases causing undefined outputs
Using incomplete case statements
Trying to assign outputs with if-else inefficiently
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.