利用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

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Vivado 中,实现基于 FPGA上升沿触发可以通过以下步骤完成: 1. 打开 Vivado,创建一个新工程,并在 "Create New Project" 界面中选择 "RTL Project"。 2. 在 "Create New Project" 界面中,设置工程名称和路径,然后选择 FPGA 型号,接着单击 "Next"。 3. 在 "Add Sources" 界面中,添加一个 VHDL 或 Verilog 文件,并命名为 "rising_edge_trigger"。 4. 在 "Design Sources" 面板中,双击 "rising_edge_trigger" 文件以打开编辑器。 5. 在 "rising_edge_trigger" 文件中编写代码实现上升沿触发逻辑,例如: ```verilog module rising_edge_trigger ( input clk, input reset, input signal, output reg trigger ); always @ (posedge clk or negedge reset) begin if (reset == 1'b0) begin trigger <= 1'b0; end else begin if (signal == 1'b1 && signal != prev_signal) begin trigger <= 1'b1; end else begin trigger <= 1'b0; end prev_signal <= signal; end end endmodule ``` 6. 在 "Sources" 面板中,右键单击 "Constraints" 并选择 "Add Sources",然后添加一个 XDC 约束文件。 7. 在 XDC 约束文件中,添加时钟约束和输入信号约束,例如: ```verilog create_clock -period 10.0 [get_ports {clk}] set_input_delay -min 2.0 -max 4.0 [get_ports {signal}] -clock [get_clocks {clk}] ``` 8. 在 "Flow Navigator" 面板中,选择 "Run Synthesis"、"Run Implementation" 和 "Generate Bitstream"。 9. 下载生成的比特流文件到 FPGA 上,然后连接时钟和输入信号,即可实现基于 FPGA上升沿触发逻辑。 注意:以上代码和约束仅供参考,具体实现要根据具体需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值