A D flip-flop stores a single bit of data on a clock edge. An asynchronous reset lets you clear the stored data immediately, without waiting for the clock.
D flip-flop with asynchronous reset in Verilog
module d_flip_flop_async_reset(
input wire clk,
input wire reset_n, // active low asynchronous reset
input wire d,
output reg q
);
always @(posedge clk or negedge reset_n) begin
if (!reset_n)
q <= 1'b0;
else
q <= d;
end
endmoduleThe reset signal is asynchronous, so it works immediately when active, ignoring the clock.
The reset is active low in this example, meaning it resets when reset_n is 0.
always @(posedge clk or posedge reset) begin if (reset) q <= 1'b0; else q <= d; end
always @(posedge clk) begin
if (reset) // synchronous reset
q <= 1'b0;
else
q <= d;
endThis testbench shows the D flip-flop with asynchronous reset. The reset clears the output immediately when active, regardless of the clock.
module testbench;
reg clk = 0;
reg reset_n = 1;
reg d = 0;
wire q;
d_flip_flop_async_reset uut (
.clk(clk),
.reset_n(reset_n),
.d(d),
.q(q)
);
// Clock generation
always #5 clk = ~clk;
initial begin
$monitor($time, " clk=%b reset_n=%b d=%b q=%b", clk, reset_n, d, q);
// Start with reset active
reset_n = 0;
d = 0;
#10;
reset_n = 1; // release reset
d = 1;
#10;
d = 0;
#10;
reset_n = 0; // assert reset asynchronously
#7;
reset_n = 1; // release reset
d = 1;
#10;
$finish;
end
endmoduleAsynchronous reset works immediately, so output changes as soon as reset activates.
Make sure to use non-blocking assignments (<=) inside always blocks for sequential logic.
Active low reset signals are common in hardware design but can be active high depending on your circuit.
A D flip-flop stores data on the clock's rising edge.
An asynchronous reset clears the output immediately, ignoring the clock.
Use asynchronous reset to quickly clear registers or memory elements.
Practice
What does the asynchronous reset in a D flip-flop do?
Solution
Step 1: Understand asynchronous reset behavior
Asynchronous reset forces the output to zero immediately, without waiting for the clock edge.Step 2: Compare with other options
Other options describe clock-dependent or toggling behavior, which is not asynchronous reset.Final Answer:
It clears the output immediately, ignoring the clock signal. -> Option BQuick Check:
Asynchronous reset = immediate clear [OK]
- Confusing asynchronous reset with synchronous reset
- Thinking reset waits for clock edge
- Mixing reset with toggle or clock enable
Which of the following is the correct Verilog sensitivity list for a D flip-flop with asynchronous reset?
module dff(input clk, input rst_n, input d, output reg q);
Solution
Step 1: Identify asynchronous reset sensitivity
Asynchronous reset triggers on reset signal edge, so sensitivity list must include clock posedge and reset negedge.Step 2: Check syntax correctness
always @(posedge clk or negedge rst_n) uses 'or' to combine posedge clk and negedge rst_n, which is correct syntax.Final Answer:
always @(posedge clk or negedge rst_n) -> Option CQuick Check:
Sensitivity list uses 'or' for async reset [OK]
- Using 'and' instead of 'or' in sensitivity list
- Omitting reset from sensitivity list
- Using only clock edge without reset
Given the following Verilog code, what is the value of q after the reset is deasserted and one clock rising edge occurs with d = 1?
module dff(input clk, input rst_n, input d, output reg q);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 0;
else
q <= d;
end
endmoduleSolution
Step 1: Analyze reset effect
When rst_n is low, q is set to 0 immediately.Step 2: Analyze clock edge after reset
After reset is released (rst_n=1), on next posedge clk, q takes value of d, which is 1.Final Answer:
q = 1 -> Option AQuick Check:
After reset, q follows d on clock edge [OK]
- Assuming q stays 0 after reset
- Ignoring clock edge for q update
- Thinking q is undefined after reset
Identify the error in this D flip-flop with asynchronous reset code snippet:
always @(posedge clk or posedge rst_n) begin
if (!rst_n)
q <= 0;
else
q <= d;
endSolution
Step 1: Check reset polarity
The reset is active low, so sensitivity should be on negedge rst_n, not posedge.Step 2: Verify reset condition
The condition uses !rst_n correctly for active low reset.Final Answer:
Reset edge should be negedge, not posedge. -> Option AQuick Check:
Active low reset uses negedge in sensitivity [OK]
- Using posedge for active low reset
- Confusing reset polarity and condition
- Adding unnecessary clock edges
You want to design a D flip-flop with asynchronous reset that sets q to 1 when reset is active (active low). Which code snippet correctly implements this behavior?
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 1;
else
q <= d;
endSolution
Step 1: Check reset polarity and action
Reset is active low (negedge rst_n), and when active (!rst_n), q is set to 1 as required.Step 2: Verify normal operation
When reset is not active, q follows d on clock rising edge.Final Answer:
This code correctly sets q to 1 on reset and updates q on clock. -> Option DQuick Check:
Active low reset sets q=1, else q=d [OK]
- Assuming reset must clear q to 0
- Using posedge for active low reset
- Reversing reset condition logic
Ready to prove it?
Pass the test and this pattern moves unknown
