FPGA中信号上升沿和下降沿检测是个重要的问题,这里给出了几种检测时钟沿的方法,仅供参考!
版权声明:本文为博主原创文章,转载请附上博文链接!
1.检测信号的上升沿和下降沿,将信号打入移位寄存器,检测相邻两位的变化
直接上代码
//signal data 为待检测时钟信号
reg [2:0 ] a3_edge;
reg [2:0] a3 ;
always@(posedge clk or negedge reset_n)
begin
if(reset_n == 1'b0)
a3 <= 3'b000;
else
a3 <= {a3[1:0],data };
end
assign a3_edge = a3[2]^a3[1]; // detect edge changes of signal data
reg [3:0] cnt;
always@(posedge clk or negedge reset_n)
begin
if(reset_n == 1'b0)
cnt <= 4'b0000;
else if(a3_edge == 1'b1)
cnt <= cnt + 4'b0001;
end
由此即可检测出上升沿和下降沿,并可计数出个数。
2 .设计两个或多个一位的寄存器,用来接收被检测的信号,系统时钟来一次记一次输入信号,如果用了两个寄存器直接异或就可以了
reg data_in_d1;
reg data_in_d2;
always @ (posedge clk,negedge rst_n)
begin
if(!rst_n)
begin data_in_d1 <= 1'b0;
data_in_d2 <= 1'b0;
end
else begin
data_in_d1 <= data_in;
data_in_d2 <= data_in_d1;
end
end
assign raising_edge_detect = data_in_d1 & (~data_in_d2);//上升沿
assign falling_edge_detect = ~data_in_d1 & data_in_d2;//下降沿
assign double_edge_detect = data_in_d1 ^ data_in_d2;//双边沿
检测方法有多种,但基本思路都是一样,通过观察待测信号前后两个时钟的变化。
本人水平有限,若有不妥之处,欢迎各位批评指正。
参考出处:https://www.amobbs.com/thread-4147967-1-1.html?_dsign=bc8e2e2e
https://blog.csdn.net/weixin_43343190/article/details/82961170