边沿检测
代码
module edge_detection_p(
input sys_clk,
input sys_rst_n,
input signal_in,
output edge_detected
);
//存储上一个时钟周期的输入信号
reg signal_in_prev;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
signal_in_prev <= 0;
else begin
signal_in_prev <= signal_in; //两个信号相差一个时钟周期
end
end
//上升沿检测:signal_in_prev为0,signal_in为1
assign edge_detected = signal_in & ~signal_in_prev;
endmodule
若为下降沿检测,则为:
assign edge_detected = ~signal_in & signal_in_prev;
改进
若出现不定值x或高阻值z,则检测不准确。
可以改进为:
assign edge_detected = ((a & ~signal_in_prev)===1)?1:0;//上升沿检测
assign edge_detected = ((~a & signal_in_prev)===1)?1:0;//下降沿检测
解释:
==
和!==
称为逻辑等式运算符,其结果由两个操作数的值决定。真值表如下:
== | 0 | 1 | x | z |
---|---|---|---|---|
0 | 1 | 0 | x | x |
1 | 0 | 1 | x | x |
x | x | x | x | x |
z | x | x | x | x |
===
和!===
常用于case表达式的判别,所以又称为case等式运算符。它是对操作数进行按位比较,两个操作数必须完全一致,结果才为1。若两个操作数对应位都出现不定值x或高阻值z,则也可认为是相同的。真值表如下:
=== | 0 | 1 | x | z |
---|---|---|---|---|
0 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
x | 0 | 0 | 1 | 0 |
z | 0 | 0 | 0 | 1 |
参考
(201条消息) Verilog 相等运算符之相等和全等_verilog 全等_蒋楼丶的博客-CSDN博客