• 时序设计中的“打拍”


    “打拍”:在数字系统和时序设计中,打拍(Double Flopping / Two-Stage Registering)是指通过两个级联的寄存器(flip-flops)将输入信号同步到系统时钟域内的过程,常用于解决跨时钟域信号的亚稳态问题。

    为什么要打拍?

    ① 防止亚稳态:当信号从一个时钟域传输到另一个时钟域时,信号的变化可能与接收时钟的边沿非常接近,导致接收寄存器进入亚稳态(亚稳态可能导致不可预测的行为和系统错误);

    ② 同步异步信号:在一些情况下,外部信号(如按钮输入或外部设备信号)是异步的,需要将其同步到系统时钟域内才能安全地使用;

    ③ 提高稳定性:通过增加寄存器级数,信号在跨越时钟域时有更多的时间稳定下来,降低亚稳态发生的概率。

    “打一拍”和“打两拍”

    打一拍”适用于:

    ① 低速信号:输入信号变化速率较低,不易引起亚稳态;

    ② 已知稳定的异步信号:信号已在其他电路中经过处理,稳定性较高;

    ③ 无亚稳态风险:系统设计能够容忍一定的亚稳态风险。

    1. //打一拍:单个D触发器(FF)实现
    2. module single_flop_sync (
    3. input wire clk,
    4. input wire rst_n,
    5. input wire async_in, //异步输入信号
    6. output reg sync_out //同步输出信号
    7. );
    8. always @(posedge clk or negedge rst)
    9. begin
    10. if(!rst_n)
    11. begin
    12. sync_out <= 0;
    13. end
    14. else
    15. begin
    16. sync_out <= async_in;
    17. end
    18. end
    19. endmodule

    打两拍”适用于:

    ① 高速信号:输入信号变化速率较高,容易引起亚稳态;

    跨时钟域信号:信号从一个时钟域传输到另一个时钟域,存在较大的亚稳态风险;

    ③ 关键控制信号:系统中非常重要的信号,需要确保绝对稳定性。

    1. //打两拍:两个级联的D触发器实现
    2. module double_flop_sync (
    3. input wire clk,
    4. input wire rst_n,
    5. input wire async_in,
    6. output reg sync_out
    7. );
    8. reg sync_stage1;
    9. always @(posedge clk or negedge rst_n)
    10. begin
    11. if(!rst_n)
    12. begin
    13. sync_stage1 <= 0;
    14. sync_out <= 0;
    15. end
    16. else
    17. begin
    18. sync_stage1 <= async_in;
    19. sync_out <= sync_stage1;
    20. end
    21. end
    22. endmodule

  • 相关阅读:
    流式结构化数据计算语言的进化与新选择
    win32&mfc————win32消息机制
    隐写术----LSB隐写
    Kubernetes(k8s)的Pod控制器Job和CronJob详细讲解
    基于恒功率PQ控制的三电平并网逆变器MATLAB仿真模型
    js中哪些地方会用到window?
    设计模式篇(Java):装饰者模式
    微信小程序学习笔记(4)
    【MySQL】基本查询(二)
    【夯实算法基础】 并查集
  • 原文地址:https://blog.csdn.net/AliceWu1998/article/details/139882338