简析
对输入信号a
打一拍得到a0
,然后根据a
和a0
的值就可以判断出边沿类型。
我最开始写的代码如下:
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
长时间都是不确定状态,如下图。这会使得rise
和down
也成为不确定值。if-else
方法则可以避免这种错误。
代码
`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