0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一个时钟异步切换原理图

454398 来源:博客园 作者: poiu_elab 2020-11-10 15:06 次阅读

原理如下图(为了方便简洁,去掉了rst_n)

波形是这样的

代码就是根据电路图写的

 1 ///////////////////////////////////////////////////////////////////////////////////////////
 2 //  DATE    :   Wed Jun  6 23:31:57 CST 2012
 3 ///////////////////////////////////////////////////////////////////////////////////////////
 4 module clk_sw(
 5     input   wire    clk_a
 6 ,   input   wire    clk_b
 7 ,   input   wire    rst_n
 8 ,   input   wire    sel
 9 ,   output  wire    clk_o
10 );
11 ///////////////////////////////////////////////////////////////////////////////////////////
12 // variable declaration
13 reg     clk_a_en ;
14 reg     clk_b_en ;
15 ///////////////////////////////////////////////////////////////////////////////////////////
16 // logic
17 always @(posedge clk_a or negedge rst_n) begin
18     if(~rst_n)                          clk_a_en     <=  1'b0               ;
19     else                                clk_a_en     <=  ~sel & ~clk_b_en   ;
20 end
21 always @(posedge clk_b or negedge rst_n) begin
22     if(~rst_n)                          clk_b_en     <=  1'b0               ;
23     else                                clk_b_en     <=  sel  & ~clk_a_en   ;
24 end
25 assign  clk_o   =   (clk_a & clk_a_en) | (clk_b & clk_b_en) ;
26 ///////////////////////////////////////////////////////////////////////////////////////////
27 
28 endmodule   //          CREATED by poiu_elab@1207
29 
30 ///////////////////////////////////////////////////////////////////////////////////////////

testbench是这样的

 1 ///////////////////////////////////////////////////////////////////////////////////////////
 2 //  DATE    :   Wed Jun  6 23:42:58 CST 2012
 3 ///////////////////////////////////////////////////////////////////////////////////////////
 4 `define CLK_A_CYCLE   23
 5 `define CLK_B_CYCLE   47
 6 module tb();
 7 ///////////////////////////////////////////////////////////////////////////////////////////
 8 // variable declaration
 9 reg     clk_a   ;
10 reg     clk_b   ;
11 reg     rst_n   ;
12 reg     sel     ;
13 wire    clk_o   ;
14 ///////////////////////////////////////////////////////////////////////////////////////////
15 // stimulation generation
16 initial forever #(`CLK_A_CYCLE/2) clk_a = ~clk_a;
17 initial forever #(`CLK_B_CYCLE/2) clk_b = ~clk_b;
18 initial begin
19     rst_n           =   1'b0            ;
20     clk_a           =   1'b1            ;
21     clk_b           =   1'b1            ;
22     sel             =   1'b0            ;
23 #500;
24     rst_n           =   1'b1            ;
25 #500;
26 #({$random}%13+500);
27     sel             =   ~sel            ;
28 #({$random}%23+500);
29     sel             =   ~sel            ;
30 #({$random}%33+500);
31     sel             =   ~sel            ;
32 #({$random}%43+500);
33     sel             =   ~sel            ;
34 #({$random}%53+500);
35     sel             =   ~sel            ;
36 #({$random}%63+500);
37     sel             =   ~sel            ;
38 #({$random}%73+500);
39     sel             =   ~sel            ;
40 #({$random}%83+500);
41     sel             =   ~sel            ;
42 #({$random}%93+500);
43     sel             =   ~sel            ;
44 #({$random}%13+500);
45     sel             =   ~sel            ;
46 #({$random}%23+500);
47     sel             =   ~sel            ;
48 #({$random}%33+500);
49     sel             =   ~sel            ;
50 #({$random}%43+500);
51     sel             =   ~sel            ;
52 #({$random}%53+500);
53     sel             =   ~sel            ;
54 #({$random}%63+500);
55     sel             =   ~sel            ;
56 #({$random}%73+500);
57     sel             =   ~sel            ;
58 #({$random}%83+500);
59     sel             =   ~sel            ;
60 #({$random}%93+500);
61     sel             =   ~sel            ;
62 #5000;
63 $stop;
64 end
65 ///////////////////////////////////////////////////////////////////////////////////////////
66 // module instaniation
67 clk_sw u_clk_sw(
68     .clk_a  (   clk_a   )
69 ,   .clk_b  (   clk_b   )
70 ,   .rst_n  (   rst_n   )
71 ,   .sel    (   sel     )
72 ,   .clk_o  (   clk_o   )
73 );
74 ///////////////////////////////////////////////////////////////////////////////////////////
75 
76 endmodule   //          CREATED by poiu_elab@1207
77 
78 ///////////////////////////////////////////////////////////////////////////////////////////

