KR6*)?c`
由于最近一直在与队员一起攻克题目,所以没时间写博客,现在把最近做的东西总结一下,希望对大家有帮助。 G/Xa`4"_
以前一直是用测频率法来测信号的频率,就是在一秒内测被测频率的个数,即为频率,这种方法在高频时还行,低频就误差比较大,无论是用FPGA还是单片机都差不多,所以我们这次用了一种相对更精确的测量方法——等精度测频法,主导思想是利用一个D触发器保证测量时间是被测频率的整数倍,对被测频率和基准频率进行计数,利用计数值求出被测频率,这种方法在高频低频段均适用,由于测量误差只与基准频率和闸门时间有关,与被测频率无关,故称之为等精度测频。 ?wR;"
由于FPGA对数据处理有困难,所以我们用FPGA计数,然后把数据传给单片机处理,显示数据。我们这次的测频范围为0.01HZ到50MHZ,精确到小数点后两位,测频误差在10的-5次方以下。 eiF!yk?2
我做的是FPGA的部分,先附上思路: !m#cneV
等精度测频就是对基准频率和待测频率在一段时间内分别计数,通过一个D触发器确保计数时间是待测频率的整数倍,系统的误差只与门控时间和基准频率有关,与待测频率无关,达到等精度测频的目的。计数器是用两个32位二进制计数器,通过一个3—8选择器把64位变成8位,传给单片机,经单片机处理后恢复出两个计数值,计算出频率。 t?0D* !D
RTL图 g&*pk5V>
附上程序,欢迎探讨 >_biiW~x :
分频模块——产生基准频率1MHZ方波 ZL`G<Mo;.
LIBRARY IEEE; `1NxS35u
USE IEEE.STD_LOGIC_1164.ALL; F`ifHO
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 7FVu[Qu
ENTITY FENPIN IS e_wz8]K)n
PORT( =Po!\[SBU
CLK:IN STD_LOGIC; [Pdm1]":(
CLOCK:OUT STD_LOGIC q)ygSOtj
); WRJ+l_81
END ENTITY; 6?0^U 9
ARCHITECTURE ART OF FENPIN IS |*N.SS
SIGNAL COUNT :INTEGER RANGE 0 TO 10#49#; gkuI!=
BEGIN +OF(CcA^
PROCESS(CLK)IS ]rDf3_!m(
BEGIN 1@Bq-2OD4
IF(CLK'EVENT AND CLK='1')THEN ?'K}bmdt}.
IF(COUNT=10#49#)THEN COUNT<=0; 'r%`(Z{~
ELSE COUNT<=COUNT+1; QY2!.a^q
END IF; 2k[i7Rl \c
END IF; ,sk;|OAI
END PROCESS; 0*%j6*XDq9
PROCESS(COUNT)IS 5( lE$&
BEGIN P sD+?
IF(COUNT>=10#24#)THEN Ou;
]>FJ
CLOCK<='1'; qeCx.Z
ELSE CLOCK<='0'; )}?'1ciHI
END IF; <> f
END PROCESS; Mz<4P3"H
END ARCHITECTURE; y'Xg"
D触发器模块——保证测量时间是被测频率整数倍 F]W'spF,
LIBRARY IEEE; vhEPk2wD,
USE IEEE.STD_LOGIC_1164.ALL; .b vB8VOrW
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 0z."6r
ENTITY DCHUFA IS uG3t%CmN
PORT( K$Y!d"D
CLK:IN STD_LOGIC; @3[Z QF
CLR:IN STD_LOGIC; ;tI=xNre`1
D:IN STD_LOGIC; IR>^U
Q:OUT STD_LOGIC A$W,#`E
); K/G|MT)
END ENTITY; (]>c8;o#b
ARCHITECTURE ART OF DCHUFA IS K2L+tw
SIGNAL Q1:STD_LOGIC; sRo%=7Z
BEGIN 6@!<'l%z
PROCESS(CLR,CLK) K(Otgp+zb
BEGIN [dsH0 D&T
IF(CLR='0')THEN Q1<='0'; :n>m">4
ELSE IF(CLK'EVENT AND CLK='1')THEN $dci?7q
Q1<=D; PP&AF?C
END IF; %Md;=,a:6
END IF; l{aXX[E&1
END PROCESS; Aa.bE,W
Q<=Q1; @g""*T1:$
END ARCHITECTURE; ]BCH9%zLj
计数模块 Yv9(8
LIBRARY IEEE; -sGfpLy<6
USE IEEE.STD_LOGIC_1164.ALL; 52K3N^RgR
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 'HkV_d[li
ENTITY JISHU IS zF(I#|Vo
PORT( +|Xx=1_?BK
CLK:IN STD_LOGIC; ;hmy7M1%
CLR,ENA:IN STD_LOGIC; <<v,9*h
OQ:OUT STD_LOGIC_VECTOR(31 DOWNTO 0) O~-#>a
); ;-@^G
3C:
END ENTITY; lW?}jzuo
ARCHITECTURE ART OF JISHU IS sju. `f>-r
SIGNAL TMP:STD_LOGIC_VECTOR(31 DOWNTO 0); Oh~JyrZy
BEGIN +K;(H']Z<-
PROCESS(CLK,CLR,ENA)IS "m _wYX
BEGIN MH`f!%c
IF(CLR='0')THEN TMP<="00000000000000000000000000000000"; pb}QP
ELSIF(ENA='1')THEN {?l#*XH;
IF(CLK'EVENT AND CLK='1')THEN r3/H_Z
TMP<=TMP+1; zhKb|SV
END IF; )fpZrpLXE
END IF; U9IN# ;W
END PROCESS; G*mk 19Z
PROCESS(ENA) yu<sd}@
BEGIN 5X nA.?F^
IF ENA'EVENT AND ENA='0' THEN CG@ LYN
OQ<=TMP; RXb+"/
END IF; `K~300-hOb
END PROCESS; ]k]P (w
END ARCHITECTURE; 7
\!t/<
64转8模块——方便单片机读取数据 5)2lZ(5.A#
LIBRARY IEEE; )O"5dF1l
USE IEEE.STD_LOGIC_1164.ALL; d>)*!l2,C
USE IEEE.STD_LOGIC_UNSIGNED.ALL; L/"XIMI*Xg
ENTITY JISHU IS 'F?T4
PORT( 5"c#OU
CLK:IN STD_LOGIC; 7$a,pNDw
CLR,ENA:IN STD_LOGIC; W7S`+Pq
OQ:OUT STD_LOGIC_VECTOR(31 DOWNTO 0) X&TTw/J!^
); {b"V7vn,
END ENTITY; GG5wiN*2S
ARCHITECTURE ART OF JISHU IS gsqlWfa
SIGNAL TMP:STD_LOGIC_VECTOR(31 DOWNTO 0); :7<spd(%"
BEGIN n87B[R
PROCESS(CLK,CLR,ENA)IS Nqk*3Q"f
BEGIN - ~T LI&[
IF(CLR='0')THEN TMP<="00000000000000000000000000000000"; u8v;O}#
ELSIF(ENA='1')THEN Im+<oZ
IF(CLK'EVENT AND CLK='1')THEN w{UVo1r:
TMP<=TMP+1; 6OF&Q`*4
END IF; *@S:f"i
END IF; PP.QfY4
END PROCESS; R^<li;Km
PROCESS(ENA) _)yn6M'Dt
BEGIN e]'ui<`
IF ENA'EVENT AND ENA='0' THEN 8Sd<!
OQ<=TMP; kKr7c4q
END IF; d0"Hu^]
END PROCESS; SHOg,#mV
END ARCHITECTURE; ZO5_n
顶层模块 b<P9@h~:
LIBRARY IEEE; TIbiw
USE IEEE.STD_LOGIC_1164.ALL; Waj6.PCFm
USE IEEE.STD_LOGIC_UNSIGNED.ALL; s%2 w&Us*
ENTITY FENPIN IS %(MaH
PORT( 4%LG Ph
CLK:IN STD_LOGIC; :Gsh
CLOCK:OUT STD_LOGIC GF*8(2h2
); k(pI5N}pJZ
END ENTITY; Fo=Icvo
ARCHITECTURE ART OF FENPIN IS (,
/`*GC
SIGNAL COUNT :INTEGER RANGE 0 TO 10#49#; 3s<~}&"
BEGIN c3W9"
PROCESS(CLK)IS (/Lo44wT
BEGIN pwtB{6)VH{
IF(CLK'EVENT AND CLK='1')THEN {`2! 3= "
IF(COUNT=10#49#)THEN COUNT<=0; ig5
d-A
ELSE COUNT<=COUNT+1; c>#T\AEkF
END IF; hCV e05
END IF; 1@rI4U@D
END PROCESS; }:<`L\8q\
PROCESS(COUNT)IS D1rXTI$$
BEGIN dQT A^m
IF(COUNT>=10#24#)THEN +!h~T5Ck
CLOCK<='1'; cVYDO*N2T
ELSE CLOCK<='0'; >?aPXC
END IF; XP'<\
END PROCESS; o@*eC L=
END ARCHITECTURE;