A D flip-flop stores a single bit of data and changes its output only at the clock's edge. This helps keep data stable and synchronized in digital circuits.
D flip-flop with clock edge in Verilog
module d_flip_flop(
input wire clk,
input wire d,
output reg q
);
always @(posedge clk) begin
q <= d;
end
endmoduleposedge clk means the code runs when the clock signal changes from 0 to 1 (rising edge).
The q <= d; line updates the output q with the input d at the clock edge.
q on the rising edge of the clock.always @(posedge clk) begin
q <= d;
endq on the falling edge of the clock (when clock goes from 1 to 0).always @(negedge clk) begin
q <= d;
endq when rst is high.module dff_async_reset(
input wire clk,
input wire rst,
input wire d,
output reg q
);
always @(posedge clk or posedge rst) begin
if (rst)
q <= 0;
else
q <= d;
end
endmoduleThis testbench creates a clock signal and changes the input d. The output q updates only on the rising edge of the clock, showing how the D flip-flop stores data.
module testbench;
reg clk = 0;
reg d = 0;
wire q;
d_flip_flop uut (
.clk(clk),
.d(d),
.q(q)
);
always #5 clk = ~clk; // Clock toggles every 5 time units
initial begin
$monitor($time, ": clk=%b d=%b q=%b", clk, d, q);
d = 0; #10;
d = 1; #10;
d = 0; #10;
d = 1; #10;
$finish;
end
endmodule
module d_flip_flop(
input wire clk,
input wire d,
output reg q
);
always @(posedge clk) begin
q <= d;
end
endmoduleThe output q changes only at the clock's rising edge, not immediately when d changes.
Using non-blocking assignment <= inside always block is important for correct timing behavior.
Initial value of q is unknown (shown as 'x') until the first clock edge.
A D flip-flop stores data on the clock's rising edge.
Use always @(posedge clk) to trigger updates.
It helps keep digital circuits synchronized and stable.
Practice
What does a D flip-flop do in a digital circuit?
Solution
Step 1: Understand the role of a D flip-flop
A D flip-flop captures and stores the input value (D) at a specific clock event.Step 2: Identify the clock event
It stores the value on the rising edge (positive edge) of the clock signal.Final Answer:
Stores the input value on the rising edge of the clock -> Option AQuick Check:
D flip-flop stores input on clock rising edge [OK]
- Confusing D flip-flop with clock generator
- Thinking it performs calculations
- Assuming it resets asynchronously
Which of the following is the correct Verilog syntax to trigger a D flip-flop on the rising edge of the clock clk?
Solution
Step 1: Recall the correct event control syntax
Verilog usesposedgeto detect the rising edge of a signal.Step 2: Match syntax with clock signal
The correct syntax to trigger on rising edge ofclkisalways @(posedge clk).Final Answer:
always @(posedge clk) -> Option BQuick Check:
Rising edge trigger = posedge [OK]
- Using negedge instead of posedge
- Omitting posedge keyword
- Incorrect event control syntax
What will be the output q after the following Verilog code runs for one clock cycle if d = 1 and initial q = 0?
module dff(input clk, input d, output reg q);
always @(posedge clk) begin
q <= d;
end
endmoduleSolution
Step 1: Understand the behavior on posedge clk
On the rising edge ofclk, the flip-flop assignsdtoq.Step 2: Apply given inputs
Sinced = 1and initialq = 0, after the clock edge,qupdates to 1.Final Answer:
q becomes 1 -> Option DQuick Check:
D input 1 stored at clock edge = q 1 [OK]
- Assuming q changes immediately without clock edge
- Thinking q toggles automatically
- Ignoring initial value of q
Identify the error in this D flip-flop Verilog code snippet:
module dff(input clk, input d, output reg q);
always @(clk) begin
q <= d;
end
endmoduleSolution
Step 1: Check sensitivity list
The code usesalways @(clk), which triggers on any change of clk, not just edges.Step 2: Correct edge sensitivity
For a D flip-flop, it must trigger only on the rising edge:always @(posedge clk).Final Answer:
Missing sensitivity to clock edge, should use posedge -> Option AQuick Check:
Flip-flop triggers on posedge clk only [OK]
- Using level sensitivity instead of edge sensitivity
- Confusing reg and wire for outputs
- Assuming inputs must be reg
You want to design a D flip-flop that resets q to 0 asynchronously when rst is high. Which Verilog code snippet correctly implements this behavior?
module dff(input clk, input rst, input d, output reg q);
always @(posedge clk or posedge rst) begin
if (rst)
q <= 0;
else
q <= d;
end
endmoduleSolution
Step 1: Analyze sensitivity list
The always block triggers on rising edge of clock or rising edge of reset, enabling asynchronous reset.Step 2: Check reset logic
If reset is high,qis set to 0 immediately, elseqfollowsdon clock edge.Final Answer:
This code correctly implements asynchronous reset -> Option CQuick Check:
Asynchronous reset uses posedge rst in sensitivity list [OK]
- Checking reset only on clock edge (synchronous reset)
- Using blocking assignment for sequential logic
- Missing reset in sensitivity list
Ready to prove it?
Pass the test and this pattern moves unknown
