基于FPGA的同步測周期高精度數(shù)字頻率計(jì)的設(shè)計(jì)
摘 要:本文介紹了一種同步測周期計(jì)數(shù)器的設(shè)計(jì),并基于該計(jì)數(shù)器設(shè)計(jì)了一個高精度的數(shù)字頻率計(jì)。文中給出了計(jì)數(shù)器的VHDL編碼,并對頻率計(jì)的FPGA實(shí)現(xiàn)進(jìn)行了仿真驗(yàn)證,給出了測試結(jié)果。
關(guān)鍵詞:頻率計(jì);VHDL;FPGA;周期測量
在現(xiàn)代數(shù)字電路設(shè)計(jì)中,采用FPGA結(jié)合硬件描述語言VHDL可以設(shè)計(jì)出各種復(fù)雜的時序和邏輯電路,具有設(shè)計(jì)靈活、可編程、高性能等優(yōu)點(diǎn)。本文將介紹一種基于FPGA,采用同步測周期的方法來實(shí)現(xiàn)寬頻段高精度數(shù)字頻率計(jì)的設(shè)計(jì)。
圖1 同步測周期計(jì)數(shù)器
同步測周期頻率計(jì)的原理
在數(shù)字頻率計(jì)中,測周期計(jì)數(shù)器是主要的電路,其功能是:使用標(biāo)準(zhǔn)時鐘以被測頻率信號的一個周期為時限進(jìn)行脈沖計(jì)數(shù)。傳統(tǒng)的測周期計(jì)數(shù)器采用門控計(jì)數(shù)器來實(shí)現(xiàn),即采用一個同被測頻率信號周期寬度相同的門控脈沖來控制計(jì)數(shù)器的計(jì)停。其缺點(diǎn)在于無法實(shí)現(xiàn)對被測信號的連續(xù)測周期計(jì)數(shù)。
本文設(shè)計(jì)的同步測周期計(jì)數(shù)器如圖1所示。圖中計(jì)數(shù)器的計(jì)數(shù)時鐘為clk0, 頻率為f0;被測信號為clkx,頻率為fx。采用一個D觸發(fā)器對輸入的被測信號clkx進(jìn)行同步,同步輸出為s0。在clk0的上升沿到來之前,如果clkx出現(xiàn)了上升跳變,則le信號變?yōu)楦唠娖?,?jì)數(shù)器ct的重載信號和鎖存器cout的使能信號有效。當(dāng)clk0的上升沿到來時,計(jì)數(shù)器的計(jì)數(shù)值鎖存,同時計(jì)數(shù)器重載為1,重新開始計(jì)數(shù),le變?yōu)榈碗娖?。?jì)數(shù)器在其他時間里進(jìn)行加1計(jì)數(shù),鎖存器的值則保持不變。該測周期計(jì)數(shù)器能在clkx的每個上升沿之后輸出計(jì)數(shù)值,實(shí)現(xiàn)了對被測信號進(jìn)行測周期計(jì)數(shù),并始終輸出其最新一個周期的計(jì)數(shù)值,圖中cint端輸出一個clk0周期寬度的高脈沖,用于指示新的計(jì)數(shù)值鎖存。
圖2 同步測周期數(shù)字頻率計(jì)
圖3 頻率計(jì)cint的改進(jìn)電路
設(shè)該計(jì)數(shù)器的測周期計(jì)數(shù)值為M0,由于同步測周期法的分辨率為一個標(biāo)準(zhǔn)時鐘周期,因此有:
該同步測周期計(jì)數(shù)器的測周期計(jì)數(shù)值最小為2,要求被測信號高低電平的寬度大于一個標(biāo)準(zhǔn)時鐘周期。
基于上述同步測周期計(jì)數(shù)器,本文設(shè)計(jì)了如圖2所示的高精度數(shù)字頻率計(jì)。freq_div模塊是一個分頻器,對標(biāo)準(zhǔn)時鐘clk0進(jìn)行系數(shù)為C0的分頻。頻率計(jì)采用了兩個同步測周期計(jì)數(shù)器同時工作,計(jì)數(shù)值輸出端口分別為cout和mout。為了避免由于同步測周期計(jì)數(shù)器中被測信號和標(biāo)準(zhǔn)時鐘不同步,le信號高電平的寬度不固定而造成的計(jì)數(shù)出錯,在實(shí)際應(yīng)用中,采取將被測信號先經(jīng)過一個D觸發(fā)器同步后再送入計(jì)數(shù)器的方法,以保證計(jì)數(shù)的可靠性,其計(jì)數(shù)值和頻率的關(guān)系仍滿足(1)式。設(shè)cout輸出的值為C,mout輸出的值為M,根據(jù)頻率計(jì)的結(jié)構(gòu),對于其中以clkx為計(jì)數(shù)時鐘的計(jì)數(shù)器,由(1)式得:
同理,對于以clk0為計(jì)數(shù)時鐘的計(jì)數(shù)器,有:
根據(jù)兩個測周期計(jì)數(shù)器的計(jì)數(shù)值M、C,被測信號的頻率按下式計(jì)算得到
根據(jù)(3)式,計(jì)算結(jié)果的最大誤差為:
相對誤差為:
因此,只要使計(jì)數(shù)值C足夠大就可以保證頻率測量的精度。將(3)和(4)兩式相除并忽略小項(xiàng)得C和C0的關(guān)系如下:
給定C0,測周期計(jì)數(shù)值C的最大可變范圍為:。因此,根據(jù)實(shí)際測量精度的要求,設(shè)定適當(dāng)?shù)姆诸l器分頻系數(shù)C0,即可保證實(shí)際的測周期計(jì)數(shù)值C的大小在精度要求的范圍內(nèi)。對于上述的數(shù)字頻率計(jì),如果增大分頻器分頻系數(shù)C0,提高測周期計(jì)數(shù)器的計(jì)數(shù)范圍,可實(shí)現(xiàn)對輸入信號寬頻段高精度的頻率測量。
圖4 輸入被測信號周期為156ms時的仿真波形
數(shù)字頻率計(jì)的VHDL實(shí)現(xiàn)
上述的同步測周期數(shù)字頻率計(jì)在Altera 公司的FPGA開發(fā)平臺Quartus II中實(shí)現(xiàn),模塊采用VHDL語言描述,具有通用性和可重用性。圖1中的同步測周期計(jì)數(shù)器的VHDL描述如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity freq_count is --實(shí)體定義
port( reset: in std_logic;
clk0 : in std_logic;
clkx : in std_logic;
cint : out std_logic;
cout : out std_logic_vector(23 downto 0));
end entity freq_count;
architecture ar of freq_count is
signal s0 : std_logic;
signal ct : std_logic_vector(23 downto 0);
begin
p0: process(reset,clk0)
--計(jì)數(shù)器進(jìn)程
begin
if reset='0' then
s0<='0';
cint<='1';
cout<=conv_std_logic_vector(0,24);
else
if clk0'event and clk0='1' then
s0<=clkx;
if s0='0' and clkx='1' then
cout<=ct;
cint<='0';
ct<=conv_std_logic_vector(1,24);
else
cint<='1';
ct<=ct+1;
end if;
end if;
end if;
end process p0;
end ar;
測周期計(jì)數(shù)值M、C分別由mout和cout端口輸出,通過一定的接口由微處理器或其他的數(shù)據(jù)處理模塊獲取,進(jìn)行頻率的計(jì)算和顯示,根據(jù)實(shí)際的應(yīng)用情況設(shè)計(jì)輸出接口,這里不再詳述。當(dāng)頻率計(jì)新一輪的測周期計(jì)數(shù)完成后,計(jì)數(shù)器通過cint和mint信號指示處理單元來獲取數(shù)據(jù),其高電平脈沖的寬度為一個計(jì)數(shù)時鐘周期。當(dāng)計(jì)數(shù)時鐘頻率很高時,一些慢速的單片機(jī)可能無法捕獲,因此(以cint信號為例)增加如圖3所示的電路。cint上升沿使D觸發(fā)器輸出引腳cdone置0,通知單片機(jī)取數(shù),單片機(jī)讀結(jié)果時,相應(yīng)的地址信號和讀信號有效使圖中的cint_set有效,cdone被復(fù)位為1,等待下一次cint脈沖的出現(xiàn)。通過該電路,慢速單片機(jī)就可以捕獲頻率計(jì)計(jì)數(shù)完成的指示信號。
為了使頻率計(jì)的設(shè)計(jì)更加靈活,頻率計(jì)中分頻器的分頻系數(shù)也可改為由外部輸入。在頻率計(jì)運(yùn)行期間,由外部控制器設(shè)置不同的分頻系數(shù)C0,這樣可實(shí)現(xiàn)更寬范圍的頻率測量。
頻率計(jì)的仿真驗(yàn)證
上述數(shù)字頻率計(jì)的VHDL設(shè)計(jì)在Altera公司的Quartus II開發(fā)平臺下進(jìn)行了編譯和仿真,圖4是在clk0輸入10 MHz方波,clkx輸入周期為156ms(頻率為6.41KHz)方波,分頻系數(shù)C0取15000時的仿真波形。
本文采用Altera公司的FPGA FLEX10K10LC84-4來實(shí)現(xiàn)上述的頻率計(jì),計(jì)數(shù)器計(jì)數(shù)值的處理和顯示由 51單片機(jī)來完成,同步測周期數(shù)字頻率計(jì)的參數(shù)和測試結(jié)果是:計(jì)數(shù)器寬度為24 bit;分頻系數(shù)C0取106;計(jì)數(shù)時鐘頻率f0為1MHz;FPGA邏輯單元的使用比例為41%;測量的頻率范圍是1Hz<fx<16MHz;測量誤差小于 10-5。
結(jié)語
本文設(shè)計(jì)的同步測周期計(jì)數(shù)器能夠直接對被測信號進(jìn)行連續(xù)的測周期計(jì)數(shù),可以在許多頻率測量的設(shè)計(jì)中取代門控計(jì)數(shù)器,使設(shè)計(jì)更加靈活。文中采用兩個同步測周期計(jì)數(shù)器設(shè)計(jì)的數(shù)字頻率計(jì),無需選擇量程便可實(shí)現(xiàn)寬頻段高精度的頻率測量,并在FPGA中實(shí)現(xiàn)了系統(tǒng)集成?!?BR>
評論