在FPGA上用VHDL实现数字频率计 实验报告Word下载.docx
《在FPGA上用VHDL实现数字频率计 实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《在FPGA上用VHDL实现数字频率计 实验报告Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdebounceIS
PORT(key,cp:
INSTD_LOGIC;
--复位键
imp:
OUTSTD_LOGIC);
--去掉窄波后输出
ENDdebounce;
ARCHITECTUREbaseOFdebounceIS
SIGNALql,q2:
STD_LOGIC;
BEGIN
PROCESS(cp)
BEGIN
IFcp'
eventANDcp='
1'
THEN
q2<
=ql;
ql<
=key;
ENDIF;
ENDPROCESS;
imp<
=qlANDNOTq2;
ENDbase;
时序仿真波形:
2、分频电路
USEIEEE.STD_LOGIC_SIGNED.ALL;
ENTITYdividefre4IS
PORT(cp_2m:
INSTD_LOGIC;
--2MHz
cpl:
OUTSTD_LOGIC;
--200Hz
cp2:
--25Hz
cp3:
--5Hz
ENDdividefre4;
ARCHITECTUREbehaviorOFdividefre4IS
SIGNALtout:
INTEGERRANGE0TO4999;
--5000分频
SIGNALtoutl:
INTEGERRANGE0TO7;
--8分频
SIGNALtout2:
INTEGERRANGE0TO39;
--40分频
SIGNALcp_1:
SIGNALcp_2:
SIGNALcp_3:
SIGNALcp:
PROCESS(cp_2m)–分出400Hz时钟
IF(cp_2m'
eventANDcp_2m='
)THEN
IFtout=4999THEN
tout<
=0;
ELSEtout<
=tout+1;
IFtout=2499THEN
cp<
='
0'
;
ELSEcp<
ENDPROCESS;
PROCESS(cp)--200Hz时钟
IF(cp'
cp_1<
=NOTcp_1;
PROCESS(cp_1)--25Hz时钟和5Hz
IF(cp_1'
eventANDcp_1='
IFtoutl=7THENtoutl<
ELSEtoutl<
=toutl+1;
IFtoutl=3THEN
cp_2<
ELSIFtoutl=7THENcp_2<
--8分频得25Hz
IFtout2=39THENtout2<
--40分频得5Hz
ELSEtout2<
=tout2+1;
IFtout2=39THEN
cp_3<
ELSIFtout2=19THENcp_3<
cpl<
=cp_1;
cp2<
=cp_2;
cp3<
=cp_3;
ENDbehavior;
仿真波形:
(因原程序所分频倍数太大,所以这里将5000倍分频降至50倍)
3、计数器
ENTITYfretestIS
PORT(enable:
--使能
--闸门
INput:
--被测信号
reset:
--复位信号
overflow:
--大于1000kHz
Play0,playl,play2,play3:
OUTINTEGERRANGE0TO9;
decimal:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
--小数点,即档位
ENDfretest;
ARCHITECTUREbehaviorOFfretestIS
SIGNALr0_1,r1_1,r2_1,r3_1,r4_1,r5_1:
INTEGERRANGE0TO9;
PROCESS(INput,enable,reset,cp3)
IFenable='
THENNULL;
--不测量
ELSIF(input'
eventANDinput='
)THEN--检测被测信号
IFreset='
THEN--同步复位,高电平有效
overflow<
r0_1<
r1_1<
r2_1<
r3_1<
r4_1<
r5_1<
ELSIFcp3='
THEN--闸门为0时清零
Overflow<
ELSE--闸门为高电平计数
=r0_1+1;
IFr0_1=9THENr1_1<
=r1_1+1;
IF(r1_1=9)THENr2_1<
=r2_1+1;
IF(r2_1=9)THENr3_1<
=r3_1+1;
r2_1<
IF(r3_1=9)THENr4_1<
=r4_1+1;
IF(r4_1=9)THENr5_1<
=r5_1+1;
IF(r5_1=9)THENr5_1<
overflow<
ENDIF;
PROCESS(r5_1,r4_1)
IFr5_1=0ANDr4_1=0THEN--为小于9999Hz时
play0<
=r0_1;
playl<
=r1_1;
play2<
=r2_1;
play3<
=r3_1;
decimal<
="
100"
ELSIFr5_1=0THEN--为几十kHz时
=r4_1;
010"
ELSE--为几百kHz时
=r5_1;
001"
ENDbehavior;
仿真波形
4、锁存器
ENTITYfrelatchIS
PORT(reset:
--复位
--时钟
Overflow:
--大于1000kHz表示
play0,playl,play2,play3:
ININTEGERRANGE0TO9;
INSTD_LOGIC_VECTOR(2DOWNTO0);
--小数点
overlatch:
p0latch,pllatch,p21atch,p31atch:
delatch:
ENDfrelatch;
ARCHITECTUREbehaviorOFfrelatchIS
PROCESS(cp3,reset)
overlatch<
p0latch<
pllatch<
p21atch<
p31atch<
delatch<
=decimal;
ELSIFcp3'
eventANDcp3='
=overflow;
=play0;
=playl;
=play2;
=play3;
delatch<
5、显示模块
ENTITYdisplayIS
PORT(cpl:
--高于1000kHz标志
p0,p1,p2,p3:
--BCD码输入
show:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
--7段码输出
sel:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
--位扫描码
ENDdISplay;
ARCHITECTUREbehaviorOFdisplayIS
SIGNALcount:
INTEGERRANGE0TO3;
SIGNALsel_1:
STD_LOGIC_VECTOR(3DOWNTO0);
PROCESS(cpl)
IF(cpl'
eventANDcpl='
)THEN
IFcount=3THENcount<
ELSE
count<
=count+1;
PROCESS(count)
CASEcountIS
WHEN0=>
sel_1<
1110"
--第0位
WHEN1=>
1101"
--第1位
WHEN2=>
1011"
--第2位
WHEN3=>
0111"
--第3位
ENDCASE;
PROCESS(overflow,sel_1)
IF(overflow='
)THEN
show<
0110111"
--高于1000kHz,显示H
ELSIF(sel_1(0)='
)THEN--第0位数码管译码
CASEp0IS
show<
1111110"
--显示0,a-g
0110000"
--1
1101101"
--2
1111001"
WHEN4=>
0110011"
WHEN5=>
1011011"
WHEN6=>
0011111"
WHEN7=>
1110000"
WHEN8=>
1111111"
WHEN9=>
1110011"
ELSIF(sel_1
(1)='
)THEN--第1位译码
CASEp1IS
WHEN8=>
ELSIF(sel_1
(2)='
)THEN--第2位译码
CASEp2IS
ELSIF(sel_1(3)='
)THEN--第3位译码
CASEp3IS
WHEN1=>
sel<
=sel_1;