频率信号易于传输,抗干扰性强,可以获得较好的测量精度。因此,频率检测是电子测量领域最基本的测量之一。本文的数字频率计是按照计算每秒内待测信号的脉冲个数的基本原理来设计,此时取闸门时间为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; ----输出锁存信号
END IF;
END PROCESS;
END behav;