Watchdog timer design in VHDL - Time & Space Complexity
We want to understand how the time it takes for a watchdog timer to operate changes as its input size grows.
Specifically, we ask: how does the number of steps the timer takes grow when the timer counts higher?
Analyze the time complexity of the following VHDL watchdog timer process.
process(clk, reset)
begin
if reset = '1' then
counter <= 0;
elsif rising_edge(clk) then
if counter < MAX_COUNT then
counter <= counter + 1;
else
timeout <= '1';
end if;
end if;
end process;
This code counts clock pulses until it reaches a maximum count, then signals a timeout.
Look for loops or repeated steps in the code.
- Primary operation: Incrementing the counter on each clock pulse.
- How many times: Up to MAX_COUNT times before timeout triggers.
The number of increments grows directly with MAX_COUNT.
| Input Size (MAX_COUNT) | Approx. Operations (increments) |
|---|---|
| 10 | 10 |
| 100 | 100 |
| 1000 | 1000 |
Pattern observation: The steps increase in a straight line as MAX_COUNT grows.
Time Complexity: O(n)
This means the time to reach timeout grows directly in proportion to the maximum count value.
[X] Wrong: "The timer triggers instantly regardless of MAX_COUNT."
[OK] Correct: The timer must count each clock pulse up to MAX_COUNT, so it takes longer for bigger counts.
Understanding how counting loops grow with input size helps you explain timing and delays in hardware design clearly and confidently.
"What if we changed the counter to increment by 2 each clock instead of 1? How would the time complexity change?"
Practice
watchdog timer in a VHDL design?Solution
Step 1: Understand the watchdog timer role
A watchdog timer monitors system activity to detect failures.Step 2: Identify the correct function
It triggers a reset if the system stops responding to prevent lockup.Final Answer:
To detect system failures and trigger a reset if the system stops responding -> Option DQuick Check:
Watchdog timer = system failure detection [OK]
- Confusing watchdog timer with clock generator
- Thinking it stores data
- Assuming it generates random numbers
Solution
Step 1: Identify correct vector size and direction
A 16-bit vector uses indices 15 downto 0 for standard logic vectors.Step 2: Check each option
signal counter : std_logic_vector(15 downto 0); uses std_logic_vector(15 downto 0), which is correct for 16 bits.Final Answer:
signal counter : std_logic_vector(15 downto 0); -> Option AQuick Check:
16-bit vector = (15 downto 0) [OK]
- Using integer range 0 to 15 instead of vector
- Using ascending range (0 to 15) incorrectly
- Using bit_vector instead of std_logic_vector
process(clk)
begin
if rising_edge(clk) then
if kick = '1' then
counter <= (others => '0');
else
counter <= counter + 1;
end if;
end if;
end process;What happens to
counter when kick is '1'?Solution
Step 1: Analyze the condition when kick = '1'
The code sets counter to (others => '0'), which means all bits zero.Step 2: Understand the effect on counter
Counter resets to zero instead of incrementing.Final Answer:
Counter resets to zero -> Option AQuick Check:
kick '1' resets counter = zero [OK]
- Assuming counter increments on kick
- Thinking counter holds value on kick
- Confusing reset value with all ones
process(clk)
begin
if rising_edge(clk) then
if kick = '1' then
counter <= 0;
else
counter <= counter + 1;
end if;
end if;
end process;Solution
Step 1: Check signal type and assignment
Counter is usually std_logic_vector; assigning integer 0 directly is invalid.Step 2: Identify correct assignment method
Must assign (others => '0') or convert integer to vector properly.Final Answer:
Assigning integer 0 to a std_logic_vector signal -> Option BQuick Check:
std_logic_vector needs vector assignment, not integer [OK]
- Assigning integer directly to vector
- Ignoring reset conditions
- Misusing clock edge detection
timeout signal when the counter reaches 1000 without a kick. Which approach correctly implements this behavior?Solution
Step 1: Understand watchdog timer logic
Counter increments every clock cycle unless reset by kick signal.Step 2: Identify correct timeout condition
Timeout triggers when counter reaches 1000 without reset.Step 3: Evaluate options
Increment counter each clock cycle; reset to zero on kick; set timeout when counter = 1000 matches correct logic: increment, reset on kick, timeout at 1000.Final Answer:
Increment counter each clock cycle; reset to zero on kick; set timeout when counter = 1000 -> Option CQuick Check:
Watchdog counts up, resets on kick, timeout at limit [OK]
- Incrementing only on kick
- Setting timeout every cycle
- Resetting counter incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
