Synchronization Verilog中信号边缘检测的正确方法

Synchronization Verilog中信号边缘检测的正确方法,synchronization,verilog,Synchronization,Verilog,我想检测从触发器AA到BB的信号的上升沿 +----+ A ----------------| |----- OUT +----+ | BB | B ----| |------|> | | AA | +----+ clk ----|> | +----+ Verilog代码: module edge_detect ( inpu

我想检测从触发器
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
模块边缘检测(
输入A,
输入B,
输入时钟,
输出
);
条例AA;
注册BB;
始终@(posedge clk)开始

由于各种原因,人们往往不赞成使用数据作为时钟

就我个人而言,如果我写这篇文章,我会:

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 ----|>   |
        +----+                  +----+
模块边缘检测(
输入A,
输入B,
输入时钟,
输出
);
条例AA;
注册BB;
金属丝;
始终@(posedge clk)开始
BB|
+----+                  +----+

不过,这种行为有点不同。

如果您想在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
output out\u标志;
注册温度;
注册临时工;
始终@(posedge clk)

温度
enA=非BB&B相当于
enA=!BB&B
if(enA){…}
相当于
if(enA)begin。。。在verilog中结束
。不管怎样,你能说明它的优点吗?谢谢您的快速回答。=)是的,当写入编辑器时,我得到了VHDL/Verilog。主要的优点是你不必处理派生时钟,这可能会导致合成和布局程序的麻烦。时钟往往被各种工具以一种特殊的方式处理,因此大多数时候不鼓励将逻辑整合到时钟生成中。这些工具有时被称为“一次性”或单稳态多谐振荡器。