边沿检测功能实现

描述

        有一个缓慢变化的1bit信号a,编写一个程序检测a信号的上升沿给出指示信号rise,当a信号出现下降沿时给出指示信号down。
        注:rise,down应为单脉冲信号,在相应边沿出现时的下一个时钟为高,之后恢复到0,一直到再一次出现相应的边沿。

使用Verilog HDL实现以上功能并编写testbench验证。

输入描述

        clk:系统时钟信号

        rst_n:异步复位信号,低电平有效

        a:单比特信号,作为待检测的信号

输出描述

        rise:单比特信号,当输入信号a出现上升沿时为1,其余时刻为0

        down:单比特信号,当输入信号a出现下降沿时为1,其余时刻为0

解题分析

        检测信号a的边沿需要缓存信号前一时刻的值,例如记为a_tem。当前一时刻为0,这一时刻为1,说明信号出现上升沿,即 a&&!a_tem = 1; 当前一时刻为1,这一时刻为0,说明信号出现上升沿,即 !a&&a_tem = 1;

       输入信号:

              系统时钟,复位信号:clk,rst_n;

              待检测边沿的信号:a;

       输出信号:

              上升沿指示信号:rise

              下降沿指示信号:down

缓存a的数值

 always @(posedge clk or negedge rst_n)

              if (!rst_n)

                     a_tem <= 1'b0;

              else

                     a_tem <= a;

分别使用a&&!a_tem和!a&&a_tem作为判断条件,判断是否出现上升沿或者下降沿。

//检测边沿,给出相应的信号

       always @(posedge clk or negedge rst_n)

              if (!rst_n)

                     begin

                            rise <= 1'b0;

                            down <= 1'b0;

                     end

else if (!a_tem && a)   //当前一时刻a=0,当前时刻a=1,表示a出现一次上升沿

                     begin

                            rise <= 1'b1;

                            down <= 1'b0;

                     end

              else if     (a_tem && !a)//当前一时刻a=1,当前时刻a=0,表示a出现一次下降沿

                     begin

                            down <= 1'b1;

                            rise <= 1'b0;

                     end

              else

                     begin

                            down <= 1'b0;

                            rise <= 1'b0;

                     end

参考代码

`timescale 1ns/1ns
module edge_detect(
	input clk,
	input rst_n,
	input a,
	
	output reg rise,
	output reg down
);
	
	reg a_tem;

//缓存a的数值	
	always @(posedge clk or negedge rst_n)
		if (!rst_n)
			a_tem <= 1'b0;
		else
			a_tem <= a;
			
//检测边沿,给出相应的信号
	always @(posedge clk or negedge rst_n)
		if (!rst_n)	
			begin 
				rise <= 1'b0;
				down <= 1'b0;
			end
		else if (!a_tem && a)   		//当前一时刻a=0,当前时刻a=1,表示a出现一次上升沿
			begin
				rise <= 1'b1;
				down <= 1'b0;
			end
		else if	(a_tem && !a)			//当前一时刻a=1,当前时刻a=0,表示a出现一次下降沿
			begin
				down <= 1'b1;
				rise <= 1'b0;
			end
		else 
			begin
				down <= 1'b0;
				rise <= 1'b0;
			end
endmodule

方法二:

`timescale 1ns/1ns
module edge_detect(
	input clk,
	input rst_n,
	input a,
	
	output reg rise,
	output reg down
);
reg apre;
always @(posedge clk or negedge rst_n)
	begin
		if(~rst_n)
			begin
				rise <= 0;
				down <= 0;
				apre <= 0;
			end
		else
			begin
				apre <= a;
				if(~apre & a)
					rise <= 1'b1;
				else
					rise <= 1'b0;
				if(apre & ~a)
					down <= 1'b1;
				else
					down <= 1'b0;
			end
	end	
endmodule

注:解题分析来源于网友,如有侵权,请告删之。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值