芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 3032|回复: 0

同步边沿检测的实现

[复制链接]
  • TA的每日心情
    开心
    2021-12-31 09:03
  • 71

    主题

    78

    帖子

    977

    积分

    高级会员

    Rank: 6Rank: 6

    积分
    977
    发表于 2021-8-16 09:56:42 | 显示全部楼层 |阅读模式
    同步边沿检测的实现


    提到边沿检测,很多初学者会第一时间想到直接把待检测信号写在always块里。其实这种方法并不可取,解决这个问题的目标,在于如何在同步电路中实现这样的功能。如果把待检测信号写在always块里,相当于把输入信号接到了触发器的clk上,这样电路就变成异步的了,后面还需要把信号同步,最终得不偿失。
    如何实现同步边沿检测呢?正解套路为:定义两个触发器,再通过逻辑组合判断边沿。
    演示代码如下:

    1. module edge_detector(
    2.         clk,
    3.         rst_n,
    4.         din,
    5.         raising_edge_detect,
    6.         falling_edge_detect,
    7.         double_edge_detect
    8.         );
    9.         
    10.         input clk;
    11.         input rst_n;
    12.         input din;
    13.         output raising_edge_detect;
    14.         output falling_edge_detect;
    15.         output double_edge_detect;
    16.         reg q0,q1;
    17.          
    18.         assign raising_edge_detect = q0 & (~q1);
    19.         assign falling_edge_detect = ~q0 & q1;
    20.         assign double_edge_detect = q0 ^ q1;
    21.          
    22.         always@(posedge clk, negedge rst_n)
    23.         begin
    24.                 if(!rst_n)
    25.                 begin
    26.                         q0 <= 0;
    27.                         q1 <= 0;
    28.                 end
    29.                 else
    30.                 begin
    31.                         q0 <= din;
    32.                         q1 <= q0;
    33.                 end
    34.         end

    35. endmodule
    复制代码


    仿真代码如下:


    1. `timescale 1ns/1ns

    2. module edge_detector_tb;

    3.         reg CLK,RST_N,DIN;
    4.         wire RAISING_EDGE_DETECT,FALLING_EDGE_DETECT,DOUBLE_EDGE_DETECT;
    5.         reg i,j;
    6.          
    7.         edge_detector U_edge_detector(
    8.         .clk(CLK),
    9.         .rst_n(RST_N),
    10.         .din(DIN),
    11.         .raising_edge_detect(RAISING_EDGE_DETECT),
    12.         .falling_edge_detect(FALLING_EDGE_DETECT),
    13.         .double_edge_detect(DOUBLE_EDGE_DETECT)
    14.         );
    15.          
    16.         initial
    17.         begin
    18.                 CLK = 0 ;
    19.                 for(i = 0 ; i<10000; i=i+1)
    20.                 begin
    21.                         #1 CLK = ~CLK;
    22.                 end
    23.         end
    24.          
    25.         initial
    26.         begin
    27.                 DIN = 0 ;
    28.                 for(j = 0 ; j<100; j=j+1)
    29.                 begin
    30.                         #10 DIN = 0;
    31.                         #10 DIN = 1;
    32.                         #10 DIN = 1;
    33.                         #10 DIN = 1;
    34.                         #10 DIN = 0;
    35.                         #10 DIN = 0;
    36.                         #10 DIN = 1;
    37.                         #10 DIN = 0;
    38.                         #10 DIN = 1;
    39.                         #10 DIN = 0;
    40.                 end
    41.         end
    42.          
    43.         initial
    44.         begin
    45.                 RST_N = 1;
    46.                 #5 RST_N = 0;
    47.                 #5 RST_N = 1;
    48.         end

    49. endmodule
    复制代码

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-12-18 09:51 , Processed in 0.070397 second(s), 30 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

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