返回列表 发帖

[原创] Verilog基本电路设计之二(时钟无缝切换)

本帖最后由 杰克淡定 于 2016-6-17 12:42 编辑

回复 3# 07048097


   正解!多谢你的探讨回复,能考虑到问题这一层面的,说明你也是深究过问题本质的。

   对此问题,那我就来做个总结吧。
   回到part1和part3中的两处组合逻辑sel_clka_d0 <= (~sel_clkb) & (~sel_clkb_dly3) 和sel_clkb_d0 <= sel_clkb & (~sel_clka_dly3) ,等价抽象为c=a&b的逻辑,其中a来自clk1域,b来自clk2域,信号c将会在clk3域被同步。当a,b两个信号同时变化时,得到的c会存在毛刺,毛刺可能被clk3抓到而导致错误,避免错误的唯一办法:保证a和b不要同时跳变!


看我们的设计中,sel_clka_dly3和sel_clkb_dly3通过part2和part4电路delay,实际上就是错开了和sel_clkb的跳变沿,part2和part4部分用的DFF越多,它们与sel_clkb的变化沿相隔的越远而越安全,大家可以仿真模拟看看波形。也许有人说去掉part2和part4部分,通过前面的part1和part3两级同步电路,已经可以让它们之间的跳变沿相差两个cycle了。如果你考虑1GHz高频时钟切换就不会这么想了,两个cycle的差异仅仅是2个ns,而且再去做c=a&b这个与逻辑输入端时,由于a与b的异步时序关系以及信号传递差异,此时它们之间的跳变沿相差是无法保证还有两个ns的。因此,对于高频时钟切换,只能通过尽量增加part2和part4的级数,提高绝对跳变沿的延时,从而留给c=a&b这个与逻辑更多的时间裕量。


所以,part2和part4部分的作用:1、如果part5用与逻辑做gating,保留part2和part4的反相沿设计初步避免时钟gating毛刺;2、高频时钟切换中,增加级数降低part1和part3同步的亚稳态概率;3,高频时钟切换中,增加级数降低part1和part3中“与”逻辑毛刺风险。清楚了原因,就可以根据自己的实际情况对part2和part4做取舍。

TOP

我想把glitch free clock switch简单化下,如果给两bit的选择信号,2'b01表示选clka, 2'b10表示选clkb, 2‘b00和2'b11表示全部gating, 是不是对clockswitch 的要求非常简单,就是2'b01变 2'b10的时候需要保证一定gap来gating 两个clock, 反之亦然。
那问题来了,如何由1bit的select信号转换出上面写的两bits select 信号, 并保证一定的gap.

always@(posedge  clka or negedge rstn) begin
    if(~rstn)
        clka_d1 <= 1'b1;
        clka_d2 <= 1'b1;
    end else begin
        clka_d1    <=  clka_sel;
        clka_d2    <= clka_d1;
   end
end

always@(posedge  clkb or negedge rstn) begin
    if(~rstn)
        clkb_d1 <= 1'b0;
        clkb_d2 <= 1'b0;
    end else begin
        clkb_d1    <=  clkb_sel;
        clkb_d2    <= clkb_d1;
   end
end

wire clka_sel =   select & ~clkb_d2 ;  //better to  use standard cell with don't touch
wire clkb_sel = ~select & ~clka_d2 ;  //better to  use standard cell with don't touch

wire clka_out = clka_d2 & clka;   //better to  use standard cell with don't touch
wire clkb_out = clkb_d2 & clkb;  //better to  use standard cell with don't touch
wire clk_out    = clka_out | clkb_out;

clka_sel和clkb_sel就是两bit的信号,

TOP

本帖最后由 杰克淡定 于 2016-6-17 17:20 编辑

回复 12# yaya126

你的意思是说,你要求用一个两bit的select【1:0】信号,实现2'b01选clka, 2'b10选clkb, 2‘b00和2'b11不输出时钟,是这样吗?灵活变通一下嘛,主体切换电路直接调用我的模块,外围信号再简单处理一下先得到sel_clkb,最后输出时钟做个门控关断即可。

always@(posedge  clkx or negedge rst_n)
begin
    if (~rst_n)
          sel_clkb <= 1'b0;
    else
         sel_clkb <= (select==2'b10);
end

clk_switch clk_switch (
                .rst_n           (rst_n   ) , //
                .clka            (clka      ), //
                .clkb            (clkb      ), //
                .sel_clkb       (sel_clkb), //
                .clk_o          (clk_tmp )  //
                );

always@(posedge  clkx or negedge rst_n)
begin
    if  (~rst_n)
         clk_en <= 1'b0;
    else
         clk_en <= (^select);
end

clk_gate_xxx clk_gate_o ( .CP(clk_tmp ), .EN(clk_en ), .Q(clk_o)  .TE(1'b0) );

clk_o就是最后你需要的时钟了。select是哪个时钟域的信号,上面的两个always中的clkx就用哪个时钟。如果想使用与门代替上面的clk_gate_xxx,用clk_tmp下降沿把clk_en抓两拍后再跟clk_tmp做与逻辑得到最后的clk_o

TOP

回复 13# 杰克淡定
不是,我的意思是说, 设计1bit控制的glitch free clock switch, 可以转换角度,设计一个两bit的控制,核心问题转变成如何产生2'b01-N*2'B00-2'b10这样的pattern.   保证没有glitch,只需要select信号和各自的时钟对齐,且10/01之间的gap足够。

TOP

你仔细看看我的那段code,也是由单bit select产生sela和selb, 但我的思路和你略有不同。

TOP

回复 15# yaya126

思考问题的方式差异而已,你没发现你写出的code跟我的其实本质是一样的吗,是我写的电路简化掉part2和part4部分后的版本。而对于part2和part4能否随意简化,前面已经有过讨论了。另外对于你的:wire clka_out = clka_d2 & clka;   //better to  use standard cell with don't touch
wire clkb_out = clkb_d2 & clkb;  //better to  use standard cell with don't touch
这里clka_d2和clkb_d2必须要用下降沿产生,否则有毛刺,其中原因帖子里也分析过了。

TOP

多谢楼主肯定,另外我有一个问题就是楼主的时钟切换电路中间有一段时间是没有clk输出的,如果后面delay选择信号越多拍,那么这个gap会越大,是吗?

TOP

回复 16# 杰克淡定
果然,再仔细看下,实质是一样的, 保证一定的gap,其实也是通过增加pile来实现。
不过你说的会有毛刺,这个不是必然的,为什么建议采用standard cell在手动搭,就是考虑到这个问题,当clka和sela有固定的相位关系是没有毛刺的。

TOP

回复 17# 07048097

是的,在切换过程中,会有一段时间没有时钟输出。增加的DFF级数越多,切换过程花更长的时间来完成,也就是带来gap段更大,这是增加DFF级数的弊端。无缝切换,你是希望切换过程更安全,还是追求切换快速完成,这就是矛盾。所以大家才需要根据自己的实际应用条件,对part2和part4部分进行灵活增减处理。

TOP

楼主分析的很透彻,尤其是最后一个问题的解释很精彩,之前一直没考虑到,学习了!

TOP

返回列表

站长推荐 关闭


下一个十年IC行业问题? 点击查看串联产业圈咨询的全链路透明平台

下一个十年IC行业问题? 点击查看串联产业圈咨询的全链路透明平台


查看