查看: 1449|回复: 0

单bit跨时钟域同步电路设计

[复制链接]
  • TA的每日心情

    2018-11-20 13:41
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2019-2-14 16:06:01 | 显示全部楼层 |阅读模式
    分享到:
    做个假设:需要将100M时钟下的脉冲同步到1M的时钟域下,如果按照打拍的方式,需要延展100拍后再进行跨时钟域才能保证信号能在1M时钟域正确采到,这种设计方法未免太愚蠢而又浪费资源。

    本篇介绍两种可以同时处理快到慢、慢到快所有时钟频率的脉冲同步设计电路情况。

    • 脉冲同步
    • 电平同步



    脉冲同步
    1.jpg
    注:
    * 蓝色为 A 时钟域的寄存器;
    * 红色为 B 时钟域的寄存器;

    实现说明
    该模块关键寄存器是signal_a,在A时钟域下,捕获到i_plus_a的脉冲,转化为电平反转传输到B时钟域,等待B时钟域捕获到有电平变化,signal_a再清0,等待下一个脉冲输入。

    HDL代码
    1. module sync_pulse
    2. (
    3. //A  clock  domain
    4.     input       clk_A           ,
    5.     input       rst_n_A         ,

    6. //B  clock  domain
    7.     input       clk_B           ,
    8.     input       rst_n_B         ,

    9. //input plus(A)
    10.     input       i_puls_a        ,

    11. //output plus(B)
    12.     output reg  o_puls_b
    13. );

    14. //------------------------------  Reg & Wire  --------------------------

    15.     reg     signal_a            ;            // A clock domain
    16.     reg     signal_b1_a1        ;            // A clock domain
    17.     reg     signal_b1_a2        ;            // A clock domain

    18.     reg     signal_b            ;            // B clock domain
    19.     reg     signal_b_b1         ;            // B clock domain
    20.     reg     signal_b_b2         ;            // B clock domain

    21. //--------------------------------  logic  -----------------------------


    22.     always @(posedge clk_A or negedge rst_n_A)      
    23.     begin
    24.         if(!rst_n_A)
    25.             signal_a <= 1'b0;
    26.         else if(i_puls_a == 1'b1)
    27.             signal_a <= 1'b1;
    28.         else if(signal_b1_a2 == 1'b1)
    29.             signal_a <= 1'b0;
    30.     end
    31.    
    32.    
    33.     always @(posedge clk_B)
    34.     begin
    35.         signal_b    <= signal_a     ;
    36.         signal_b_b1 <= signal_b     ;
    37.         signal_b_b2 <= signal_b_b1  ;
    38.     end
    39.    
    40.    
    41.     always @(posedge clk_A)
    42.     begin
    43.         signal_b1_a1 <= signal_b_b1 ;
    44.         signal_b1_a2 <= signal_b1_a1;
    45.     end
    46.    
    47.    
    48.     always @(posedge clk_B or negedge rst_n_B)
    49.     begin
    50.         if(!rst_n_B)
    51.             o_puls_b <= 1'b0;
    52.         else if(signal_b_b1 && !signal_b_b2)
    53.             o_puls_b <= 1'b1;
    54.         else
    55.             o_puls_b <= 1'b0;
    56.     end

    57. endmodule
    复制代码

    电平同步
    以上的思想是脉冲跨时钟域,其实也可以通过电平跳转的方法跨时钟域:
    2.png
    在A时钟域检测脉冲上升沿,然后通过改变电平Z状态的方式传送给B时钟域,然后通过检测电平Z状态是否发生变化来判断A时钟域是否有脉冲。

    电平同步比脉冲同步更节省资源,电路更加简单,效果也不比脉冲同步差。

    本文作者:马哥 - Marin
    来源:简书





    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-28 17:19 , Processed in 0.124812 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.