20220812更新:
图好像画错了,中间那个与门的输入其中一个是clk2,而不是clk3.
今天来讲一下时钟无毛刺切换技术。
顾名思义,时钟的无毛刺切换技术,其要点在于消除切换时可能会产生的毛刺
当选择信号select改变时,旧时钟和新时钟只要有一个处于高电平,那么原理上就有产生毛刺的风险。
①旧时钟为高电平,新时钟为低电平,可能会产生负脉冲,如上图所示。
②旧时钟为低电平,新时钟为高电平,可能会产生正脉冲,如下图(图太丑了,见谅)
③新旧时钟都为高电平,可能出现正毛刺,这个大家可以想一下为什么。
因此新旧时钟都为低电平时,为最佳的切换时间。但是当时钟之间的相位关系不确定时,是无法依靠确定性的电路设计在最佳切换时间是完成切换的。
上图所示为 常见的无毛刺切换电路,ck_sel信号经过同步后给到一个下降沿触发的寄存器,其输出与时钟信号经过一个与门,得到可用时钟信号,所有的可用时钟信号最后通过一个或门输出,
ck_sel信号是以下两种信号通过与门得到:
①选通信号经过译码后的本时钟选通信号。
②其他时钟的下降沿出发寄存器的非端。
电路的特点:
①当某个时钟被选通时,其他时钟不可能被选通。
②所有的选通信号都是下降沿变化,保证了选通信号改变时旧时钟是低电平
③旧时钟的选通信号拉低的时候,其他时钟的选通信号都是低电平,且隔一段时间才会拉高,
④时钟的切换步骤是:最初的选通信号改变->旧时钟的选通信号被拉低->新时钟的选通信号被拉高。
因此新旧时钟切换的中间,存在一段时间,在这段时间内,没有任何时钟被选通。
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/07/25 11:19:22
// Design Name:
// Module Name: glitch_free
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module glitch_free(
input clk1,
input clk2,
input clk3,
input rstn,
input [1:0] sel,
input clk_out
);
wire sel1,sel2,sel3;
wire ck_sel1,ck_sel2,ck_sel3;
wire clk1_or,clk2_or,clk3_or;
reg ck_sel1_r1,ck_sel1_r2,ck_sel1_neg;
reg ck_sel2_r1,ck_sel2_r2,ck_sel2_neg;
reg ck_sel3_r1,ck_sel3_r2,ck_sel3_neg;
assign sel1=(sel==2'b01);
assign sel2=(sel==2'b10);
assign sel3=(sel==2'b11);
assign ck_sel1=sel1&(~ck_sel2_neg)&(~ck_sel3_neg);
assign ck_sel2=sel2&(~ck_sel1_neg)&(~ck_sel3_neg);
assign ck_sel3=sel3&(~ck_sel1_neg)&(~ck_sel2_neg);
assign clk1_or = clk1&ck_sel1_neg;
assign clk2_or = clk2&ck_sel2_neg;
assign clk3_or = clk3&ck_sel3_neg;
assign clk_out = clk1_or|clk2_or|clk3_or;
always @ (posedge clk1 or negedge rstn)begin
if (!rstn)
{ck_sel1_r1,ck_sel1_r2} <= 2'b000;
else
{ck_sel1_r2,ck_sel1_r1} <= {ck_sel1_r1,ck_sel1};
end
always @ (negedge clk1 or negedge rstn)begin
if (!rstn)
ck_sel1_neg <= 1'b0;
else
ck_sel1_neg <= ck_sel1_r2;
end
always @ (posedge clk2 or negedge rstn)begin
if (!rstn)
{ck_sel2_r1,ck_sel2_r2} <= 2'b000;
else
{ck_sel2_r2,ck_sel2_r1} <= {ck_sel2_r1,ck_sel2};
end
always @ (negedge clk2 or negedge rstn)begin
if (!rstn)
ck_sel2_neg <= 1'b0;
else
ck_sel2_neg <= ck_sel2_r2;
end
always @ (posedge clk3 or negedge rstn)begin
if (!rstn)
{ck_sel3_r1,ck_sel3_r2} <= 2'b000;
else
{ck_sel3_r2,ck_sel3_r1} <= {ck_sel3_r1,ck_sel3};
end
always @ (negedge clk3 or negedge rstn)begin
if (!rstn)
ck_sel3_neg <= 1'b0;
else
ck_sel3_neg <= ck_sel3_r2;
end
endmodule
仿真结果
未注明的参考文章在此处列出:
(41条消息) Glitch free 无毛刺时钟切换电路、时钟无缝切换、时钟无毛刺切换技术_Cheeky_man的博客-CSDN博客_时钟无缝切换