在Verilog中进行信号边缘检测的正确方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Verilog中进行信号边缘检测的正确方法相关的知识,希望对你有一定的参考价值。

我想检测从触发器AABB的信号的上升沿

                    +----+
  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实现

正边缘检测器Verilog行为代码

FPGA纯verilog代码实现sobel 边缘检测,提供2套工程源码和技术支持

Quartus II 中 Verilog 常见警告/错误汇总

基于FPGA的SPI协议接口的verilog设计

Verilog hdl 如何检测时钟的上升沿和下降沿?