RO.GD$ 3n
由于最近一直在与队员一起攻克题目,所以没时间写博客,现在把最近做的东西总结一下,希望对大家有帮助。 n[DQ5l
以前一直是用测频率法来测信号的频率,就是在一秒内测被测频率的个数,即为频率,这种方法在高频时还行,低频就误差比较大,无论是用FPGA还是单片机都差不多,所以我们这次用了一种相对更精确的测量方法——等精度测频法,主导思想是利用一个D触发器保证测量时间是被测频率的整数倍,对被测频率和基准频率进行计数,利用计数值求出被测频率,这种方法在高频低频段均适用,由于测量误差只与基准频率和闸门时间有关,与被测频率无关,故称之为等精度测频。 Z3jh-{ 0
由于FPGA对数据处理有困难,所以我们用FPGA计数,然后把数据传给单片机处理,显示数据。我们这次的测频范围为0.01HZ到50MHZ,精确到小数点后两位,测频误差在10的-5次方以下。 GVS-_KP\
我做的是FPGA的部分,先附上思路: -+MGs]),
等精度测频就是对基准频率和待测频率在一段时间内分别计数,通过一个D触发器确保计数时间是待测频率的整数倍,系统的误差只与门控时间和基准频率有关,与待测频率无关,达到等精度测频的目的。计数器是用两个32位二进制计数器,通过一个3—8选择器把64位变成8位,传给单片机,经单片机处理后恢复出两个计数值,计算出频率。 fXfBDB
RTL图 _
nFsC
附上程序,欢迎探讨 s}"5uDfn1F
分频模块——产生基准频率1MHZ方波 FyD^\6/x
LIBRARY IEEE; VGFWF3s
USE IEEE.STD_LOGIC_1164.ALL;
qkQ_#
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 70pt5O3]
ENTITY FENPIN IS OS|uZ<"Rq3
PORT( '2)c;/-E
CLK:IN STD_LOGIC; %f??O|O3
CLOCK:OUT STD_LOGIC T'YHV}b}vX
); &G63ReW7 @
END ENTITY; >JdA,i}1
ARCHITECTURE ART OF FENPIN IS CbPCj.MH
SIGNAL COUNT :INTEGER RANGE 0 TO 10#49#; Qa*?iD
BEGIN @L?X}'0xI4
PROCESS(CLK)IS fpMnA
BEGIN ?naPti1GX
IF(CLK'EVENT AND CLK='1')THEN iV+'p->/
IF(COUNT=10#49#)THEN COUNT<=0; 6 0C;J!D
ELSE COUNT<=COUNT+1; Q2^~^'Yk
END IF; 'p0|wM_
END IF; VjZ_L_U}
END PROCESS; 38Rod]\E
PROCESS(COUNT)IS 8R!3}kx
BEGIN aJh=4j~.
IF(COUNT>=10#24#)THEN >)5=6{x
CLOCK<='1'; \Xy]z
ELSE CLOCK<='0'; {8L)Fw
END IF; [h"#Gwb=;
END PROCESS; ?gZJ v
END ARCHITECTURE; -KzU''
D触发器模块——保证测量时间是被测频率整数倍 \)?mIwo7~
LIBRARY IEEE; {sn :Lj0
USE IEEE.STD_LOGIC_1164.ALL; e[`E-br^
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 'vgO`
ENTITY DCHUFA IS /t"p^9!^
PORT( XBJ9"G5
CLK:IN STD_LOGIC; WW.\5kBl8
CLR:IN STD_LOGIC; m>po+7"b
D:IN STD_LOGIC; sOyWsXd+R'
Q:OUT STD_LOGIC 5f54E|vD
); iEDZ\\,
END ENTITY; lHYu-}TNP
ARCHITECTURE ART OF DCHUFA IS = mnjIp
SIGNAL Q1:STD_LOGIC; fVR:m`'Iq_
BEGIN {d|R67~V
PROCESS(CLR,CLK) V<} ^n
BEGIN $Cu/!GA4.>
IF(CLR='0')THEN Q1<='0'; %}z/_QZ
ELSE IF(CLK'EVENT AND CLK='1')THEN E\M{/.4 4
Q1<=D; *%0f^~!G<p
END IF; 4SG22$7 W
END IF; )p.+39]{2
END PROCESS; ?FRR";
Q<=Q1; T7;)HFGeW
END ARCHITECTURE; v}6YbY Tq
计数模块 o3H+.u$
LIBRARY IEEE; 0F'75
USE IEEE.STD_LOGIC_1164.ALL; d}f| HOFq
USE IEEE.STD_LOGIC_UNSIGNED.ALL; -`e=u<Y9@
ENTITY JISHU IS fgxsC7P$
PORT( 0XlX7Sk+
CLK:IN STD_LOGIC; '-#6;_ i<
CLR,ENA:IN STD_LOGIC; W7NHr5RC
OQ:OUT STD_LOGIC_VECTOR(31 DOWNTO 0) ;WIL?[;w
); ~qNpPIrGr
END ENTITY; oH+UuP2a-J
ARCHITECTURE ART OF JISHU IS oeXNb4; 4
SIGNAL TMP:STD_LOGIC_VECTOR(31 DOWNTO 0); dRZor gar
BEGIN ";~}"Yz?[
PROCESS(CLK,CLR,ENA)IS }iy`Ko+B"b
BEGIN dE5DH~ldV
IF(CLR='0')THEN TMP<="00000000000000000000000000000000"; MCma3^/1
ELSIF(ENA='1')THEN Q6S[sTKR
IF(CLK'EVENT AND CLK='1')THEN f{e*R#+&
TMP<=TMP+1; ADX}
END IF; Q}jbk9gM5
END IF; ^v3+w"2
END PROCESS; )!dELS\ix
PROCESS(ENA) $52Te3n
BEGIN sF;1)7]Pq
IF ENA'EVENT AND ENA='0' THEN ?Di,'
OQ<=TMP; K/[v>(<
END IF; k?Jzy
END PROCESS; }wR)p
END ARCHITECTURE; BO\l>\)Ir
64转8模块——方便单片机读取数据 '$)Wp_
LIBRARY IEEE; >Z^7=5K"O
USE IEEE.STD_LOGIC_1164.ALL; 2h&pm
USE IEEE.STD_LOGIC_UNSIGNED.ALL; I#l9
ENTITY JISHU IS [[D}vL8d
PORT( "!)8bTW
CLK:IN STD_LOGIC; \Y9=dE}
CLR,ENA:IN STD_LOGIC; ~E^EF{h
OQ:OUT STD_LOGIC_VECTOR(31 DOWNTO 0) Y tGH>0}h
); @6*<Xs
=
END ENTITY; af{;4Cr
ARCHITECTURE ART OF JISHU IS hl~(&D1^
SIGNAL TMP:STD_LOGIC_VECTOR(31 DOWNTO 0); |iM*}Ix-
BEGIN mC~W/KReA
PROCESS(CLK,CLR,ENA)IS dab>@z4
BEGIN mS~3 QV
IF(CLR='0')THEN TMP<="00000000000000000000000000000000"; `j>qOT
ELSIF(ENA='1')THEN 5, Yk5?l<'
IF(CLK'EVENT AND CLK='1')THEN |0f\>X I
TMP<=TMP+1; any\}
END IF; *ep!gT*4
END IF; #bu`W!p}
END PROCESS; =< CH( 4!
PROCESS(ENA) |r-<t
BEGIN 4)j<(5
IF ENA'EVENT AND ENA='0' THEN n+GC L+Mo
OQ<=TMP; rvE!Q=y~
END IF; M/V
>25`
END PROCESS; x6DH0*[.
END ARCHITECTURE; L&3=5Bf9
顶层模块 ^DZiz[X+|
LIBRARY IEEE; \yG_wZs
USE IEEE.STD_LOGIC_1164.ALL; 4kXx(FE
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 5!nZvv
ENTITY FENPIN IS 7
oZ-D~3
PORT( p'w[5'
CLK:IN STD_LOGIC; `MTOe1
CLOCK:OUT STD_LOGIC l"*>>/U k
); &I(|aZx?J
END ENTITY; 0jq&i#yNB
ARCHITECTURE ART OF FENPIN IS i0AC.]4e"
SIGNAL COUNT :INTEGER RANGE 0 TO 10#49#; ^|sxbP
BEGIN I:6xDDpZG`
PROCESS(CLK)IS +}+hTY$a
BEGIN !Rb7q{@>
IF(CLK'EVENT AND CLK='1')THEN wFqz.HoB
IF(COUNT=10#49#)THEN COUNT<=0; =m/2)R{
ELSE COUNT<=COUNT+1; E"G._<3J8
END IF; g<.8iW 'c
END IF; /asyj="N7
END PROCESS; 3F.O0Vz
PROCESS(COUNT)IS >a4Bfnf"eI
BEGIN },Z-w_H
IF(COUNT>=10#24#)THEN JAiV7v4&R
CLOCK<='1'; ]lO$oO
ELSE CLOCK<='0'; k6Tpaf^
END IF; O_iX1@SW
END PROCESS; gdG:
&{|x
END ARCHITECTURE;