1Hz闸门信号 1秒时间宽度 3计数器清零clr=1,重新计数 ○待测信号 2高电平时才计数,并送数码管显示 ○标准计数信号10MHZ
1计上升沿次数10M次(1s时间) ○
六. 结论与误差分析
1. 频率测量部分:
(1). 结论:
能测到待测信号的频率范围理论上为1HZ~99.999999MHZ,实际测试时最高只用过25MHZ的频率进行测试,结果相差±1Hz,达到设计要求。
(2). 误差分析:
由于采用直接测频法,1S闸门时间通常不是待测信号的整数倍,因此计数值也产生最大为±1个脉冲误差。设待测信号脉冲周期为Tx,频率为Fx,当测量时间为T=1s时,测量相对误差为Tx/T=Tx=1/Fx。所以,直接测频法的测量准确度与信号的频率有关:当待测信号频率较高时,测量准确度也较高,反之测量准确度也较低。
2. 占空比测量部分:
(1). 结论:
高频时对占空比在5%~95%的待测信号测试误差为±0.5%,最高能测试到25MHZ的占空比;在低频时测量的占空比有较大误差。
11 / 21
(2). 误差分析: 由于1S闸门时间内用10MHZ的基准信号在待测信号的高电平是计数,故误差产生的原因有一下两点:
1待测信号进入闸门的状态随机(可能是高电平,也可能是低电平),所以○
对高频信号,测量到的占空比误差比较小;
对低频信号误差较为明显,若进出闸门的状态同为高电平,则在1S闸门时间内对高电平的状态就有多计数,结果偏高;若进出闸门的状态同为低电平,则在1S闸门时间内对高电平的状态就少计数,结果偏低。
2待测信号进入闸门的状态随机,且1S闸门时间通常不是待测信号的整数○
倍,以10MHZ信号作为基准信号计数10M次上升沿作为待测信号在1S时间内整数个周期的时间,本身只是个近似值,所以对高频时误差较小,低频时有较大误差。
七.VHDL程序:
--********************************************************
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity frequency_meter is port(
clk ,d0,d1 :in std_logic; clkx :in std_logic;
wei :out std_logic_vector(3 downto 0); led :out std_logic_vector(7 downto 0) );
end entity frequency_meter;
--********************************************************
Architecture abc of frequency_meter is
signal led1, led2, led3, led4 :std_logic_vector(7 downto 0):=\
signal ge ,shi, bai, qian :integer range 0 to 10:=0; signal clk_1 :std_logic :='1'
signal clk_0, clk_1hz, clk_10m, freq12k : std_logic; signal temp : std_logic_vector(22 downto 0); begin
12 / 21
--**********p0**产生10mHZ频率*****************************
p0 : process(clk) is
variable counter0 :integer :=0; begin
if (clk'event and clk='1' ) then counter0:=counter0+1; if (counter0=25) then clk_0<=not clk_0; counter0:=0; end if; end if;
clk_10m<=clk_0; end process p0;
--************p1**产生1HZ频率*****************************
p1 : process(clk) is
variable counter1 :integer :=0; begin
if (clk'event and clk='1' ) then counter1:=counter1+1;
if (counter1=25000000) then clk_1<=not clk_1; counter1:=0; end if; end if;
clk_1hz<=clk_1; end process p1;
--************p2**分频出12k频率用于数码管位选扫频*********
p2 : process(clk) is begin
if (clk'event and clk='1' ) then temp<=temp+1; end if;
freq12k<=temp(11); --12207Hz end process p2;
--*************p3**主程序(显示,分档,占空比测量)************
p3 : process(clk,clk_1hz,clkx) is
13 / 21
variable counter2,counter3 :integer :=0;
variable aa,bb,cc,dd,ee,ff,gg,hh,za,zb,zc,zd,ze,zf,c,d,e,f:integer range 0 to 10:=0;
variable temp2,temp3,temp4,temp5:integer range 0 to 10:=0;
variable dip0,dip1,dip2,dip3,dip4,dip5,dip6,dip7 :integer :=0; variable clr :integer:=0; begin
---------------**p3_1--计数显示**-----------------------------------
if(clkx'event and clkx='1')then aa:=aa+1; if(aa=10)then aa:=0; bb:=bb+1; if(bb=10)then bb:=0; cc:=cc+1; if(cc=10)then cc:=0; dd:=dd+1; if(dd=10)then dd:=0;
temp2:=1;--------temp2 ee:=ee+1; if(ee=10)then ee:=0;
temp3:=1;--------temp3 ff:=ff+1; if(ff=10)then ff:=0;
temp4:=1;--------temp4 gg:=gg+1; if(gg=10)then gg:=0;
temp5:=1;--------temp5 hh:=hh+1; if(hh=10)then hh:=0; end if; end if; end if;
end if; end if;
14 / 21
end if; end if; end if;
-------------------**p3_2--分档显示**-------------------------------
if(d0='0')then----------按键按下显示占空比,否则显示频率---- ge<=c; shi<=d; bai<=e; qian<=f;
dip2:=1;------------只显示百位小数点------- elsif(d0='1')then if(temp5=1)then--------X10000档(~99.999999mhz)----------- -------超出四个数码管显示范围,可以按键显示--- ge<=ee;---------最低四位,同时只显示千位小数点----- shi<=ff; bai<=gg; qian<=hh; dip5:=1;
elsif(temp4=1)then------X1000档(1~9999khz)只显示个位小数点 ge<=dd; shi<=ee; bai<=ff; qian<=gg; dip4:=1;
elsif(temp3=1)then----X100档(0.1~999.9khz)只显示十位小数点 ge<=cc; shi<=dd; bai<=ee; qian<=ff; dip3:=1;
elsif(temp2=1)then----X10档(0.01~99.99khz)只显示百位小数点 ge<=bb; shi<=cc; bai<=dd; qian<=ee; dip2:=1;
else --------X1档(0.001~9.999khz)只显示千位小数点 ge<=aa; shi<=bb; bai<=cc; qian<=dd;
dip1:=1;
15 / 21