頻率信号易于傳輸,抗幹擾性強,可以獲得較好的測量精度。是以,頻率檢測是電子測量領域最基本的測量之一。本文的數字頻率計是按照計算每秒内待測信号的脈沖個數的基本原理來設計,此時取閘門時間為1秒。
數字頻率計的關鍵組成部分包括一個測頻控制信号發生器、一個計數器和一個鎖存器,另外包含信号整形電路、脈沖發生器、譯碼驅動電路和顯示電路,其原理框圖如圖1所示。
工作過程:系統正常工作時,脈沖信号發生器輸入1Hz的标準信号,經過測頻控制信号發生器的處理,2分頻後即可産生一個脈寬為1秒的時鐘信号,以此作為計數閘門信号。測量信号時,将被測信号通過信号整形電路,産生同頻率的矩形波,輸入計數器作為時鐘。當計數閘門信号高電平有效時,計數器開始計數,并将計數結果送入鎖存器中。設定鎖存器的好處是顯示的資料穩定,不會由于周期性的清零信号而不斷閃爍。最後将鎖存的數值由外部的七段譯碼器譯碼并在數位管上顯示。
(1) 直接測頻法:把被測頻率信号經脈沖整形電路處理後加到閘門的一個輸入端,隻有在閘門開通時間T(以秒計)内,被計數的脈沖送到十進制計數器進行計數。
(2) 組合測頻法:是指在高頻時采用直接測頻法,低頻時采用直接測量周期法測信号的周期,然後換算成頻率。
(3) 倍頻法:是指把頻率測量範圍分成多個頻段,使用倍頻技術,根據頻段設定倍頻系數,将經整形的低頻信号進行倍頻後再進行測量,對高頻段則直接進行測量。倍頻法較難實作。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TESTCTL IS
PORT(CLK: IN STD_LOGIC;
CNT_EN,RST_CNT,LOAD:OUT STD_LOGIC);
END;
ARCHITECTURE BEHAVIOR OF TESTCTL IS
SIGNAL div2clk:STD_LOGIC;
BEGIN
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
div2clk<=NOT div2clk;
END IF;
END PROCESS;
PROCESS(CLK,div2clk)
BEGIN
IF (CLK='0' AND div2clk='0') THEN
RST_CNT<='1';
ELSE RST_CNT<='0';
END IF;
END PROCESS;
LOAD<=NOT div2clk;CNT_EN<=div2clk;
END BEHAVIOR;
鎖存器(REG4B)的程式如下。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY REG4B IS
PORT(LOAD: IN STD_LOGIC;
DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END;
ARCHITECTURE BEHAVIOR OF REG4B IS
BEGIN
PROCESS(LOAD,DIN)
BEGIN
IF LOAD'EVENT AND LOAD='1' THEN
DOUT<=DIN;
END IF;
END PROCESS;
END BEHAVIOR;
頂層描述的VHDL程式。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY plj IS
PORT(fsin: IN STD_LOGIC; ------待測信号
clk:IN STD_LOGIC; ------1Hz基準時鐘
dout: OUT STD_LOGIC_VECTOR(15 DOWNTO 0)); ------計數結果
END plj;
ARCHITECTURE behav OF plj IS
SIGNAL testen:STD_LOGIC; ------ 計數器使能信号
SIGNAL clear: STD_LOGIC; -------計數器清零信号
SIGNAL fig: STD_LOGIC_VECTOR(15 DOWNTO 0); ------計數值
BEGIN
IGNAL fig: STD_LOGIC_VECTOR(15 DOWNTO 0); ------計數值
BEGIN
PROCESS(clk)
BEGIN
IF clk′event AND clk=′1′ THEN testen<=NOT testen; ---對1Hz時鐘2分頻
END IF;
END PROCESS;
PROCESS (clk, testen)
BEGIN
IF clk=' 0' AND testen =' 0' THEN clear<=' 1' ; ---産生計數器清零信号
ELSE clear<=' 0' ;
END IF;
END PROCESS;
PROCESS(fsin)
BEGIN
IF clear='1'THEN fig <="0000000000000000";
ELSIF fsin'event AND fsin='1' THEN
IF fig (11 DOWNTO 0)= "100110011001" THEN fig <= fig +"011001100111"; --999進位
ELSIF fig (7 DOWNTO 0)= "10011001" THEN fig <= fig + "01100111"; --- 99進位
ELSIF fig (3 DOWNTO 0)= "1001" THEN fig <= fig +"0111"; --- 9進位
ELSE fig <= fig +'1';
END IF;
END IF;
END PROCESS;
PROCESS(testen, fig)
BEGIN
IF testen'event AND testen='0' THEN dout<= fig; ----輸出鎖存信号