📖 Scenario: You are designing a simple digital circuit that outputs different signals based on a 2-bit input. This is like a traffic light controller that changes lights based on a selector switch.
🎯 Goal: Build a VHDL process that uses a case statement to set output signals depending on a 2-bit input value.
📋 What You'll Learn
Create a 2-bit input signal called selector
Create a 1-bit output signal called light
Create a process that triggers on changes to selector
Inside the process, use a case statement on selector
Set light to '1' or '0' based on selector values
Include a when others clause to handle unexpected values
💡 Why This Matters
🌍 Real World
Case statements inside processes are used in digital circuits to select different outputs based on input signals, like controlling lights, motors, or other devices.
💼 Career
Understanding case statements in VHDL processes is essential for hardware engineers and FPGA developers who design and test digital logic circuits.
Progress0 / 4 steps
1
Create input and output signals
Write the VHDL code to declare a 2-bit input signal called selector and a 1-bit output signal called light inside an entity named TrafficLight.
VHDL
Hint
Remember to declare selector as std_logic_vector(1 downto 0) and light as std_logic in the entity port.
2
Add a process triggered by selector
Inside the Behavioral architecture, write a process named light_control that is sensitive to selector.
VHDL
Hint
Use process(selector) to trigger on changes to selector. Name the process light_control.
3
Use a case statement inside the process
Inside the light_control process, write a case statement on selector with these rules: when "00" set light to '0', when "01" set light to '1', when "10" set light to '0', when "11" set light to '1', and use when others to set light to '0'.
VHDL
Hint
Use case selector is and set light using <= inside each when branch.
4
Simulate and output the light signal
Add a simple testbench process inside the architecture to print the value of light for each selector value from "00" to "11". Use report statements to display the output.
VHDL
Hint
Use a for loop from 0 to 3, assign selector using std_logic_vector(to_unsigned(i, 2)), wait 10 ns, then report the values.
Practice
(1/5)
1. What is the main purpose of a case statement inside a VHDL process?
easy
A. To select actions based on the value of a signal
B. To declare new signals inside the process
C. To loop through a range of values
D. To assign default values to all signals
Solution
Step 1: Understand the role of case statement
The case statement chooses different actions depending on the value of a signal.
Step 2: Compare with other options
Declaring signals, looping, or assigning defaults are not the main purpose of case.
Final Answer:
To select actions based on the value of a signal -> Option A
Quick Check:
Case statement = select actions by signal value [OK]
Hint: Case picks actions by signal value inside process [OK]
Common Mistakes:
Thinking case declares signals
Confusing case with loops
Assuming case assigns default values
2. Which of the following is the correct syntax to start a case statement inside a VHDL process for signal sel?
easy
A. switch sel is
B. case (sel) then
C. if sel then
D. case sel is
Solution
Step 1: Recall VHDL case syntax
The correct syntax to start a case statement is case signal_name is.
Step 2: Check each option
case sel is matches the correct syntax. Options A, B, and D are incorrect VHDL syntax.
Final Answer:
case sel is -> Option D
Quick Check:
Correct case syntax = "case signal is" [OK]
Hint: Use 'case signal is' to start a case statement [OK]
Common Mistakes:
Using 'switch' instead of 'case'
Adding parentheses or 'then' incorrectly
Confusing case with if statement
3. Given the following VHDL process, what will be the value of out_signal when sel = "10"?
process(sel)
begin
case sel is
when "00" => out_signal <= '0';
when "01" => out_signal <= '1';
when "10" => out_signal <= '0';
when others => out_signal <= '1';
end case;
end process;
medium
A. '1'
B. Syntax error
C. '0'
D. Undefined
Solution
Step 1: Find matching case branch for sel = "10"
The case statement has a branch when "10" => out_signal <= '0'; which matches the input.
Step 2: Determine assigned value
For sel = "10", out_signal is assigned '0'.
Final Answer:
'0' -> Option C
Quick Check:
sel "10" sets out_signal to '0' [OK]
Hint: Match sel value to case branch to find output [OK]
Common Mistakes:
Choosing default 'others' branch incorrectly
Confusing '0' and '1' assignments
Assuming syntax error without checking code
4. Identify the error in this VHDL process using a case statement:
process(sel)
begin
case sel is
when "00" => out_signal <= '0';
when "01" => out_signal <= '1';
when others => out_signal <= '0';
end case;
end process;
medium
A. No error, code is correct
B. Missing semicolon after 'end case'
C. Missing 'when "10"' branch for sel
D. Incorrect use of 'others' keyword
Solution
Step 1: Check syntax and completeness
The case statement covers "00", "01", and uses when others to cover all other values.
Step 2: Verify syntax correctness
Semicolons and keywords are correctly placed; no syntax errors found.
Final Answer:
No error, code is correct -> Option A
Quick Check:
Proper use of 'others' covers missing cases [OK]
Hint: Use 'when others' to cover all missing cases [OK]
Common Mistakes:
Thinking all cases must be listed explicitly
Assuming missing branch causes error without 'others'
Misplacing semicolons
5. You want to design a VHDL process that sets out_signal to '1' only when sel is "01" or "11", and '0' otherwise. Which case statement inside the process correctly implements this?
hard
A. case sel is
when "01" | "11" => out_signal <= '1';
when others => out_signal <= '0';
end case;
B. case sel is
when "01" => out_signal <= '1';
when "11" => out_signal <= '1';
when others => out_signal <= '0';
end case;
C. case sel is
when "01" => out_signal <= '1';
when others => out_signal <= '0';
end case;
D. case sel is
when "01" => out_signal <= '1';
when "10" => out_signal <= '1';
when others => out_signal <= '0';
end case;
Solution
Step 1: Identify required conditions
Set out_signal to '1' only for sel = "01" or sel = "11", else '0'.
Step 2: Check each option for correctness
case sel is
when "01" | "11" => out_signal <= '1';
when others => out_signal <= '0';
end case; uses invalid syntax with '|' for multiple choices in VHDL case. case sel is
when "01" => out_signal <= '1';
when "11" => out_signal <= '1';
when others => out_signal <= '0';
end case; lists both cases separately, which is correct. case sel is
when "01" => out_signal <= '1';
when others => out_signal <= '0';
end case; misses "11" case. case sel is
when "01" => out_signal <= '1';
when "10" => out_signal <= '1';
when others => out_signal <= '0';
end case; incorrectly uses "10" instead of "11".
Final Answer:
Option B with separate when clauses for "01" and "11" -> Option B
Quick Check:
Separate when lines for each value = correct VHDL [OK]
Hint: List each case separately; no '|' for multiple values in VHDL [OK]
Common Mistakes:
Using '|' to combine cases (invalid in VHDL)
Missing one required case
Confusing similar bit patterns
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.