时钟切换电路(Glitch-free clock switching circuit)

一、有毛刺的时钟切换
纯组合逻辑的时钟切换,由于为电平触发,不可避免会产生毛刺
时钟切换电路(Glitch-free clock switching circuit)_第1张图片
输出时钟(OUT CLOCK)由选择信号(SELECT)控制,
当SELECT为1时输出CLK1,反之,输出CLK0

时钟切换电路(Glitch-free clock switching circuit)_第2张图片
当SELECT信号由0到1时,out_clock从clk0转为clk1,当前时钟源(CLK0)正好处于高电平,因此,会在输出端产生毛刺;

assign outclk = (clk1 & select) | (~select & clk0);

二、相关时钟源的时钟切换
时钟切换电路(Glitch-free clock switching circuit)_第3张图片
(1)当SELECT为0时,CLK1的那部分通路到输出无效,仅看下半部分电路即可,在CLK0的下降沿采样SELECT(取反后)信号,与CLK0相与之后输出;当SELECT为1时,同理上半部分电路有效;
(2)如图首先SELECT为0,也就是在CLK0的下降沿采样寄存SELECT(取反后)信号与CLK0相与,输出时钟为CLK0;当在图中时刻SELECT由低电平变为高电平,此时未到CLK0的下降沿,寄存器的输出还将一直是高电平(SELECT之前为0,取反为1)
(3)当到达CLK0的下降沿时刻,采样到SELECT为高电平,此时SELECT为1,也就是下半部分电路从此无效,上半部分电路有效,此时需要等到CLK1的下降沿采样SELECT值,在此之前,输出仍为 CLK0
(4)到达CLK1的下降沿后,输出变成了CLK1和SELECT的与,也就是CLK1


module glitch_2 (
  input clk0,    
  input clk1,
  input select,
  input rst_n,
  output clkout
);
 reg out1;
 reg out0;
 always @(negedge clk1 or negedge rst_n)begin
     if(rst_n == 1'b0)begin
         out1 <= 0;
     end
     else begin
         out1 <= ~out0 & select;
      end
 end
 always @(negedge clk0 or negedge rst_n)begin
       if(rst_n == 1'b0)begin
           out0 <= 0;
       end
       else begin
           out0 <= ~select & ~out1;
       end
 end
 assign clkout = (out1 & clk1) | (out0 & clk0);
 endmodule

三、异步时钟源的时钟切换
时钟切换电路(Glitch-free clock switching circuit)_第4张图片

module glitch_DFF (
    input clk0,    
    input clk1,
    input select,
    input rst_n,
    output clkout
);
wire B;
reg   DFF3Q, DFF4Q, DFF4_Q;   //DFF4Q=Q,DFF4_Q=~Q
wire A;
reg   DFF1Q, DFF2Q, DFF2_Q;  //DFF2Q=Q,DFF2_Q=~Q

assign A = select & DFF4_Q;
assign B = ~select & DFF2_Q;

//第一级触发器用上升沿采样,选择信号与反馈信号的与运算
always@(posedge clk1 or negedge rst_n) begin
    if(~rst_n)
        DFF1Q <= 0;
    else
        DFF1Q <= A;
end
 //第二级触发器用下降沿采样
always@(negedge clk1 or negedge rst_n) begin
    if(~rst_n) begin
        DFF2Q <= 0;
        DFF2_Q <= 1;
    end
    else begin
        DFF2Q <= DFF1Q;
        DFF2_Q <= ~DFF1Q;
     end
 end
 //====================================================================
//第一级触发器用上升沿采样,选择信号与反馈信号的与运算
always@(posedge clk0 or negedge rst_n) begin
    if(~rst_n)
        DFF3Q <= 0;
    else
        DFF3Q <= B;
end
//第二级触发器用下降沿采样
always@(negedge clk0 or negedge rst_n) begin
    if(~rst_n) begin
        DFF4Q <= 0;
        DFF4_Q <= 1;
    end
    else begin
        DFF4Q <= DFF3Q;
        DFF4_Q <= ~DFF3Q;
     end
end

wire E, F;
assign E = clk1 & DFF2Q;
assign F = clk0 & DFF4Q;
assign clkout = E | F;
endmodule

你可能感兴趣的:(IC笔试题)