A multiplexer helps choose one input from many inputs and sends it to the output. It works like a switch that picks one wire to connect to the output.
Multiplexer design in Verilog
module mux2to1 (output wire y, input wire a, input wire b, input wire sel); assign y = sel ? b : a; endmodule
The module keyword defines the multiplexer block.
The assign statement uses a conditional operator to select input based on sel.
sel is 0, output is a. If sel is 1, output is b.module mux2to1 (output wire y, input wire a, input wire b, input wire sel); assign y = sel ? b : a; endmodule
module mux4to1 (output wire y, input wire [3:0] d, input wire [1:0] sel); assign y = d[sel]; endmodule
case statement inside an always block to select the output.module mux8to1 (output reg y, input wire [7:0] d, input wire [2:0] sel); always @(*) begin case(sel) 3'b000: y = d[0]; 3'b001: y = d[1]; 3'b010: y = d[2]; 3'b011: y = d[3]; 3'b100: y = d[4]; 3'b101: y = d[5]; 3'b110: y = d[6]; 3'b111: y = d[7]; endcase end endmodule
This program defines a 4-to-1 multiplexer and a testbench that tests all selector values. It prints the output for each selection.
module mux4to1 (output reg y, input wire [3:0] d, input wire [1:0] sel); always @(*) begin case(sel) 2'b00: y = d[0]; 2'b01: y = d[1]; 2'b10: y = d[2]; 2'b11: y = d[3]; default: y = 1'b0; endcase end endmodule module testbench; reg [3:0] data; reg [1:0] select; wire out; mux4to1 mux(out, data, select); initial begin data = 4'b1010; select = 2'b00; #10; $display("Select=00 Output=%b", out); select = 2'b01; #10; $display("Select=01 Output=%b", out); select = 2'b10; #10; $display("Select=10 Output=%b", out); select = 2'b11; #10; $display("Select=11 Output=%b", out); $finish; end endmodule
Multiplexers reduce the number of wires needed by sharing one output line.
Use always @(*) block with case for more complex multiplexers.
Remember to include a default case to avoid latches in combinational logic.
A multiplexer selects one input from many based on selector signals.
It is useful for routing signals efficiently in digital circuits.
Verilog multiplexers can be written using conditional operators or case statements.
Practice
Solution
Step 1: Understand the function of a multiplexer
A multiplexer routes one of many inputs to a single output based on selector signals.Step 2: Compare with other options
Other options describe functions unrelated to multiplexers, like storage or arithmetic.Final Answer:
To select one input from multiple inputs based on selector signals -> Option AQuick Check:
Multiplexer = Select input [OK]
- Confusing multiplexer with memory elements
- Thinking it performs calculations
- Mixing it up with clock generators
Solution
Step 1: Recall conditional operator syntax
The conditional operator in Verilog is: condition ? true_value : false_value.Step 2: Match syntax to multiplexer logic
For a 2-to-1 mux, output is in1 if sel=1, else in0. So, assign out = sel ? in1 : in0; is correct.Final Answer:
assign out = sel ? in1 : in0; -> Option CQuick Check:
Conditional operator = condition ? true : false [OK]
- Using bitwise operators instead of conditional
- Swapping true and false values
- Incorrect operator precedence
sel = 2'b10 and inputs are in0=0, in1=1, in2=1, in3=0?
module mux4to1(output reg out, input [1:0] sel, input in0, in1, in2, in3);
always @(*) begin
case(sel)
2'b00: out = in0;
2'b01: out = in1;
2'b10: out = in2;
2'b11: out = in3;
endcase
end
endmoduleSolution
Step 1: Identify selected input based on sel
sel = 2'b10 selects input in2 according to the case statement.Step 2: Check value of in2
in2 is given as 1, so output out = 1.Final Answer:
1 -> Option DQuick Check:
sel=2'b10 selects in2=1 [OK]
- Confusing binary selector values
- Ignoring case statement mapping
- Assuming default output without case
module mux2to1(output reg out, input sel, input in0, in1);
always @(*) begin
if (sel == 1) out = in1;
else if (sel == 0) out = in0;
else out = 1'bx;
end
endmoduleSolution
Step 1: Analyze selector signal type
sel is 1-bit, so it can only be 0 or 1, no other values possible.Step 2: Check necessity of default case
Since sel cannot be other than 0 or 1, the 'else out = 1'bx;' is unnecessary.Final Answer:
No default case needed for 1-bit sel -> Option BQuick Check:
1-bit sel only 0 or 1, no default needed [OK]
- Adding unreachable default cases
- Confusing reg and wire for outputs
- Forgetting sensitivity list is @(*)
case statement. Which of the following code snippets correctly implements this multiplexer assuming inputs in0 to in7, selector sel[2:0], and output out?Solution
Step 1: Check completeness of case statement
always @(*) begin case(sel) 3'b000: out = in0; 3'b001: out = in1; 3'b010: out = in2; 3'b011: out = in3; 3'b100: out = in4; 3'b101: out = in5; 3'b110: out = in6; 3'b111: out = in7; default: out = 1'b0; endcase end covers all 8 selector values (0 to 7) and includes a default case.Step 2: Verify correct input mapping
always @(*) begin case(sel) 3'b000: out = in0; 3'b001: out = in1; 3'b010: out = in2; 3'b011: out = in3; 3'b100: out = in4; 3'b101: out = in5; 3'b110: out = in6; 3'b111: out = in7; default: out = 1'b0; endcase end maps sel values 3'b000 to 3'b111 to in0 through in7 respectively, which is correct.Step 3: Identify issues in other options
always @(sel) begin if(sel == 0) out = in0; else if(sel == 1) out = in1; else if(sel == 2) out = in2; else if(sel == 3) out = in3; else if(sel == 4) out = in4; else if(sel == 5) out = in5; else if(sel == 6) out = in6; else if(sel == 7) out = in7; end uses if-else but sensitivity list is only sel, which is acceptable but lacks default. always @(*) begin case(sel) 3'b000: out = in7; 3'b001: out = in6; 3'b010: out = in5; 3'b011: out = in4; 3'b100: out = in3; 3'b101: out = in2; 3'b110: out = in1; 3'b111: out = in0; endcase end reverses input mapping incorrectly. always @(*) begin case(sel) 3'b000: out = in0; 3'b001: out = in1; 3'b010: out = in2; 3'b011: out = in3; 3'b100: out = in4; 3'b101: out = in5; 3'b110: out = in6; endcase end misses case for 3'b111.Final Answer:
Option A correctly implements 8-to-1 mux with case and default -> Option AQuick Check:
Complete case with all inputs mapped = always @(*) begin case(sel) 3'b000: out = in0; 3'b001: out = in1; 3'b010: out = in2; 3'b011: out = in3; 3'b100: out = in4; 3'b101: out = in5; 3'b110: out = in6; 3'b111: out = in7; default: out = 1'b0; endcase end [OK]
- Missing cases for some selector values
- Incorrect input to selector mapping
- No default case in case statement
Ready to prove it?
Pass the test and this pattern moves unknown
