njithjw 发表于 2011-4-12 21:56:29

边沿检测电路

`timescale 1ns/1ns
module cbb_edgedet #
    (parameter EDGE_DETECT="POSEDGE"
    )
    (
    input   SYS_CLK,
    input   RST_N,
    input   SIGNAL_IN,

    outputSIGNAL_EDGE
    );

generate
    if (EDGE_DETECT == "POSEDGE")
    begin: POSE_EDGE
      reg   SIGNAL_IN_DLY1;
      reg   SIGNAL_IN_DLY2;
      reg   SIGNAL_IN_DLY3;
      reg   SIGNAL_RISE;

      always @ (posedge SYS_CLK or negedge RST_N)
      begin
            if (RST_N == 1'B0)
            begin
                SIGNAL_IN_DLY1 <= 1'B0;
                SIGNAL_IN_DLY2 <= 1'B0;
                SIGNAL_IN_DLY3 <= 1'B0;
            end
            else
            begin
                SIGNAL_IN_DLY1 <= SIGNAL_IN;
                SIGNAL_IN_DLY2 <= SIGNAL_IN_DLY1;
                SIGNAL_IN_DLY3 <= SIGNAL_IN_DLY2;
            end
      end
      always @ (posedge SYS_CLK or negedge RST_N)
      begin
            if (RST_N == 1'B0)
                SIGNAL_RISE <= 1'B0;
            else
                SIGNAL_RISE <= ~SIGNAL_IN_DLY3 && SIGNAL_IN_DLY2;
      end

      assign SIGNAL_EDGE = SIGNAL_RISE;

    end
    else if (EDGE_DETECT == "NEGEDGE")
    begin: NEGE_EDGE
      reg   SIGNAL_IN_DLY1;
      reg   SIGNAL_IN_DLY2;
      reg   SIGNAL_IN_DLY3;
      reg   SIGNAL_FALL;

      always @ (posedge SYS_CLK or negedge RST_N)
      begin
            if (RST_N == 1'B0)
            begin
                SIGNAL_IN_DLY1 <= 1'B0;
                SIGNAL_IN_DLY2 <= 1'B0;
                SIGNAL_IN_DLY3 <= 1'B0;
            end
            else
            begin
                SIGNAL_IN_DLY1 <= SIGNAL_IN;
                SIGNAL_IN_DLY2 <= SIGNAL_IN_DLY1;
                SIGNAL_IN_DLY3 <= SIGNAL_IN_DLY2;
            end
      end
      always @ (posedge SYS_CLK or negedge RST_N)
      begin
            if (RST_N == 1'B0)
                SIGNAL_FALL <= 1'B0;
            else
                SIGNAL_FALL <= SIGNAL_IN_DLY3 && (~SIGNAL_IN_DLY2);
      end

      assign SIGNAL_EDGE = SIGNAL_FALL;
    end
    else if (EDGE_DETECT == "DUALDGE")
    begin: DUAL_EDGE
      reg   SIGNAL_IN_DLY1;
      reg   SIGNAL_IN_DLY2;
      reg   SIGNAL_IN_DLY3;
      reg   SIGNAL_RISE_FALL;

      always @ (posedge SYS_CLK or negedge RST_N)
      begin
            if (RST_N == 1'B0)
            begin
                SIGNAL_IN_DLY1 <= 1'B0;
                SIGNAL_IN_DLY2 <= 1'B0;
                SIGNAL_IN_DLY3 <= 1'B0;
            end
            else
            begin
                SIGNAL_IN_DLY1 <= SIGNAL_IN;
                SIGNAL_IN_DLY2 <= SIGNAL_IN_DLY1;
                SIGNAL_IN_DLY3 <= SIGNAL_IN_DLY2;
            end
      end
      always @ (posedge SYS_CLK or negedge RST_N)
      begin
            if (RST_N == 1'B0)
                SIGNAL_RISE_FALL <= 1'B0;
            else
                SIGNAL_RISE_FALL <= SIGNAL_IN_DLY3 ^ SIGNAL_IN_DLY2;
      end

      assign SIGNAL_EDGE = SIGNAL_RISE_FALL;
    end

endgenerate

endmodule

哦十全_至芯学员 发表于 2011-4-17 23:08:17

顶一个先……
页: [1]
查看完整版本: 边沿检测电路