張 澤,劉慧慧,田 濤,梁天泰,周英杰
(1.北京工業(yè)大學(xué) 機(jī)電學(xué)院,北京 100124;2.北京石油化工學(xué)院 光機(jī)電裝備技術(shù)北京市重點實驗室,北京 102617;3.北京化工大學(xué) 機(jī)電工程學(xué)院,北京 100029)
基于Verilog的FPGA整數(shù)分頻器設(shè)計及仿真
張 澤1,劉慧慧2,田 濤1,梁天泰2,周英杰3
(1.北京工業(yè)大學(xué) 機(jī)電學(xué)院,北京 100124;2.北京石油化工學(xué)院 光機(jī)電裝備技術(shù)北京市重點實驗室,北京 102617;3.北京化工大學(xué) 機(jī)電工程學(xué)院,北京 100029)
簡單介紹了主要的時鐘分頻方法,提出了FPGA內(nèi)部PLL分頻的局限性,給出了基于Verilog HDL的整數(shù)分頻方法。編寫了Verilog HDL程序,實現(xiàn)了基于FPGA硬件平臺的占空比為50%的任意整數(shù)分頻。結(jié)合Quartus開發(fā)平臺和Modelsim仿真軟件驗證表明,該分頻方法簡單、實用。采用該方法,替換N值可實現(xiàn)任意整數(shù)等占空比的分頻。
Verilog HDL;FPGA;計數(shù);分頻;仿真;占空比
在大部分時鐘電路設(shè)計中, 首先考慮的方法是集成的鎖相環(huán)資源,如使用Xilinx的DLL或ALTERA的PLL模塊對時鐘分頻設(shè)計;但芯片內(nèi)部的DLL或PLL資源十分有限,所以設(shè)計一些基本時鐘電路時,往往采用高頻晶振產(chǎn)生高頻率的脈沖,然后通過分頻方法進(jìn)行分頻,得到不同頻率的脈沖。例如對時鐘要求不高的數(shù)字電路,通過Verilog HDL進(jìn)行時鐘分頻是非常通用的方法,可以有效節(jié)省鎖相環(huán)資源,消耗不多的邏輯單元就可以得到所需要的時鐘頻率[1]。
Verilog HDL是目前世界上最流行的硬件描述語言之一,它允許設(shè)計者進(jìn)行各種層次的邏輯設(shè)計,還能對所設(shè)計的數(shù)字系統(tǒng)進(jìn)行邏輯綜合、仿真驗證和時序分析。其具有很強的文件讀寫能力,允許用戶在不同的抽象層次上對電路進(jìn)行建模,這些層次從門級、寄存器傳輸級、行為級直至算法級[2]。
在FPGA 上,采用Verilog HDL語言進(jìn)行分頻器設(shè)計主要有如下優(yōu)點:設(shè)計的分頻器是一種可嵌入式的,可直接嵌入到多種應(yīng)用系統(tǒng)中;可同其他電路設(shè)計在在一塊FPGA上,提高系統(tǒng)集成度,有效提高FPGA 的利用率;具有很大的靈活性,實現(xiàn)硬件電路設(shè)計的軟件化,邊設(shè)計邊調(diào)試,有效提高設(shè)計效率,縮短設(shè)計周期。
本文基于QuartusII 10.0和Modelsim 6.5e平臺,使用Cyclone EP1C3T100I7N 芯片,內(nèi)部只有1個PLL模塊,不能滿足多種頻率時鐘電路的需要,通過待分頻的時鐘觸發(fā)計數(shù)器,設(shè)計了一種較為通用的,可實現(xiàn)等占空比的任意整數(shù)分頻器[3-6]。
一般方法為計數(shù)器被觸發(fā)時,對模N從0開始計數(shù),計數(shù)到N/2-1時,輸出時鐘反轉(zhuǎn),同時傳遞1個復(fù)位信號,讓計數(shù)器計數(shù)清零,以保證下一個時鐘到來時計數(shù)器還是從0開始計數(shù),如此循環(huán),實現(xiàn)時鐘等占空比偶數(shù)N倍分頻。下述以10倍分頻為例:
module div10(clkin, rst_n, clkout);
input clkin,rst_n;
output clkout;
reg clkout;
reg[4:0] cnt;
always@(posedge clkin or negedge rst_n)
if(!rst_n)
begin
cnt=0;
clkout = 0;
end
else if(cnt==4) //此處4 =(10/2-1)
begin
cnt=0;
clkout = ~clkout;
end
else
cnt=cnt+1;
endmodule
對于實現(xiàn)等占空比的奇數(shù)N倍分頻,設(shè)計方法有所區(qū)別。設(shè)定某一定值為(N-1)/2,首先用待分頻的時鐘上升沿觸發(fā)計數(shù)器從0開始計數(shù),當(dāng)計數(shù)到這一定值時對輸出時鐘進(jìn)行翻轉(zhuǎn),然后計數(shù)器加1再次對輸出時鐘進(jìn)行翻轉(zhuǎn),得到一個占空比非50%奇數(shù)N倍分頻時鐘N1;與此同時,用時鐘下降沿觸發(fā)從0開始計數(shù),到同一定值時進(jìn)行輸出翻轉(zhuǎn),計數(shù)器加1輸出再次翻轉(zhuǎn),得到另一個占空比非50%的奇數(shù)N倍分頻時鐘N2。N1和N2這2個分頻時鐘相或運算,最終得到占空比為50%的奇數(shù)N倍分頻時鐘。下述以11倍分頻為例:
module div_11(clkin, rst_n, cnt1,cnt2, clkout);
input clkin,rst_n;
output[3:0] cnt1,cnt2;
output clkout;
reg[3:0] cnt1,cnt2;
reg clk0,clk1;
wire clkout;
always@(posedge clkin or negedge rst_n)
if(!rst_n)
begin
cnt1 <= 1'b0;
clk0 <= 1'b0;
end
else
if(cnt1 <10)
begin
cnt1 <= cnt1 + 1'b1;
if(cnt1 == 5) //5=(10-1)/2
begin
clk0 <= ~clk0;
end
end
else //再次翻轉(zhuǎn)
begin
clk0 <= ~clk0;
cnt1 <= 1'b0;
end
always@(posedge clk_re or negedge rst_n)
if(!rst_n)
begin
cnt2 <= 1'b0;
clk1 <= 1'b0;
end
else
if(cnt2 < 10) //10=11-1,這里cnt1和cnt2采用阻塞和非阻塞結(jié)果不同,可另探討
begin
cnt2 <= cnt2 + 1'b1;
if(cnt2 == 5)
begin
clk1 <= ~clk1;
end
end
else
begin
clk1 <= ~clk1;
cnt2 <= 1'b0;
end
assign clk_re = ~clkin;
assign clkout = clk0 | clk1;
endmodule
在Quartus II 10.0中,工程編譯通過后建立測試腳本,編寫測試腳本程序,通過設(shè)置將測試腳本添加到Simulation關(guān)聯(lián)中,直接運行EDA RTL Simulation進(jìn)行仿真,具體步驟可查閱相關(guān)資料[7-8]。主要測試腳本程序如下:
initial begin
clkin=0;
forever
#12 clkin=~clkin;
end
initial begin
rst_n=0;
#100;
rst_n=1;
#5000;
$stop;
end
仿真結(jié)果如圖1和圖2所示。clkin信號都是在12 ns處翻轉(zhuǎn),rst_n信號在100 ns處變?yōu)楦唠娖?計數(shù)器開始計數(shù),總共運行5 100 ns。圖1中clkout脈沖周期為10個clkin脈沖周期,圖2中clkout脈沖周期則為11個clkin脈沖周期,cnt端口只是為了仿真時便于觀察。
圖1 10倍分頻
圖2 11倍分頻
這2種分頻方法簡單,易于理解,成功實現(xiàn)了占空比為50%的任意整數(shù)N倍分頻。2個initial模塊簡單實用,可以直接引用到Verilog分頻仿真實驗中。
使用集成大量晶振來實現(xiàn)多頻率輸出,會造成很大的成本,不同晶振間的相位延遲也無法進(jìn)行預(yù)測,而且集成大量晶振也容易在一個期間內(nèi)引起串?dāng)_。采用Verilog HDL語言,對較高的晶振源進(jìn)行分頻設(shè)計就能很容易得到多樣的頻率輸出,方便對不同產(chǎn)品的測試和應(yīng)用。
本文設(shè)計的通用分頻器,可實現(xiàn)占空比為50%任意整數(shù)分頻,為設(shè)計人員在FPGA上設(shè)計其他等占空比任意整數(shù)分頻器提供了一種思路。
[1] 夏宇聞.Verilog 數(shù)字系統(tǒng)設(shè)計教程[M].北京:北京航空航天大學(xué)出版社,2003.
[2] 夏宇聞.復(fù)雜數(shù)字電路與系統(tǒng)的Verilog HDL設(shè)計技術(shù)[M].北京:北京航空航天大學(xué)出版社,2002.
[3] 于楓,張麗英,廖宗建.ALTERA可編程邏輯器件應(yīng)用技術(shù)[M].北京:科學(xué)出版社,2004.
[4] 鄧玉元,吳瓊.數(shù)字電路中等占空比分頻器的實現(xiàn)[J].現(xiàn)代電子技術(shù),2006,4(2):25-26.
[5] 夏龍根.一種新型分頻器的設(shè)計實現(xiàn)[J].現(xiàn)代電子技術(shù),2006,29(7):49-51.
[6] 郭振鐸,劉洲峰,徐慶偉,等.一種基于Verilog的FPGA分頻設(shè)計[J].成組技術(shù)與生產(chǎn)現(xiàn)代化,2010(3):59-62.
[7] 孫富明,李笑盈.基于多種EDA工具的FPGA設(shè)計[J].電子技術(shù)應(yīng)用,2002(1):70-73.
[8] 汪國強.EDA技術(shù)及應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2004.
責(zé)任編輯馬彤
FPGAIntegerFrequencyDividerDesignandSimulationbasedonVerilog
ZHANG Ze1,LIU Huihui2,TIAN Tao1,LIANG Tiantai2,ZHOU Yingjie3
(1.Colloge of Mechanical and Electronic Engineering, Beijing University of Technology , Beijing 100124,China;2.Opto-mechatronic Equipment Technology Beijing Area Major Laboratory, Beijing Institute of Petro-chemical Technology,Beijing 102617,China; 3.Collogy of Mechanical and Electrical Engineering, Beijing University of Chemical Technology,Beijing 100029,China)
A brief introduction for the main clock division method was given, put forward limitations of FPGA internal PLL frequency divider, and gave the integer divide method based on Verilog HDL. Wrote Verilog HDL program, realized an arbitrary integer divider that the duty cycle is 50% and based on the hardware platform of the FPGA. Combined with Quartus development platform and Modelsim simulation software validation, the results showed that the frequency division method is simple and practical. By using this method, the replacement value of N can realize any integer frequency divider that duty cycle.
Verilog HDL,F(xiàn)PGA,count,frequency divider,simulation,duty cycle
TN 40
:A
張澤(1988-),男,碩士研究生,主要從事脈沖激光測距等方面的研究。
2014-10-21