集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2169|回复: 1

边沿检测电路

[复制链接]
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,

    output  SIGNAL_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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-23 01:55 , Processed in 0.065044 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表