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

    文章

    1733

    浏览量

    131458
  • 波形
    +关注

    关注

    3

    文章

    379

    浏览量

    31544
收藏 人收藏

    评论

    相关推荐

    异步时钟切换电路

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

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

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

    数字时钟原理图

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

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

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

    双向切换流水灯电路原理图

    CD4017.pdf 双向切换流水灯电路原理图
    发表于 06-29 22:30 7505次阅读
    双向<b class='flag-5'>切换</b>流水灯电路<b class='flag-5'>原理图</b>

    单片机时钟电路原理图

    单片机时钟电路原理图 下面以实际的时钟电路来说明定时器的软件编程方法,时钟是最为常见的显示
    发表于 03-14 14:25 1.7w次阅读
    单片机<b class='flag-5'>时钟</b>电路<b class='flag-5'>原理图</b>

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

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

    利用光MOS的信号切换电路原理图

    利用光MOS的信号切换电路原理图
    发表于 08-15 17:43 2063次阅读
    利用光MOS的信号<b class='flag-5'>切换</b>电路<b class='flag-5'>原理图</b>

    自制视频切换器的工作原理图

    自制视频切换器的工作原理图 电路原理见下图。电路的核心是块视频切换电路MAX4
    发表于 03-24 15:16 4273次阅读
    自制视频<b class='flag-5'>切换</b>器的工作<b class='flag-5'>原理图</b>

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

    FPGA 异步时钟设计中如何避免亚稳态的产生是必须考虑的问题。本文介绍了FPGA 异步时钟
    发表于 12-20 17:08 63次下载
    FPGA<b class='flag-5'>异步</b><b class='flag-5'>时钟</b>设计中的同步策略

    数字时钟电路设计原理图pcb

    数字时钟电路设计原理图pcb ,包含整个设计
    发表于 12-07 11:38 306次下载

    DS1302时钟模块原理图

    ds1302时钟芯片简单介绍及其原理图
    发表于 04-06 16:01 15次下载

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

    双电源自动切换控制原理图
    发表于 09-11 10:19 43次下载
    双电源自动<b class='flag-5'>切换</b>控制<b class='flag-5'>原理图</b>

    电源自动切换的电路原理图免费下载

    本文档的主要内容详细介绍的是电源自动切换的电路原理图免费下载。
    发表于 11-12 08:00 65次下载
    电源自动<b class='flag-5'>切换</b>的电路<b class='flag-5'>原理图</b>免费下载

    单项可控硅直流切换电路1原理图

    单项可控硅直流切换电路1原理图
    发表于 02-09 13:51 23次下载