简析

对输入信号a打一拍得到a0,然后根据aa0的值就可以判断出边沿类型。
我最开始写的代码如下:

    reg a0;
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            rise <= 1'b0;
            down <= 1'b0;
        end
        else begin
            rise <=  a & ~a0;  // !!!
            down <= ~a &  a0;  // !!!
        end
    end
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            a0 <= 0;
        else
            a0 <= a;
    end

然而会报错。分析了波形后发现Testbench的a长时间都是不确定状态,如下图。这会使得risedown也成为不确定值。if-else方法则可以避免这种错误。
alt

代码

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