摘 要:提出一種可實現占空比為50%的7倍時鐘分頻電路的高可靠性設計方案,并分別給出由分立元件組構和由Verilog HDL語言描述的2種實現方法。與已有方案相比,該設計不僅可以節省器件資源,而且完全避免了冒險現象對于分頻時鐘波形造成的影響。在Quartus環境下,分別對門級設計和基于Verilog HDL語言的行為級描述進行仿真驗證,結果顯示該方案合理可行。
關鍵詞:奇數次分頻器;格雷碼計數器;時鐘波形;FPGA
中圖分類號:TN772 文獻標識碼:B
文章編號:1004-373X(2008)06-012-02
Design and Implementation of High Quality 1∶7 Frequency Divider
ZHANG Jigang,LI Weizhong
(Inner Mongolia University of Technology,Huhhot,010051,China)
Abstract:Design method of high-reliability 1∶7 clock frequency divider with half duty cycle is brought forward,and then implementation method based on separate component or described by Verilog HDL is presented.Comparing with former design method,not only can the method economize on hardware resource,but it can be absolutely avoided that waveform of divided frequency clock is interfered by hazard in this method.After function of gate level design as well as behavior level design based on Verilog HDL is simulated in Quartus software,the method is proved logical and feasible as a result.
Keywords:odd number frequency divider;Gary code counter;clock waveform;FPGA
1 引 言
數字電路設計中常采用對主頻時鐘分頻的方法產生所需的時鐘。筆者目前從事的課題研究中就需要一個占空比為50%的七倍時鐘分頻電路。
一些文章介紹過一種實現占空比為50%的奇數次分頻電路的方法[1,2],該方法的要點是采用2個分別在被分頻時鐘上升沿和下降沿觸發的計數器,然后將這2個計數器產生的信號相或后輸出。若按該方法實現七倍的時鐘分頻器,其具體化后的電路如圖1所示。
這樣的設計若用在高速電路中會存在一些問題。比如當計數值從001到010跳變時有可能出現值為000或011的瞬間毛刺,從而對下級電路形成不應有的誤觸發,此現象在專業術語中被稱之為“冒險”。只要跳變時有2位以上的信號要變化就會存在冒險,故此方案實現的分頻電路不具備較高的可靠性,只能應用在一些對于時鐘波形質量要求不甚嚴格的場合。為了解決上述問題,提出一種高質量的七倍分頻電路方案。

2 本文方案的七倍分頻電路邏輯原理
圖2所示為本文提出的七倍分頻方案。在該方案的整個電路中只有用來對RS觸發器置位的那個負與門是對毛刺敏感的。為了消除可能的冒險,本設計中的七進制計數器采用格雷碼,從狀態0到狀態6的7個狀態分別對應的格雷碼及跳變順序是:000→001→011→010→110→111→101。
根據碼值循環規律,利用卡諾圖合并最小項,可得到表示3位格雷碼狀態遷移的邏輯表達式如下:
Q0=!Q2!Q1||Q2Q1
Q1=Q1!Q0||!Q2Q0
Q2=Q1!Q0||Q2Q1Q0
依據上式,通過采用3個D觸發器和一些基本邏輯門即可實現格雷碼計數。

在格雷碼計數器值從000~101的7個狀態跳變過程中,每次跳變都只有1位信號發生變化,其跳變過程中不可能出現任何的毛刺輸出。
當格雷碼計數器從滿度值101~000的回零跳變過程中,有可能出現100或001的瞬間值,但這2個毛刺均不會對RS觸發器產生誤置位觸發。
因此,本設計完全避免了由冒險引起的分頻時鐘波形不規則,具有高可靠性。
RS觸發器在狀態0的開始時刻被置位,在狀態3的中央時刻被清零,從而生成50%占空比的七分頻時鐘輸出。狀態0和狀態3所對應的格雷碼分別是000和010。
本設計在Quartus 7.1軟件中采用原理圖輸入方式進行了門級設計,并進行了綜合及仿真。

仿真結果顯示分頻后的時鐘滿足設計要求、且波形規則,從而驗證了本設計邏輯正確。仿真結果如圖3所示。
3 本文方案的Verilog HDL語言描述
圖2電路著眼于采用分立元件的實現并為此做了邏輯上的手工簡化。在CPLD/FPGA芯片設計中,這種簡化通常是交由EDA軟件在編譯綜合時自動完成的,采用硬件描述語言時設計者更側重的應是邏輯結構或功能行為方面的表達。對本文方案進行描述的Verilog HDL語言代碼如下:
module f_div7(clkin,clkout);
inputclkin;
outputclkout;
reg[2:0] cnt;
wire t3,n_r,n_s;
wire n_clkin = ~clkin;
assign n_s =(cnt== 3′b000 ? 1′b0 : 1′b1);
assign t3 = (cnt== 3′b010 ? 1′b1 : 1′b0);
rsff(.n_r(n_r),.n_s(n_s),.q(clkout));
dff_n(.clk(n_clkin),.d(t3),.qn(n_r));
always @ (posedge clkin)
begin
case (cnt)
3′b000: cnt <= 3′b001;
3′b001: cnt <= 3′b011;
3′b011: cnt <= 3′b010;
3′b010: cnt <= 3′b110;
3′b110: cnt <= 3′b111;
3′b111: cnt <= 3′b101;
default:cnt <= 3′b000;
endcase
end
endmodule
代碼中用到2個模塊:rsff是RS觸發器;dff_n是一個最小化的反Q輸出D觸發器(不帶清零和置位端)。實現這2個模塊的代碼比較簡單,此處從略。
圖4為采用Altera公司的Quartus 7.1軟件進行綜合及仿真后的功能仿真結果。從結果可看出:分頻后的時鐘滿足要求、波形規則。經綜合后,本文方案占用10個邏輯單元,而引言所述方案需占用16個邏輯單元。

4 結 語
提出的方案可以實現占空比為50%的七倍時鐘分頻電路。由于完全消除了冒險出現的可能,因此能夠保障良好的輸出波形質量,從而使得應用電路具有較高的可靠性。而且,與已有方法相比本方案所需的邏輯器件較少,具有節省器件資源的優點。
本文分別給出由分立元件組構和由Verilog HDL語言描述的2種實現方法。在基于FPGA的數字電路設計中,雖然可采用EDA軟件提供的宏功能模塊(鎖相環)實現分頻功能,但這類鎖相環數量有限,因此一些場合仍會需要應用到本文提出的分頻方法。
提出的原理思想,可以很容易地推廣到占空比為50%的任意奇數次時鐘分頻器的設計中。
參考文獻
[1]杜剛,孫超,陳安軍.基于FPGA 技術的16位數字分頻器的設計[J].儀器儀表學報,2006(S1):887-888.
[2]陳英梅,席亮亮.基于FPGA的多種分頻設計與實現[J].電子元器件應用,http://www.61ic.com/MCU/FPGA/sq/
200707/14862.html.
[3]夏宇聞.Verilog 數字系統設計教程[M].北京:北京航空航天大學出版社,1996.
[4]王誠,吳繼華.Altera FPGA/CPLD設計[M].北京:人民郵電出版社,2005.
[5] 張春生,常青.特殊分頻電路設計\\[J\\].現代電子技術,2006,29(6):112-113,116.[ZK)]
作者簡介
張繼剛 男,1978年出生,在讀碩士研究生,專業為計算機應用技術工作。
李維忠 男,1955年出生,副教授。主要從事網絡方面的研究。