题意整理

       题目要求检测输入信号a的边沿,即当a信号的值从0跳变到1,视为出现上升沿,把指示信号rise拉高;当a信号的值从1跳变到0,视为出现下降沿,把指示信号down拉高。其余时刻两个指示信号因保持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