利用FPGA如何实现上升沿和下降沿的检测

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

你可能感兴趣的:(FPGA信号检测)