A reader is going through my ZedBoard tutorial and had some questions about detecting the rising edge of a pulse. The tutorial in question is using a ZedBoard to make a stopwatch. Kind of overkill in terms of hardware, but you have to start somewhere when you’re learning to code.
TRAN MINHHAI’s question asked: what do you do when the rising edge might just be a pulse, and the pulse might last less than a single clock cycle? The answer is to use a flip-flop with the input signal going to an asynchronous set input. The data input is just zero, and the clock signal is the one we are synchronizing to.
Here is the code:
`timescale 1ns/1ns
module edge_detect
(
input clk,
input btnl,
output btnl_rise
);
reg btnl_held = 0;
always @(posedge clk or posedge btnl)
if (btnl)
btnl_held <= 1;
else
btnl_held <= 0;
reg [1:0] btnl_shift = 0;
always @(posedge clk)
btnl_shift <= {btnl_shift,btnl_held};
assign btnl_rise = btnl_shift == 2'b01;
endmodule
I also wrote a little test to go with it. Notice how short little pulses can come anywhere with respect to the clock edge:
`timescale 1ns/1ns
module edge_detect_test;
reg clk = 0;
always #10 clk = ~clk;
reg btnl = 0;
wire btnl_rise;
edge_detect edge_detect(clk,btnl,btnl_rise);
initial
begin
$dumpvars(0);
@(posedge clk)
btnl <= 1;
repeat (10) @(posedge clk);
btnl <= 0;
repeat (4) @(posedge clk);
#10 btnl <= 1;
#1 btnl <= 0;
repeat (4) @(posedge clk);
#19 btnl <= 1;
#1 btnl <= 0;
repeat (4) @(posedge clk);
#20 btnl <= 1;
#1 btnl <= 0;
repeat (4) @(posedge clk);
$finish;
end
endmodule
The long pulse case
In the case of a long pulse, the design works just like it would without the asynchronous set flip-flop. Here’s a timing diagram:
The short pulse case
But if there is a short pulse, the asynchronous set flip-flop holds the input value until there is a clock edge.
If the pulse appears in the middle of the clock cycle, then the timing diagram looks like this:
If the pulse appears right before the clock edge, then the timing diagram looks like this:
Now you know how to synchronize the rising edge of a pulse even if you have a slow clock.
Understood (sure 90%). now it is clear, not vague! I am doing the code to make the same result :D. Thanks sir!