📖 Scenario: You are designing a simple digital circuit that controls an LED based on a switch input. The LED should turn on when the switch is pressed and turn off when it is not pressed.
🎯 Goal: Build a Verilog module that uses an always block with if-else statements to control an LED output based on a switch input.
📋 What You'll Learn
Create a module named led_control with inputs and outputs
Use an always block triggered by the switch input
Use if-else inside the always block to set the LED output
Print the LED output value at the end
💡 Why This Matters
🌍 Real World
Controlling LEDs or other devices based on input signals is common in digital electronics and embedded systems.
💼 Career
Understanding if-else in always blocks is essential for hardware design engineers working with FPGA or ASIC development.
Progress0 / 4 steps
1
Create the module and inputs/outputs
Write a Verilog module named led_control with an input switch and an output led. Declare led as a reg type.
Verilog
Hint
Remember to declare led as reg because it will be assigned inside an always block.
2
Add the always block triggered by switch
Inside the led_control module, add an always block that is triggered on any change of switch.
Verilog
Hint
Use always @(switch) to trigger the block whenever switch changes.
3
Use if-else to control the LED output
Inside the always block, write an if-else statement that sets led to 1 if switch is 1, otherwise sets led to 0.
Verilog
Hint
Use if (switch == 1) to check the switch state and assign led accordingly.
4
Print the LED output value
Add a testbench module named testbench that instantiates led_control. In an initial block, assign switch to 0 and 1 with delays, and use $display to print the led value after each change.
Verilog
Hint
Use $display to print the values of switch and led after delays in the testbench.
Practice
(1/5)
1. What is the main purpose of using if-else statements inside always blocks in Verilog?
easy
A. To declare variables
B. To create loops
C. To control hardware behavior based on conditions
D. To define module ports
Solution
Step 1: Understand the role of always blocks
always blocks describe hardware that reacts to changes in signals.
Step 2: Understand if-else inside always
if-else lets hardware choose different actions based on conditions.
Final Answer:
To control hardware behavior based on conditions -> Option C
Quick Check:
if-else controls hardware actions = B [OK]
Hint: If-else decides hardware action by condition [OK]
Common Mistakes:
Thinking if-else declares variables
Confusing if-else with loops
Using if-else to define ports
2. Which of the following is the correct syntax for an if-else statement inside an always block in Verilog?
easy
A. always @ (posedge clk) if (a) begin b = 1; end else b = 0
B. always @ (posedge clk) if (a) b = 1; else b = 0;
C. always @ (posedge clk) if a { b = 1; } else { b = 0; }
D. always (posedge clk) if a then b = 1 else b = 0;
Solution
Step 1: Check the correct sensitivity list syntax
It must be always @ (posedge clk), not missing @ or parentheses.
Step 2: Check if-else syntax
Condition must be in parentheses, and statements can be single-line without begin-end.
Final Answer:
always @ (posedge clk) if (a) b = 1; else b = 0; -> Option B
Quick Check:
Correct always and if-else syntax = D [OK]
Hint: Use @ and parentheses for always and if conditions [OK]
Common Mistakes:
Omitting @ in always sensitivity
Missing parentheses around condition
Using braces {} instead of begin-end
3. What will be the value of out after the following code runs if sel = 1 and in = 5?
always @(*) begin
if (sel == 1)
out = in + 1;
else
out = in - 1;
end
medium
A. 4
B. 5
C. Undefined
D. 6
Solution
Step 1: Check the condition with given inputs
Since sel == 1 is true, the first branch executes.
Step 2: Calculate the assigned value
out = in + 1 = 5 + 1 = 6.
Final Answer:
6 -> Option D
Quick Check:
sel=1 triggers out=in+1=6 [OK]
Hint: Follow if condition and calculate assigned value [OK]
Common Mistakes:
Ignoring the if condition value
Subtracting instead of adding
Assuming out is unchanged
4. Identify the error in this Verilog code snippet:
always @ (posedge clk) begin
if (reset == 1)
count = 0;
else if (enable == 1)
count = count + 1;
end
medium
A. Using blocking assignment = instead of non-blocking <=
B. No default else to cover all cases
C. Missing begin-end after else if
D. Incorrect sensitivity list
Solution
Step 1: Check assignment type inside clocked always
Inside clocked blocks, non-blocking assignments (<=) should be used for registers.
Step 2: Verify other parts
Sensitivity list and if-else structure are correct; missing else is allowed but not best practice.
Final Answer:
Using blocking assignment = instead of non-blocking <= -> Option A
Quick Check:
Clocked always needs non-blocking <= [OK]
Hint: Use <= for assignments in clocked always blocks [OK]
Common Mistakes:
Using = instead of <= in sequential logic
Forgetting begin-end for multiple statements
Ignoring missing else cases
5. You want to design a 2-bit saturating counter using an always block with if-else. The counter increments on enable and resets to 0 on reset. It saturates at 3 (does not wrap). Which code snippet correctly implements this behavior?
hard
A. always @ (posedge clk) begin
if (reset) count <= 0;
else if (enable && count < 3) count <= count + 1;
else count <= count;
end
B. always @ (posedge clk) begin
if (reset) count = 0;
else if (enable) count = (count == 3) ? 3 : count + 1;
end
C. always @ (posedge clk) begin
if (reset) count <= 0;
else if (enable) count <= count + 1;
if (count > 3) count <= 3;
end
D. always @ (posedge clk) begin
if (reset) count <= 0;
else if (enable) count <= (count == 3) ? 0 : count + 1;
end
Solution
Step 1: Check reset and enable behavior
Reset sets count to 0; enable increments count only if less than 3.
Step 2: Verify saturation logic
always @ (posedge clk) begin
if (reset) count <= 0;
else if (enable && count < 3) count <= count + 1;
else count <= count;
end increments only if count < 3, else holds count, correctly saturating at 3.
Step 3: Check assignment type and completeness
Uses non-blocking <= and covers all cases with else count <= count.
Final Answer:
always @ (posedge clk) begin
if (reset) count <= 0;
else if (enable && count < 3) count <= count + 1;
else count <= count;
end -> Option A
Quick Check:
Saturate at 3 by conditional increment and hold = A [OK]
Hint: Increment only if less than max, else hold value [OK]
Common Mistakes:
Using blocking assignments in sequential logic
Resetting incorrectly or missing saturation check
Wrapping counter instead of saturating
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.