在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3930|回复: 6

时钟信号的切换

[复制链接]
发表于 2005-11-9 09:05:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

朋友们:
我的设计中有两个完全异步的时钟, 现在要用控制信号从两个完全异步的
时钟中选出一个。 要求无毛刺。
怎么实现啊。 有原理图最好。
在这里多谢了。
发表于 2005-11-9 11:46:23 | 显示全部楼层

时钟信号的切换

Use clock gating. resynchronize the clock enable signal
发表于 2005-11-10 09:34:50 | 显示全部楼层

时钟信号的切换

好问题,希望看到进一步的讨论!
发表于 2005-11-11 16:57:23 | 显示全部楼层

时钟信号的切换

闲着没事,做个小例子,看看行不行?
用了四个同步器,可能比较笨笨,并测试了一下:
module clkswitch ( clkout, async_clk0, async_clk1, sel, rst_n);
    output clkout;                //输出时钟
    input  async_clk0;            //输入异步时钟0
    input  async_clk1;            //输入异步时钟1
    input  sel;                   //选择端,0则选择时钟0,1则选择时钟1
    input  rst_n;
   
    wire sync_sel_clk0;
    wire sync_sel_clk1;
    wire clk0_g;
    wire clk1_g;
    wire handshake_f1t0;
    wire handshake_f0t1;
    wire clk0_gating;
    wire clk1_gating;
   
//下面是同步器用的一堆reg
    reg  latch2_1;
    reg  latch1_1;
    reg  latch0_1;
    reg  latch2_0;
    reg  latch1_0;
    reg  latch0_0;
   
    reg  hs_latch_f1_t0_2nd;
    reg  hs_latch_f1_t0_1st;
    reg  hs_latch_f0_t1_2nd;
    reg  hs_latch_f0_t1_1st;

// 产生输出时钟的组合逻辑
   
    assign sync_sel_clk1 = latch1_1;
    assign sync_sel_clk0 = latch1_0;
    assign handshake_f1t0 = hs_latch_f1_t0_2nd;
    assign handshake_f0t1 = hs_latch_f0_t1_2nd;
    assign clk0_g = clk0_gating & async_clk0;
    assign clk0_gating = (~sync_sel_clk0) & (~handshake_f1t0);
    assign clk1_g = clk1_gating & async_clk1;
    assign clk1_gating = (sync_sel_clk1 & handshake_f0t1);
    assign clkout = clk0_g | clk1_g;
// 在clk1域内同步sel
    always @(posedge async_clk1 or negedge rst_n) begin
        if (rst_n == 0) begin
            latch2_1 <= 1'b0;
            latch1_1 <= 1'b0;
            latch0_1 <= 1'b0;
        end
        else begin
            latch2_1 <= latch1_1;
            latch1_1 <= latch0_1;
            latch0_1 <= sel;
        end
    end
// 在clk0域内同步sel
    always @(posedge async_clk0 or negedge rst_n) begin
        if (rst_n == 0) begin
            latch2_0 <= 0;
            latch1_0 <= 0;
            latch0_0 <= 0;
        end
        else begin
            latch2_0 <= latch1_0;
            latch1_0 <= latch0_0;
            latch0_0 <= sel;
        end
    end
// 将clk1中同步后的sel送到clk0域内再同步一下
   
    always @(posedge async_clk0 or negedge rst_n) begin
        if (rst_n == 0) begin
            hs_latch_f1_t0_2nd <= 0;
            hs_latch_f1_t0_1st <= 0;
        end
        else begin
            hs_latch_f1_t0_2nd <= hs_latch_f1_t0_1st;
            hs_latch_f1_t0_1st <= latch2_1;
        end     
    end
// 将clk0中同步后的sel送到clk1域内再同步一下   
    always @(posedge async_clk1 or negedge rst_n) begin
        if (rst_n == 0) begin
            hs_latch_f0_t1_2nd <= 0;                  
            hs_latch_f0_t1_1st <= 0;
        end
        else begin
            hs_latch_f0_t1_2nd <= hs_latch_f0_t1_1st;
            hs_latch_f0_t1_1st <= latch2_0;
        end
            
    end
  
endmodule      
        
   
发表于 2006-7-12 22:10:10 | 显示全部楼层
谢谢楼主,学学了!
发表于 2006-7-27 10:59:01 | 显示全部楼层
想请教一下4楼的代码,为什么将clk1中同步后的sel送到clk0域内再同步的时候,要使用Latch2_1的输出而不能直接使用latch1_1的输出呢,就是想问为什么一定要用3级的寄存器采样sel而不能只用2级。

请各位高手指点,谢谢
 楼主| 发表于 2006-9-9 15:21:48 | 显示全部楼层
可以到EDABOARD上看看有关的帖子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-17 23:42 , Processed in 0.019369 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表