FPGA設計的心臟——時鐘電路

FPGA設計的心臟——時鐘電路

用心臟來比喻硬件設計中的時鐘,再合適不過了。

心臟跳動的節拍,頻率,就好比時鐘的頻率大小,上升和下降;

時鐘雖起伏有別,卻週而復始。

本文內容出自《通信IC設計》一書,僅作整合用於學習。

時鐘電路

設計不良的時鐘再極限的溫度,電壓或製造工藝的偏差下將導致錯誤的行爲,並且調試困難、花銷很大。根據時鐘的分類,可以分爲邏輯時鐘、接口時鐘、外部存儲器時鐘等。

  1. 邏輯時鐘

    邏輯時鐘取決於生成該時鐘邏輯的關鍵路徑,通常需要遵循一定的原則進行時鐘設計。邏輯時鐘進一步可細分爲:全局時鐘、門控時鐘、多級邏輯時鐘和波動式時鐘。多時鐘系統包括上述4種時鐘類型的任意組合。

  2. 接口時鐘

    異步信號的時序一般也是通過FPGA片內同步邏輯產生,一般需要同步化,即接口的同步化採樣。某些接口的同步時鐘一般是固定而精確的,例如SerDes的時鐘儘量由該組的專用時鐘引腳輸入,這樣可保證由一組SerDes組成的高速接口的時鐘偏斜一致。

  3. 外部存儲器時鐘

    外部存儲器時鐘主要包括LPDDR / DDR2 / DDR3等器件的時鐘。一般來書,FPGA的接口不用工作在相應器件的最高頻率,只要滿足系統緩存數據的性能即可。但由於此類接口需要對外部存儲器進行定時刷新,工作頻率過低會造成數據丟失或者不穩定,因此外部存儲時鐘存在一個最小時鐘頻率的問題。

  4. 其餘時鐘

    對於類似SPI / IIC / MDIO /等要輸出低速時鐘的電路,通常通過計數器或者內部寄存器邏輯輸出。這類電路無需通過PLL / DCM產生所需時鐘,因爲這類時鐘的驅動負載都可以通過引腳配置設定,而且要求的抖動、建立 / 保持時間都基本能夠滿足需求。

邏輯時鐘的時序模型

由於邏輯時鐘會對每個寄存器單元進行時序控制,而這些單元是按照一定的組織構架排列在FPGA內部的,所以將所有時鐘連線串接在一起,就會形成一個邏輯樹,即時鐘樹的概念。

時鐘樹同樣可以按照建立 / 保持時間、抖動等概念建立時序模型。該模型還需要考慮傳播中的偏斜、跳變和絕對垂直的偏差,以及其他一些不確定因素。不同的時鐘組合對應不同的參數組合(如網絡延遲、有效工作區等),因此組合時鐘數量越多,參數組合數量就越多,每個參數都滿足的機率就會變小。這就是組合時鐘電路不受歡迎的根源。

時鐘電路的時序模型

全局時鐘的設計

對於FPGA設計而言,全局時鐘是最簡單和最可預測的時鐘。在FPGA設計中,最好的時鐘方案是:由專用的全局時鐘輸入引腳驅動的單個主時鐘去鍾控設計項目中的每一個觸發器。只要可能,就儘量在設計項目中採用全局時鐘。FPGA都具有專門的全局時鐘引腳,它直接連接到器件的每一個寄存器上。這種全局時鐘提供器件中最短的時鐘到輸出的延時。(前面的I / O部分已經對此有詳細的說明)

門控時鐘設計

在許多應用中,整個項目都採用外部的全局時鐘是不可能或不實際的。FPGA中有專門的時鐘邏輯,以用於控制各個觸發器。驅動時鐘的邏輯必須只包含一個‘與’門或一個‘或’們。如果下圖的邏輯信號A附加了額外的毛刺,必然會影響到門控時鐘的輸出,且會產生時鐘毛刺,因此邏輯信號A最好是D鎖存器的直接輸出。

門控時鐘

門控時鐘波形如下圖:

門控時鐘產生的毛刺與冒險

多級時鐘設計

當產生門控時鐘的組合邏輯超過一級時,即超過單個的‘與’門或‘或’門時,該時鐘實際上會存在很多風險,因爲組合電路與時鐘結合往往會存在很多的毛刺,即使仿真結果中沒有顯現。多級時鐘實際上是不適合在FPGA中使用的,如果非要使用,最佳方法是將多級邏輯時鐘進行轉換。一種轉換方法是將組合電路進行時鐘鎖存,然後再與標準時鍾組合,形成最終時鐘輸出。

下圖左側是一個多級時鐘例子,這個時鐘電路必然會產生較多的毛刺,因此時鐘1時鐘2以及組合電路1會形成多種情況,必然也會有各種組合翻轉出現。

下圖右側的電路,則是對上述電路進行優化的實現方案。對電路的邏輯進行梳理,並將單個時鐘作爲D觸發器的輸入端,組合電路作爲使能端,這種情況下的生成時鐘非常穩定可靠,然後將兩個電路的時鐘通過FPGA專用時鐘選擇邏輯輸出最後的組合時鐘。

多級時鐘的修訂方法

行波時鐘

行波時鐘通常用於低速分頻時鐘,即講一個觸發器的輸出用作另一個觸發器的書中輸入。通常情況下,行波時鐘是觸發器的Q端輸出,如果該時鐘負載較小,且驅動電路能容忍的建立 / 保持時間較大,則可以像全局時鐘一樣可靠地工作。

如果行波時鐘在行波鏈上各觸發器的時鐘之間產生較大的時間偏移,並且會超出最壞情況下的建立 / 保持時間以及組合電路延遲之和,則該時鐘不能滿足要求。

在這裏插入圖片描述

行波時鐘的建立 / 保持時間不夠的情況如下圖:

行波時鐘原理圖

由於行波時鐘的時鐘沿與標準時鍾沿的關係較爲複雜,通常在ASIC電路中不提倡使用,FPGA也不推薦使用。推薦的辦法是採用同步計數器,並採用沿指示的方法產生時鐘(這個短句沒有理解)。例如:

module clock_div_new #(parameter cfactor=2,parameter cnt_len=8)(
	input clk_in,
	input rst,
	output clk_out
	);
reg clk_loc; 
reg [cnt_len-1:0] cnt;//allowed maximum clock division factor is 256
assign clk_out = (cfactor==1)? clk_in : clk_loc;
always@(posedge clk_in) begin
    if(rst==1) begin
		cnt <= 'd0;
		clk_loc = 1;
	end else begin
		cnt <= cnt + 1'b1;
    	if(cnt==cfactor/2-1) 
			clk_loc = 0;
    	else if(cnt==cfactor-1) begin 
			cnt <= 'd0;
			clk_loc = 1;
    	end
    end
end
endmodule

After

時鐘的概念,是數字電路設計的基礎,如果時鐘噪聲非常大,或者沒有跟數據同步,對於設計來說,無疑是失敗的。

好在FPGA平臺,對時鐘的設計考慮的非常周到。

一般來說,像筆者做FPGA設計,主時鐘,那都是PLL來實現的;時鐘約束起來也挺方便的,而且部分PLL的IP是自帶時鐘約束的。

關於時鐘約束的文章,網上有一大堆,也做過收藏:

關於時鐘約束的文章收藏

看完這個系列,就OK了。

以下是廣告?

Python企業招聘百萬級信息爬取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章