• 时序设计中的“打拍”


    “打拍”:在数字系统和时序设计中,打拍(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

  • 相关阅读:
    2024年AIGC+教育行业报告
    【强化学习】优势演员-评论员算法(Advantage Actor-Critic , A2C)求解倒立摆问题 + Pytorch代码实战
    谈一谈Decoder模块
    淘宝(tmall)店铺旗舰店商品数据分析接口代码教程
    华为云分布式数据库GaussDB,做金融数字化的坚实数据底座
    户外拉杆音箱大功率升压芯片 12.6V升压18V 3A 外围简单
    C语言 深度探究C语言中的预处理器
    markdown语法简述
    vue3 项目
    Python编程学习:random.shuffle的简介、使用方法之详细攻略
  • 原文地址:https://blog.csdn.net/AliceWu1998/article/details/139882338