clock_glitch_free_switch

                                                               ______________________
//                                                                  |                    |
//                   ______    _________    _________    _________  |  ________          |  
//   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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值