日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

IC設計中glitch free時鐘選擇器的設計過程

作者:小蒼蠅別鬧 更新時間: 2022-07-21 編程語言

??????? 芯片設計,包括FPGA程序設計中,都可能出現時鐘選擇器。在時鐘選擇器設計中,非常重要的一點就是避免在時鐘切換時產生毛刺。

??????? 關于glitch free時鐘選擇器設計的文章很多,但大多數都是直接給出了幾種設計方法,而沒有思考過程。本文則記錄了自己的這一過程。

1. glitch free時鐘選擇器的基本結構會是什么樣的?

??????? 假設存在兩個時鐘,clka和clkb,sel為0時clka輸出,為1時clkb輸出;當前sel為0,clka正在輸出。在上述假設下,如果sel切換為1,那么clkb需要輸出。

??????? 首先從考慮實現glitch free需要滿足什么樣的條件。第一,clka的輸出需要先被同步關閉;第二,clkb需要在clka同步關閉后,再被同步開啟。

??????? 為了滿足上述條件,在最簡的實現下,clka時鐘域至少存在一個寄存器,該寄存器輸出clka的時鐘控制信號,用于實現clka的同步輸出/禁止控制,該寄存器記為q2;同理clkb時鐘域也存在這樣一個寄存器,記為q4。

??????? 除了clka同步禁止外,禁止和啟動順序也很重要。clka需要先被禁止,然后clkb同步使能。所以,clkb的控制邏輯需要知道何時clka被禁止。為了實現該過程,那么q2的輸出一定會被反饋給clkb的控制邏輯,然后送給q4。q2的輸出為clka時鐘域的信號,當他被送給q4前,需要經由clkb重新進行同步處理。同理,q4到q2之間也存在同樣的反饋回路和同步過程。

??????? 基于上述分析,glitch free時鐘選擇器的最簡實現中,至少包含4個寄存器。q2和q4分別產生clka和clkb的同步時鐘控制信號。在q2之前還存在q1,在q4之前還存在q3,分別實現對上文提到的反饋信號的同步處理。

??????? 在q1和q2之間還存在簡單的組合邏輯,該組合邏輯的輸入分別是sel和feedback_b,feedback_b與q4輸出相關,也就是與clkb輸出狀態相關;同理,在q3和q4之間也存在這樣的組合邏輯。這兩部分組合邏輯的作用是為了實現sel信號對時鐘使能/禁止的控制。

2. q1和q2,q3和q4之間的組合邏輯是什么樣的?

??????? q1和q2之間,q3和q4之間的控制邏輯應該是相似的。該組合邏輯有兩個輸入,以clka時鐘為例,應該滿足以下條件:

??????? 當sel為1時,clka輸出被禁止,feedback_b的值不重要;

??????? 當sel由1切換為0時,組合邏輯輸出不會立即發生變化。而是等待feedback_b,當feedback_b也發生變化時,組合邏輯輸出才會變化,最終使能clka。

??????? 基于上述思考,可以考慮在q1和q2之間使用“與”邏輯。該“與”邏輯的行為是:當sel為1時,組合邏輯輸出立即變化,導致clka最先被同步關閉;當sel由1變為0時,只是滿足了“與”邏輯輸出值變化的一個條件,需要繼續等待feedback_b變化后,輸出才會翻轉,最終使能clka。

3. 時鐘使能/禁止邏輯

??????? 這部分選擇的自由度應該比較大。我們就選擇使用或邏輯來實現時鐘輸出的使能和禁止,當時鐘被禁止時,輸出為常1。clka和clkb的“或”邏輯輸出,進行“與”操作后作為最終的時鐘輸出。如下圖。

4. 分析并確定具體的實現邏輯

??????? 當我們確定基本結構和組合邏輯的基本形式后,需要找到一個切入點來確定最終的實現形式。個人認為最好的切入點是sel變化時,被禁止的時鐘。因為禁止行為最先發生,使能行為后發生。

??????? 假設sel由0變為1,此時q2的輸出需要在下一個clka上升沿后立即變為1,從而實現clka的禁止操作。

???????? 代碼如下。

`timescale 1ps / 1ps

module clk_switch (
	input 				clka,
	input 				clkb,
	input 				sel, 	// 0: clka, 1: clkb

	output 				clk_o
);

reg 			ff1, ff2, ff3, ff4;
wire 			clka_inner_src, clkb_inner_src;

always_ff @ (posedge clka) begin
    ff2 <= ~sel & ~ff1;
    ff1 <= ff4;
end 

always_ff @ (posedge clkb) begin
    ff3 <= ff2;
    ff4 <= sel & ~ff3;	
end 

assign clka_inner_src = ~ff2 | clka;
assign clkb_inner_src = ~ff4 | clkb;

assign clk_o = clka_inner_src & clkb_inner_src;

endmodule

????????

原文鏈接:https://blog.csdn.net/yinyeyy/article/details/125831541

欄目分類
最近更新