在Verilog中进行信号边缘检测的正确方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Verilog中进行信号边缘检测的正确方法相关的知识,希望对你有一定的参考价值。
我想检测从触发器AA
到BB
的信号的上升沿
+----+
A ----------------| |----- OUT
+----+ | BB |
B ----| |------|> |
| AA | +----+
clk ----|> |
+----+
Verilog代码:
module edge_detect (
input A,
input B,
input clk,
output OUT
);
reg AA;
reg BB;
always @(posedge clk) begin
AA <= B;
end
always @(posedge AA)begin
BB <= A;
end
assign OUT = BB;
endmodule
AA
的输出被用作BB
的时钟,说AA
完成了它的工作,然后BB
现在可以继续它的运作。
我很少看到这段代码。这是一个好习惯吗?
如果没有,有没有其他正确的方法来检测信号的边缘?
答案
由于各种原因,人们往往不愿意将数据用作时钟。
就个人而言,如果我写这篇文章,我会选择:
module edge_detect (
input A,
input B,
input clk,
output OUT
);
reg AA;
reg BB;
wire enA;
always @(posedge clk) begin
BB <= B;
end
assign enA = !BB && B;
always @(posedge clk)begin
if (enA) begin
AA <= A;
end
end
assign OUT = AA;
endmodule
+----+
A ----------------------------|D |----- OUT
+---+ | AA |
/--------------| | | |
| +----+ |AND|------|E |
B ----| |------o| | | |
| BB | +---+ | |
clk ----|> | clk ----|> |
+----+ +----+
但行为有点不同。
另一答案
如果您想检测Verilog中的上升沿或下降沿,只需将信号输出或延迟1个时钟脉冲。在数字环境中,边缘可以被认为是0到1转换或1到0转换。因此,您可以检查信号是否转换到任一状态,然后仅针对该条件断言输出高电平。
例如 :
output out_flag;
reg temp;
reg temp_d;
always@(posedge clk)
temp_d <= temp;
always@(posedge clk)
begin
if (temp && ~temp_d)
out_flag<= 1'b1;
else
out_flag<= 1'b0;
end
以上是关于在Verilog中进行信号边缘检测的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
三帧差,边缘检测,FPGA基于FPGA的三帧差+边缘检测的Verilog实现
FPGA纯verilog代码实现sobel 边缘检测,提供2套工程源码和技术支持