秋招准备

发布时间 2023-07-06 22:23:28作者: VincentZJ

无毛刺时钟切换

门控时钟能够有效降低动态功耗,低功耗设计方法之一,在ASIC中使用较多,在FPGA使用较少(会影响时序分析)

核心思想 与门/与非门实现的门控时钟只能在时钟低电平处切换,也就是下降沿处切换;对于或门/或非门,高电平切换,也就是上升沿。 

1.相关时钟之间

  只需要在时钟源的选择路径加上一个下降沿有效的触发器(时钟输出是与门门控)用来接收另外一个时钟的选择信号的取反信号

2不相关时钟之间

  在相关时钟无毛刺切换的基础上多加寄存器进行信号打两拍处理,降低亚稳态对信号的影响

 

时钟无毛刺切换代码
 module clk_switch(
	//sys
	input				clk1		,
	input				clk2		,
	input				rst_n		,
	//input
	input				sel			,
	//output
	output				clk_out		
);
//=========================================
//================define===================
//=========================================
wire 			sel_1;
wire			sel_2;
reg	[1:0]		dff1_r;
reg [1:0]		dff2_r;
reg 			dff1_neg_out;
reg				dff2_neg_out;

wire 			clk1_out,clk2_out;



//=========================================
//================main code================
//=========================================
assign sel_1 =  sel & ~dff1_neg_out;
assign sel_2 = ~sel & ~dff2_neg_out;

always@(posedge clk1 or negedge rst_n)begin
	if(!rst_n)
		dff1_r <= 'd0;
	else
		dff1_r <= {dff1_r[1],sel_1};
end

always@(posedge clk2 or negedge rst_n)begin
	if(!rst_n)
		dff2_r <= 'd0;
	else
		dff2_r <= {dff2_r[1],sel_2};
end

always@(negedge clk1 or negedge rst_n)begin
	if(!rst_n)
		dff1_neg_out <= 'd0;
	else
		dff1_neg_out <= dff1_r[1];
end

always@(negedge clk2 or negedge rst_n)begin
	if(!rst_n)
		dff2_neg_out <= 'd0;
	else
		dff2_neg_out <= dff2_r[1];
end

assign clk1_out = dff1_neg_out & clk1;
assign clk2_out = dff2_neg_out & clk2;

assign clk_out = clk1_out | clk2_out;

endmodule