这里的核心就是你的sel发生翻转的时候,首先肯定是在本时钟域内的clk_en会先变低(invalid),之后才会使得另外时钟域内的clk_en变高(valid),这时另外一个时钟域内的时钟才能和clk_en相与输出。

简而言之,比如一开始是clk_a有效,clk_out为clk_a,sel翻转后,clk_a_en在clk_a的时钟域内先关断(拉低),使得clk_out持续拉低,clk_a_en变低后,clk_b_en在clk_b的时钟域内才能被拉高有效,这时同步的clk_b_en信号与clk_b相与就能使得clk_out成功切换到clk_b了。

原理就是这样,其中clk_a_en和clk_b_en不会同时有效就避免了时钟切换的时候窄脉冲及毛刺的生成,但是我觉得由于是组合逻辑输出的时钟总归还是会有一些缺点和不足的。不知道有没有什么更好的办法。
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 时钟
    +关注

    关注

    10

    文章

    1479

    浏览量

    130306
  • 波形
    +关注

    关注

    3

    文章

    344

    浏览量

    31246
收藏 人收藏

    评论

    相关推荐

    异步时钟切换电路

    异步时钟切换电路
    发表于 05-08 09:40 5694次阅读
    <b class='flag-5'>异步</b><b class='flag-5'>时钟</b><b class='flag-5'>切换</b>电路

    时钟设计中时钟切换电路设计案例

    在多时钟设计中可能需要进行时钟切换。由于时钟之间可能存在相位、频率等差异,直接切换时钟可能导致
    的头像 发表于 09-24 11:20 5380次阅读
    多<b class='flag-5'>时钟</b>设计中<b class='flag-5'>时钟</b><b class='flag-5'>切换</b>电路设计案例

    IC设计:ram的应用-异步时钟域位宽转换

    在进行模块设计时,我们经常需要进行数据位宽的转换,常见的两种转换场景有同步时钟域位宽转换和异步时钟域位宽转换。本文将介绍异步时钟域位宽转换
    的头像 发表于 11-23 16:41 373次阅读
    IC设计:ram的应用-<b class='flag-5'>异步</b><b class='flag-5'>时钟</b>域位宽转换

    数字时钟原理图

    新手,恳求各位高手给数字时钟原理图,最好能够给PCB
    发表于 11-10 10:18

    双电源自动切换控制原理图

    双电源自动切换控制原理图
    发表于 08-20 16:52

    跪求原理图-做一个测量32.0592的时钟晶振的工装

    我想做一个测量32.0592的时钟晶振的工装 求原理图谢谢
    发表于 04-08 20:52

    基于24c02和1602的时钟原理图和程序)

    自己做的时钟,送上原理图和程序
    发表于 03-16 22:23

    基本的时钟切换术语和标准输入时钟切换配置

      在这篇文章中,我将会介绍有趣的时钟芯片反馈装置。它可能意外发生,或作为尝试恢复或测试模式,但通常应该如所解释的那样避免。此外,了解Ouroboros时钟可能有助于在复杂的定时应
    发表于 02-26 07:50

    STM32时钟原理图

    STM32时钟原理图STM32的五时钟源LSIRC 32KHz低速内部时钟,由内部RC振荡器产生 ,稳定性低—》
    发表于 08-02 08:57

    时钟切换时容易出现的问题汇总

    最近看秋招面试题,这玩意儿考了很多次,所以单独拿出来写下: 题目的含义很简单就是时钟切换电路,但是在
    发表于 01-18 08:44

    LDB时钟切换程序与i.MX6异步时钟切换指导手册

    LDB时钟切换程序与i.MX6异步时钟切换指南
    发表于 12-13 07:22

    相对与同步切换异步切换会对切换掉话率有多少影响

    相对与同步切换异步切换会对切换掉话率有多少影响 同步切换需要网络中的基站间同步,异步
    发表于 06-18 00:13 827次阅读

    FPGA异步时钟设计中的同步策略

    FPGA 异步时钟设计中如何避免亚稳态的产生是一个必须考虑的问题。本文介绍了FPGA 异步时钟设计中容易产生的亚稳态现象及其可能造成的危害,同时根据实践经验给出了解决这些问题的
    发表于 12-20 17:08 63次下载
    FPGA<b class='flag-5'>异步</b><b class='flag-5'>时钟</b>设计中的同步策略

    如何将一种异步时钟域转换成同步时钟

     本发明提供了一种将异步时钟域转换成同步时钟域的方法,直接使用同步时钟异步时钟域中的
    发表于 12-21 17:10 5次下载
    如何将一种<b class='flag-5'>异步</b><b class='flag-5'>时钟</b>域转换成同步<b class='flag-5'>时钟</b>域

    异步电路的跨时钟域处理

    异步电路不能根据时钟是否同源来界定,时钟之间没有确定的相位关系是唯一准则。
    的头像 发表于 06-27 10:32 666次阅读