基于EDA的四位数码显示频率计.docx
《基于EDA的四位数码显示频率计.docx》由会员分享,可在线阅读,更多相关《基于EDA的四位数码显示频率计.docx(33页珍藏版)》请在冰豆网上搜索。
基于EDA的四位数码显示频率计
基于EDA的四位数码显示频率计
————————————————————————————————作者:
————————————————————————————————日期:
基于EDA的数字频率计的设计
【摘要】在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。
测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
电子计数器测频有两种方式:
一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。
直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量。
本文阐述了用VHDL语言设计了一个简单的数字频率计的过程.
【关键词】EDA;VHDL;数字频率计;波形仿真;
1.1设计要求
借助于FPGA/CPLD的开发技术,设计一个4位十进制数字显示的数字式频率计,具体要求如下:
(1)4位十进制数字显示的数字式频率计的测量范围为1k~9999KHZ,测量单位为KHZ;
(2)要求量程能够自动转换,即几十KHZ显示小数点后两位,而几百KHZ则显示小数点后一位;
(3)当输入信号小于1KHZ时,输出全0,当输入大于9999KHZ时,输出显示全H。
1.2方案论证
采用FPGA/CPLD芯片作为控制核心单元,完成各功能模块。
首先将被测信号与控制信号加在FPGA/CPLD芯片上,通过在芯片内部进行各逻辑操作,完成分频、计数及扫描显示等功能操作,最后通过数码管显示结果.其原理框架图如下图1-2所示。
图1—2以FPGA/CPLD为核心的数字频率计
第二章频率计的原理及测量方法
数字频率计是直接用十进制数字显示被测信号频率的一种测量装置。
它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。
所谓频率,就是周期性信号在单位时间(1s)里变化的次数。
若在一定时间间隔T内测得的这个周期性信号的重复变化次数N,则其频率可表示为f=N/T;只要知道了N和T就可以求得频率。
若设置闸门信号的时间为1S,则被测频率就是NHz。
M法是在给定的闸门时间内测量被测信号的脉冲个数,进行换算得出被测信号的频率。
当频率计正常工作时,频率为0.5Hz的闸门信号作为计数器的时钟信号,而被测信号则作为计数器的时钟输入.当闸门信号为高电平是允许计数;而为低电平时,计数器停止计数,则所计的数值即为被测信号的频率.
本频率计设计测量频率的方法就是利用M法,首先让被测信号与标准信号一起通过一个闸门,然后用计数器计数信号脉冲的个数,把标准时间内的计数的结果,用锁存器锁存起来,最后用显示译码器,把锁存的结果用LED数码显示管显示出来.
根据数字频率计的基本原理,本文设计方案的基本思想是分为五个模块来实现其功能,即整个数字频率计系统分为分频模块、防抖模块、计数模块、译码模块和锁存模块,再加一个顶层模块,并且分别用VHDL对其进行编程,实现了闸门控制信号电路、防抖电路、计数电路、锁存电路、显示电路等。
图2-1频率计测量频率的原理图
3。
1时钟分频模块
本设计为满足EDA开发板的要求,故采用32KHz的时钟作为输入时钟,对其进行分频,得到3个子时钟,即200Hz的片选信号(动态扫描时钟)、25Hz的防抖电路时钟和0.5Hz的闸门信号。
其实体模块如图3-1-1。
图3-1-1
ENDTIME设置为8s
加32KHz的输入信号,其仿真波形如图3—1-2。
图3—1-2
3。
2防抖电路模块
在实际电路中按键会产生毛刺抖动,并且输出的信号并不稳定,故为保证电路不受毛刺的影响,并产生有效的信号,可加一个防抖电路来消除其影响。
其实体模块如图3-2-1所示。
图3-2—1
此模块只有在cp2上升沿来时,若key为高电平,则imp输出一个cp2周期的有效稳定高电平;其它imp都输出低电平。
其仿真波形如图3-2-2.
图3—2—2
3.3计数模块
此模块可在闸门信号内对被测信号进行计数,及4位BCD显示结果的输出,并自动进行量程的转换.其实体模块如图3-3-1。
图3—3-1
此模块的仿真波形如图3-3—2.
4位BCD输出结果及小数点标志位输出
图3—3—2
3.4锁存模块
此模块是将计数部分的输出结果进行缓冲锁存,保证结果的正确输出显示。
即在计数部分cp3为低电平(停止计数)时,将输出的结果进入锁存部分,通过锁存器将结果给译码显示器。
其实体模块如图3—4-1.
图3—4-1
此模块的仿真波形如图3—4-2。
可见,在cp3下降沿时,锁存器将输入锁存,直接给输出;reset为1时,可清零.
图3-4—2
3.5译码显示模块
此模块是对显示部分的4位7段数码管进行动态扫描与译码显示,如此可直观地反映被测信号的频率。
其实体模块如图3-5—1.
图3-5—1
此模块的仿真波形如图3—5—2。
图3-5—2
第四章系统设计与仿真
在各个子模块设计好之后,还需要一个顶层文件将它们联系起来,构成一个完整的系统,如此才能具备测频的功能。
整个系统的原理图如图4—1所示。
图4-1
由于此设计的频率计量程为1KHz~~9999KHz,故需对各个范围的值都进行仿真,其仿真波形如下:
图4—2被测信号为500Hz时的仿真波形
注:
被测信号为500Hz时,仿真结果显示为’00111111’’00111111'’00111111'’00111111’,即“0000”。
图4-3被测信号为1250Hz时的仿真波形
注:
被测信号为1250Hz时,仿真结果显示为'10000110'’01011011’’01101101’'00111111’,即“1。
250"。
图4—4被测信号为50KHz时的仿真波形
注:
被测信号为50KHz时,其仿真结果显示为'01101101’’10111111’'00111111’'00111111',即“50。
00”。
图4—4被测信号为125KHz时的仿真波形
注:
被测信号为125KHz时,其仿真结果显示为’00000110'’01011011’’11101101'’00111111',
即“125.0"。
图4—5被测信号为1250KHz时的仿真波形
注:
被测信号为1250KHz时,其仿真结果显示为'00000110’'01011011''01101101’'00111111’,
即“1250"。
图4—5被测信号为1250KHz时的仿真波形
注:
被测信号为12MHz时,其仿真结果显示为’01110110’’01110110''01110110’'01110110',
即“HHHH”。
数码管数值译码对应表:
数值
dp
g
f
e
d
c
b
a
0
0/1
0
1
1
1
1
1
1
1
0/1
0
0
0
0
1
1
0
2
0/1
1
0
1
1
0
1
1
3
0/1
1
0
0
1
1
1
1
4
0/1
1
1
0
0
1
1
0
5
0/1
1
1
0
1
1
0
1
6
0/1
1
1
1
1
1
0
1
7
0/1
0
0
0
0
1
1
1
8
0/1
1
1
1
1
1
1
1
9
0/1
1
1
0
1
1
1
1
H
0/1
1
1
1
0
1
1
0
第五章硬件实验及结果
5。
1硬件实验方案
将程序烧入芯片中,在EDA实验开发板上进行实验。
其引脚锁定如下:
注:
cp32m绑定32KHz
Enable1绑定DK2
Reset1绑定DK3
Input1绑定CLK1的2KHz
Sel1[0]绑定LI0
Sel1[1]绑定LI1
Sel1[2]绑定LI2
Show1[0]绑定A8
Show1[1]绑定B8
Show1[2]绑定C8
Show1[3]绑定D8
Show1[4]绑定E8
Show1[5]绑定F8
Show1[6]绑定G8
Show1[7]绑定DP8
将管脚按以上绑定好,就可以在实验板上调试了。
5.2实验结果
将程序下载到实验板中,在enable未打开(即为‘0')时,可以看到数码管并没有数值显示(即均为0);在置enable1为‘1’时,可以看到显示结果为“2。
XXX"(数值不固定,有变化);此时置reset1为‘1’,可看到显示结果清零;将input1接为2Hz,显示为“0000”;
将input1接为Y1(即为12MHz),显示为“HHHH"。
由于实验板上没有几千KHz、几百KHZ和几十KHz,但根据仿真结果可知,设计是没有问题的。
从仿真和实验结果可以看出本设计能够对满足设计要求量程内的信号频率进行测量。
第六章心得体会
通过本次的课程设计,让我再次深入了EDA的世界,使我对这一门学科有了更高层次的了解。
在开始设计前一定要将课本上的知识吃透,因为这是做实验的基础,否则,设计的难度就很大,会浪费很多时间。
而且还要对设计的相关内容积极查阅资料,对设计内容要亲力亲为,务必将每个步骤,每个细节弄清楚,弄明白。
在做好这些前奏工作后就要自己去设计了,将学到的理论知识运用到实际操作中去。
通过这为期两周的课程设计,我受益匪浅,不但巩固了理论知识,还进一步掌握了实际操作发法。
增强了自己研究问题和创新意识的能力。
在课设中可以用充实和繁忙来形容了,每天都奔波在寝室与实验室之间.之所以充实是在课堂上学到的东西都有了用武之地。
有些更是自己在图书馆查找资料,网上搜索,同学讨论,老师讲解中学习了解到的.巩固和提升了自己的知识水平。
这两周也可以用沮丧和欢喜来形容,当面临一个个难题是,绞尽脑汁也束手无策时,心里真的好难受,感觉好失败。
但最终将它们解决时,那又是多么欢喜。
在这期间,我还明白了,只有脚踏实地、认真严谨、实事求是才能够在每一步中得到真正的收获。
这也是我在这次课设中最大的收益。
我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。
读万卷书,行万里路。
我要学习与实践相结合,而且我本来就是学电子的,只有在实践中去巩固和理解学到的知识,才能真正地掌握它,才能在以后的工作中发挥作用。
参考文献
【1】EDA技术实用教程科学出版社潘松黄继业
【2】数字电路EDA入门—-——--VHDL程序实例集北京邮电大学出版社
张亦华
【3】VHDL应用与开发实践科学出版社甘历
【4】CPLD/FPGA应用开发技术与工程实践人民邮电出版社
【5】FPGA系统设计与实践电子工业出版社黄智伟
附录:
程序代码:
-——--顶层模块-———-
Libraryieee;
useieee.std_logic_1164.all;
useieee。
std_logic_signed.all;
entitytotalis
port(cp32m:
instd_logic;—-32KHz时钟信号
enable1:
instd_logic;——开关信号
input1:
instd_logic;--输入被测信号
reset1:
instd_logic;——复位信号
sel1:
outstd_logic_vector(2downto0);—-输入片选信号
show1:
outstd_logic_vector(7downto0));-—输出七位数码管显示
endtotal;
architecturecontentoftotalis
signalcp_1,cp_2,cp_3:
std_logic;
signalreset_1:
std_logic;
signaloverflow_1,low_1:
std_logic;
signalplay0_1,play1_1,play2_1,play3_1:
integerrange0to9;
signaloverlatch_1,lowlatch_1:
std_logic;
signalp0_1,p1_1,p2_1,p3_1:
integerrange0to9;
signaldecimal_1:
std_logic_vector(3downto0);
signalde1:
std_logic_vector(3downto0);
componentdividefre4is
port(cp_32m:
instd_logic;
cp1:
outstd_logic;
cp2:
outstd_logic;
cp3:
outstd_logic);
endcomponent;
componentdebounceis
port(key:
instd_logic;
cp2:
instd_logic;
imp:
outstd_logic);
endcomponent;
componentfretestis
port(enable,cp3,input,reset:
instd_logic;
overflow,low:
outstd_logic;
play0,play1,play2,play3:
outintegerrange0to9;
decimal:
outstd_logic_vector(3downto0));
endcomponent;
componentfrelatchis
port(reset:
instd_logic;
cp3:
instd_logic;
overflow:
instd_logic;
low:
instd_logic;
play0,play1,play2,play3:
inintegerrange0to9;
decimal:
instd_logic_vector(3downto0);
overlatch:
outstd_logic;
lowlatch:
outstd_logic;
p0latch,p1latch,p2latch,p3latch:
outintegerrange0to9;
delatch:
outstd_logic_vector(3downto0));
endcomponent;
componentdisplayis
port(cp1:
instd_logic;
low:
instd_logic;
overflow:
instd_logic;
de:
instd_logic_vector(3downto0);
p0,p1,p2,p3:
inintegerrange0to9;
show:
outstd_logic_vector(7downto0);
sel:
outstd_logic_vector(2downto0));
endcomponent;
begin
u1:
dividefre4portmap(cp_32m=〉cp32m,cp1=〉cp_1,cp2=>cp_2,cp3=>cp_3);
u2:
debounceportmap(key=>reset1,cp2=〉cp_2,imp=〉reset_1);
u3:
fretestportmap(enable=>enable1,cp3=〉cp_3,input=〉input1,reset=〉reset_1,
overflow=>overflow_1,low=〉low_1,play0=>play0_1,play1=〉play1_1,play2=>play2_1,play3=〉play3_1,decimal=>decimal_1);
u4:
frelatchportmap(reset=〉reset_1,cp3=〉cp_3,overflow=>overflow_1,low=>low_1,
play0=>play0_1,play1=〉play1_1,play2=〉play2_1,play3=>play3_1,decimal=>decimal_1,overlatch=>overlatch_1,lowlatch=>lowlatch_1,p0latch=>p0_1,p1latch=〉p1_1,p2latch=>p2_1,
p3latch=〉p3_1,delatch=>de1);
u5:
displayportmap(cp1=〉cp_1,low=>lowlatch_1,overflow=>overlatch_1,p0=〉p0_1,
p1=>p1_1,p2=〉p2_1,p3=〉p3_1,show=>show1,sel=〉sel1,de=〉de1);
endcontent;
--—-分频模块--—-—
Libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_signed.all;
Entitydividefre4Is
port(cp_32m:
instd_logic;
cp1:
outstd_logic;-—200Hz片选信号
cp2:
outstd_logic;-—25Hz防抖动电路周期信号
cp3:
outstd_logic);--0.5Hz闸门信号
enddividefre4;
architecturebehaviorofdividefre4is
signaltout:
integerrange0to80;
signaltout1:
integerrange0to7;
signaltout2:
integerrange0to400;
signalcp_1:
std_logic;
signalcp_2:
std_logic;
signalcp_3:
std_logic;
signalcp:
std_logic;
begin
process(cp_32m)-—80分频,分到400Hz
begin
if(cp_32m’eventandcp_32m='1')then
iftout=79then
tout〈=0;
elsetout〈=tout+1;
endif;
iftout=39then
cp〈='0';
elsecp<='1';
endif;
endif;
endprocess;
process(cp)—-200Hz
begin
if(cp’eventandcp='1')then
cp_1〈=notcp_1;
endif;
endprocess;
process(cp_1)
begin
if(cp_1'eventandcp_1=’1’)then
iftout1=7thentout1〈=0;
elsetout1〈=tout1+1;
endif;
iftout1=3then
cp_2〈=’1';
elsiftout1=7thencp_2〈=’0’;—-cp_2得到25Hz
endif;
iftout2=399thentout2〈=0;
elsetout2<=tout2+1;
endif;
iftout2=399then
cp_3<='1';
elsiftout2=199thencp_3〈=’0';-—cp_3得到0。
5Hz
endif;
endif;
endprocess;
cp1〈=cp_1;cp2〈=cp_2;cp3<=cp_3;
endbehavior;
—-----防抖模块-———-—
Libraryieee;
useieee。
std_logic_1164。
all;
useieee。
std_logic_arith.all;
useieee。
std_logic_unsigned。
all;
Entitydebounceis
port(key,cp2:
instd_logic;
imp:
outstd_logic);
enddebounce;
architecturebaseofdebounceis
signalq1,q2:
std_logic;
begin
process(cp2)
begin
ifcp2’eventandcp2=’1’then
q2<=q1;
q1<=key;
endif;
endprocess;
imp<=q1andnotq2;
endbase;
—————-计数模块——---
Libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_signed.all;
EntityfretestIs
port(enable:
instd_logic;——开关信号
cp3:
instd_logic;-—闸门信号
input:
instd_logic;—-被测信号
reset:
instd_logic;-—复位信号
overflow:
outstd_logic;—-输入大于9999KHz信号的输出
low:
outstd_logic;--输入小于1KHz信号的输出
play0,play1,play2,play3:
outintegerrange0to9;-—4位BCD显示结果输出
decimal:
outstd_logic_vector(3downto0));-—小数点输出
endfretest;
architecturebehavioroffretestis
signalr0_1,r1_1,r2_1,r3_1,r4_1,r5_1,r6_1:
integerrange0to9;
begin
process(input,enable,reset)
begin
ifenable='0'thennull;
elsif(input'eventandinput='1')then
ifreset=’1'then—-复位信号为'1’时,输出全为0
overflow〈='0’;r0_1<=0;r1_1<=0;r2_1〈=0;r3_1<=0;r4_1<=0;r5_1<=0;r6_1〈=0;
elsifcp3=’0'then--当闸门处于低电平'0'时,输出为全0
overflow〈='0’;r0_1<=0;r1_1〈=0;r2_1<=0;r3_1〈=0;r4_