______________________
// | |
// ______ _________ _________ _________ | ________ |
// sel------------| ) | | | | | | | | | |
// | | & )--|D Q|----|D Q|----|D Q|--i--|D Q| |
// | i-|______) | | | | | | | | |
// | | | CLK | | CLK | | CLK | | CLK Qn|----- |
// | | |___/\__| |___/\__| |___/\__| |___/\__| | |
// | | | | | | | | ______
// | | | | | | | i---| )
// | | | | | | | | ICG )----------i
// | | | | | | | i---|______) |
// | | clk1----------i------------i------------i-------------i-------|----i |
// __|___ __|_________________________________________________________________| |
// \INV / | | |
// \ / | | |
// \/ | | |
// | | |_________________________________________________________________ |
// | | ________________|_____ | ______
// | | | | | i--------) )
// | | ______ _________ _________ _________ | ________ | | ) || )------------clk_out
// | i-| ) | | | | | | | | | | | i--------)______)
// | | & )----|D Q|----|D Q|----|D Q|--i--|D Q| | | |
// i--------|______) | | | | | | | | | | |
// | CLK | | CLK | | CLK | | CLK Qn|----- | |
// |___/\__| |___/\__| |___/\__| |___/\__| | |
// | | | | | ______ |
// | | | | i---| ) |
// | | | | | ICG )----------
// | | | | i---|______)
// clk0---------i------------i------------i-------------i-------------i
//
// ----------------------------------------------------------------------------------------------------------------------
// Modification History:
// Date By Version Change Description
// ---------------------------------------------------------------------------------
// 2022/08/01 zhanglin 1.0 Original
// -FHDR----------------------------------------------------------------------------
`ifdef NO_ASIC
`else
`include "std_cell_def.h"
`endif
module clk_glitch_free_switch(
input se ,
input sel , //1 - clk1 0 - clk0
input clk1 ,
input clk0 ,
input rst0_n ,
input rst1_n ,
output clk_out ,
output clk0_sel ,
output clk1_sel ,
output sel_done
);
/***************************************************/
reg q1 ;
reg q2 ;
reg q3 ;
reg q4 ;
reg q5 ;
reg q6 ;
reg q7 ;
reg q8 ;
wire clk0_out;
wire clk1_out;
always@(posedge clk1 or negedge rst1_n) begin
if(!rst1_n)
q1 <= 1'b0;
else
q1 <= (~q8) & (sel);
end
/***************************/
always@(posedge clk1 or negedge rst1_n) begin
if(!rst1_n)
q2 <= 1'b0;
else
q2 <= q1;
end
always@(posedge clk1 or negedge rst1_n) begin
if(!rst1_n)
q3 <= 1'b0;
else
q3 <= q2;
end
always@(posedge clk1 or negedge rst1_n) begin
if(!rst1_n)
q4 <= 1'b0;
else
q4 <= q3;
end
/***************************************************/
always@(posedge clk0 or negedge rst0_n) begin
if(!rst0_n)
q5 <= 1'b1;
else
q5 <= (~q4) & (~sel);
end
/***************************/
always@(posedge clk0 or negedge rst0_n) begin
if(!rst0_n)
q6 <= 1'b1;
else
q6 <= q5;
end
/***************************/
always@(posedge clk0 or negedge rst0_n) begin
if(!rst0_n)
q7 <= 1'b1;
else
q7 <= q6;
end
/***************************/
always@(posedge clk0 or negedge rst0_n) begin
if(!rst0_n)
q8 <= 1'b1;
else
q8 <= q7;
end
/**************************************************/
icg icg_u0(
.clkin ( clk0 ),
.enable ( q7 ),
.se ( se ),
.clkout (clk0_out)
);
icg icg_u1(
.clkin ( clk1 ),
.enable ( q3 ),
.se ( se ),
.clkout (clk1_out)
);
`ifdef NO_ASIC
assign clk_out = clk0_out | clk1_out;
`else
`ifdef EVEREST2
`STD_CLK_OR_CELL u_clk_out(
.A1 (clk0_out ),
.A2 (clk1_out ),
.Z (clk_out )
);
`else
`ifdef OLYMPUS2
`STD_CLK_OR_CELL u_clk_out(
.A (clk0_out ),
.B (clk1_out ),
.Y (clk_out )
);
`endif
`endif
`endif
assign clk0_sel = ~sel & q8;
assign clk1_sel = sel & q4;
assign sel_done = ~((sel ^ q4) | (~sel ^ q8));
endmodule
// +FHDR----------------------------------------------------------------------------
// Copyright (c) 2022 Cygnusemi.
// ALL RIGHTS RESERVED Worldwide
//
// Author : zhanglin
// Email : linn_zh@cygnusemi.com
// Created On : 2022/08/01 14:57
// Last Modified : 2023/04/03 16:12
// File Name : clk_glitch_free_switch_3.v
// Description :
// clk_glitch_free_switch_3 module support 3 to 1;
// alone hot code; 3'b001 - clk0; 3'b010 - clk1; 3`b100 - clk2
//
// sel[2] sel[1] sel[0]
// | | | _________ _________
// | | | | | | |
// | | i-------|D Q|----|D Q|---i
// | | | | | | |
// | | | CLK | | CLK | |
// | | |___/\__| |___/\__| |
// | | ________________|____________| |
// | | i |
// | | | _________ _________ |
// | | | | | | | |
// | | | i------|D Q|----|D Q| | ______ _________
//CLK0-|----|----i | | | | | i-----| ) | |
// | | | | | CLK | |CLK Qn|---------| & )-----|D Q|----i--------------------i
// | | | | |___/\__| |___/\__| i----|______) | | | |
// | | |____|___________|____________| | | CLK | | |
// | | | | | |___/\__| | | ______
// | | | | | | | i---| )
// | | | | _________ _________ | | | _________ | ICG )-------i
// | | | | | | | | | | | | | i---|______) |
// | | | i--|------|D Q|----|D Q| | | i--|D Q|---i | |
// | | | | | | | | | | | | | | | |
// | | | | | | CLK | |CLK Qn|----i | | CLK | | | |
// | | | | | |___/\__| |___/\__| | |___/\__| | | |
// | | i_|__|___________|____________|_______________________________|_______________|______|_____| |
// | | | | ______________________________________________________________________________| |
// | | | i_i__i___________________________________________________________________________ |
// | | | | | | | |
// | | | | | | _________ _________ | |
// | | | | | | | | | | | |
// | i------|--|-|--|-|D Q|----|D Q|---i | |
// | | | | | | | | | | | |
// | | | | | | CLK | | CLK | | | |
// | | | | | |___/\__| |___/\__| | | |
// | _|__|_|__|______|____________| | | |
// | i | | | | | | |
// | | | | | | _________ _________ | | |
// | | | | | | | | | | | | |
// | | | | | i-|D Q|----|D Q| | ______ _________ | |
//CLK1-|---------i | | | | | | | i-----| ) | | | |
// | | | | | | CLK | |CLK Qn|---------| & )-----|D Q|----i--------------|-----i |
// | | | | | |___/\__| |___/\__| i----|______) | | | | | |
// | i_|__|_|_________|____________| | | CLK | | | | |
// | | | | | | |___/\__| | | | ______ | ______
// | | | | | | | | | i---| ) i--) )
// | | | | | _________ _________ | | | _________ | | ICG )-----------) || )
// | | | | | | | | | | | | | | | i---|______) i--)______)
// | | i--|-|----|D Q|----|D Q| | | i--|D Q|---i | |
// | | | | | | | | | | | | | | |
// | | | | | | CLK | |CLK Qn|----i | | CLK | | |
// | | | | | |___/\__| |___/\__| | |___/\__| | |
// | i_|__|_|_________|____________|_______________________________|_______________|____________| |
// | | | | |
// | | | | |
// | | | | |
// | i__|_|______________________________________________________________________________ |
// | | | | |
// | | | _________ _________ | |
// | | | | | | | | |
// i--------------|-|----|D Q|----|D Q|---i | |
// | | | | | | | | |
// | | | CLK | | CLK | | | |
// | | |___/\__| |___/\__| | | |
// ____|_|_________|____________| | | |
// i | | | | |
// | | | _________ _________ | | |
// | | | | | | | | | |
// | | i----|D Q|----|D Q| | ______ _________ | |
//CLK2- ---------i | | | | | i-----| ) | | | |
// | | | CLK | |CLK Qn|---------| & )-----|D Q|----i--------------|-----i |
// | | |___/\__| |___/\__| -----|______) | | | | | |
// i____|___________|____________| | | CLK | | | | |
// | | | |___/\__| | | | ______ |
// | | | | | | i---| ) |
// | | _________ _________ | | | _________ | | ICG )-------i
// | | | | | | | | | | | | i---|______)
// | i------|D Q|----|D Q| | | i--|D Q|---i |
// | | | | | | | | | |
// | | CLK | |CLK Qn|----i | | CLK | |
// | |___/\__| |___/\__| | |___/\__| |
// i________________|____________|_______________________________|_______________|____________|
//
//
// ----------------------------------------------------------------------------------------------------------------------------------------
// Modification History:
// Date By Version Change Description
// ---------------------------------------------------------------------------------
// 2022/08/01 zhanglin 1.0 Original
// -FHDR----------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------------------------------------------------------
`ifdef NO_ASIC
`else
`include "std_cell_def.h"
`endif
module clk_glitch_free_switch_3(
input se ,
input [2:0] sel , // alone hot code; 3'b001 - clk0; 3'b010 - clk1; 3`b100 - clk2;
input clk0 ,
input clk1 ,
input clk2 ,
input rst_n ,
output clk_out ,
output clk0_sel ,
output clk1_sel ,
output clk2_sel ,
output sel_done
);
/**************************************************/
reg sel0_d1 ;
reg sel0_d2 ;
reg clk0_on ;
reg clk0_on_reg ;
reg clk0_on_d1 ;
reg clk0_on_d2 ;
reg sel1_d1 ;
reg sel1_d2 ;
reg clk1_on ;
reg clk1_on_reg ;
reg clk1_on_d1 ;
reg clk1_on_d2 ;
reg sel2_d1 ;
reg sel2_d2 ;
reg clk2_on ;
reg clk2_on_reg ;
reg clk2_on_d1 ;
reg clk2_on_d2 ;
wire clk0_out ;
wire clk1_out ;
wire clk2_out ;
/**************************************************/
always@(posedge clk0 or negedge rst_n) begin
if(!rst_n)begin
sel0_d1 <= 1'd0;
sel0_d2 <= 1'd0;
end
else begin
sel0_d1 <= sel[0] ;
sel0_d2 <= sel0_d1;
end
end
always@(posedge clk0 or negedge rst_n) begin
if(!rst_n)begin
clk1_on_d1 <= 1'd0;
clk1_on_d2 <= 1'd0;
end
else begin
clk1_on_d1 <= clk1_on_reg;
clk1_on_d2 <= clk1_on_d1 ;
end
end
always@(posedge clk0 or negedge rst_n) begin
if(!rst_n)begin
clk2_on_d1 <= 1'd0;
clk2_on_d2 <= 1'd0;
end
else begin
clk2_on_d1 <= clk2_on_reg;
clk2_on_d2 <= clk2_on_d1 ;
end
end
always@(posedge clk0 or negedge rst_n) begin
if(!rst_n)
clk0_on <= 1'd0;
else
clk0_on <= sel0_d2 & (~clk1_on_d2) & (~clk2_on_d2);
end
always@(posedge clk0 or negedge rst_n) begin
if(!rst_n)
clk0_on_reg <= 1'd0;
else
clk0_on_reg <= clk0_on;
end
icg icg_u0(
.clkin ( clk0 ),
.enable ( clk0_on ),
.se ( se ),
.clkout (clk0_out )
);
/**************************************************/
always@(posedge clk1 or negedge rst_n) begin
if(!rst_n)begin
sel1_d1 <= 1'd0;
sel1_d2 <= 1'd0;
end
else begin
sel1_d1 <= sel[1] ;
sel1_d2 <= sel1_d1;
end
end
always@(posedge clk1 or negedge rst_n) begin
if(!rst_n)begin
clk0_on_d1 <= 1'd0;
clk0_on_d2 <= 1'd0;
end
else begin
clk0_on_d1 <= clk0_on_reg;
clk0_on_d2 <= clk0_on_d1 ;
end
end
always@(posedge clk1 or negedge rst_n) begin
if(!rst_n)begin
clk2_on_d1 <= 1'd0;
clk2_on_d2 <= 1'd0;
end
else begin
clk2_on_d1 <= clk2_on_reg;
clk2_on_d2 <= clk2_on_d1 ;
end
end
always@(posedge clk1 or negedge rst_n) begin
if(!rst_n)
clk1_on <= 1'd0;
else
clk1_on <= sel1_d2 & (~clk0_on_d2) & (~clk2_on_d2);
end
always@(posedge clk1 or negedge rst_n) begin
if(!rst_n)
clk1_on_reg <= 1'd0;
else
clk1_on_reg <= clk1_on;
end
icg icg_u1(
.clkin ( clk1 ),
.enable ( clk1_on ),
.se ( se ),
.clkout (clk1_out )
);
/**************************************************/
always@(posedge clk2 or negedge rst_n) begin
if(!rst_n) begin
sel2_d1 <= 1'd0;
sel2_d2 <= 1'd0;
end
else begin
sel2_d1 <= sel[2] ;
sel2_d2 <= sel2_d1;
end
end
always@(posedge clk2 or negedge rst_n) begin
if(!rst_n) begin
clk0_on_d1 <= 1'd0;
clk0_on_d2 <= 1'd0;
end
else begin
clk0_on_d1 <= clk0_on_reg;
clk0_on_d2 <= clk0_on_d1 ;
end
end
always@(posedge clk2 or negedge rst_n) begin
if(!rst_n) begin
clk1_on_d1 <= 1'd0;
clk1_on_d2 <= 1'd0;
end
else begin
clk1_on_d1 <= clk1_on_reg;
clk1_on_d2 <= clk1_on_d1 ;
end
end
always@(posedge clk2 or negedge rst_n) begin
if(!rst_n)
clk2_on <= 1'd0;
else
clk2_on <= sel2_d2 & (~clk0_on_d2) & (~clk1_on_d2);
end
always@(posedge clk2 or negedge rst_n) begin
if(!rst_n)
clk2_on_reg <= 1'd0;
else
clk2_on_reg <= clk2_on;
end
icg icg_u2(
.clkin ( clk2 ),
.enable ( clk2_on ),
.se ( se ),
.clkout (clk2_out )
);
`ifdef NO_ASIC
assign clk_out = clk0_out | clk1_out | clk2_out;
`else
`ifdef EVEREST2
wire clk01_out;
`STD_CLK_OR_CELL u0_clk_out(
.A1 (clk0_out ),
.A2 (clk1_out ),
.Z (clk01_out )
);
`STD_CLK_OR_CELL u1_clk_out(
.A1 (clk01_out ),
.A2 (clk2_out ),
.Z (clk_out )
);
`else
`ifdef OLYMPUS2
wire clk01_out;
`STD_CLK_OR_CELL u0_clk_out(
.A (clk0_out ),
.B (clk1_out ),
.Y (clk01_out )
);
`STD_CLK_OR_CELL u1_clk_out(
.A (clk01_out ),
.B (clk2_out ),
.Y (clk_out )
);
`endif
`endif
`endif
assign clk0_sel = clk0_on_reg & (sel == 3'b001);
assign clk1_sel = clk1_on_reg & (sel == 3'b010);
assign clk2_sel = clk2_on_reg & (sel == 3'b100);
assign sel_done = clk0_sel | clk1_sel | clk2_sel;
endmodule