在定時電路中,合適而準確的時鐘脈沖基準信號極其重要,一般用晶振作為基準信號。但晶體產品因制造的不一致性,或者惡劣的環境干擾(如高溫高壓等),會帶來晶振時基有別,如果電路設計中沒有加以考慮,同類電路產品之間也就會帶來定時的誤差。用簡單計數器分頻法可以解決這個問題,但是,簡單分頻器是整數分頻,定時時間越長,累計誤差越大。若用分數分頻器,由于計算近似值不易處理,也會帶來較大的累計誤差。對于一些精度要求高的場合,尤為明顯。本文就此給出了一種較合理的解決方法:在時域,對時鐘周期差給予累計,進而校正計時時鐘。
1 基本原理
在所需定時的時間間隔里,對實際時鐘周期與標準時鐘周期之差進行累積,累積到一個周期,對計時時鐘修改一次,這樣,不斷累積,不斷修改,從而將實際時基信號(慢或快)校正為一個標準時基信號。為此,首先采用同步加法器,對周期差進行累計,其進位輸出可以表明累計值達到一個周期;其次,通過采集進位端輸出,并區分開實際比標準時鐘慢或快,從而產生插入脈沖或扣除脈沖;,將產生的插入脈沖和扣除脈沖與實際時鐘脈沖相疊加后變成標準時鐘脈沖信號,作為定時電路的時基信號,這樣,就解決了時鐘校正問題。
本設計的核心是加法器與脈沖產生時序:
(1)加法器 加法器位數(二進制)決定了校正的精度,位數越高,精度越高。加法器原理圖如圖1所示,圖中cy是加法器的進位輸出端,ck_time為實際時鐘或待校時鐘。
設加法器位數14位,標準時鐘周期為Ts,待校時鐘ck_time周期為Tx。則周期差:Tx-Ts,由比例因子關系可得:
加法器一個加數:A=(Tx-Ts)/Tx×214另一個加數:B是加法器的和數
例如:Tx=51.42μs,Ts=20μs則A10 011
若定時1 s,則可能累計誤差為一個周期加上由于計算誤差引起的累計誤差之和:
可見累計誤差是較小的。
(2)脈沖產生時序 為了產生正確時序,首先將實際時鐘ck經4分頻之后,生成一個ck_time的脈沖信號,作為實際時鐘對待;生成一個脈沖信號ck_inc和ck_dec,以產生插入脈沖inc_o和扣除脈沖dec_o,如圖2所示。
2 VHDL語言代碼的設計
VHDL硬件描述語言是IEEE國際工業標準,具有描述能力強、可以與工藝無關、易于共享與復用等特點。多VHDL語言以及MAXPLUSⅡ平臺的。根據以上原理設計VHDL代碼,總體分為3個功能模塊:加法器模塊、時鐘校正模塊以及定時模塊。
(1)加法器模塊(add14) 直接引用MAXPLUSⅡ的參數化設計庫PLM內容。
(2)時鐘校正模塊(updat_ck) 代碼中clr_a和ic_dc為全局清零信號和被校時鐘快慢標志,id_dc為1表示Tx比Ts慢,則插入脈沖inc端有輸出;反之,扣除脈沖dec端有輸出。inc,dec即為圖2的inc_o,dec_o。主要代碼如下(省去了加法器的元件例化及IEEE庫說明等):
(3)定時模塊 主要是將updat_ck模塊的輸出時鐘校正信號inc和dec被校時鐘信號timp_ck作為輸入,在使能en信號有效時,并行置入定時初始值data_in之后,定時開始,當定時到,輸出一個具有一定脈寬的tm_over信號。仿真波形如圖2所示。為了簡便起見,仿真的Grid size設為2.5μs,定時位數是8位二進制,用計數器count表示。當count=255時,表示定時到,tm_over=“1”。另外,時鐘快慢標志ic_dc為“1”時表示被校時鐘慢于標準時鐘,data_in=FAH;當ic_dc為‘0’,被校時鐘快于標準時鐘,置入data_in=FCH。VHDL主要原代碼如下:
3 結語
本設計的主要部分——時鐘校正不僅可以用在定時電路中,也可以作為分數分頻器用于其他電路中。其主要優點是電路簡單、使用資源少、精度控制靈活等。