简易数字频率计设计 完整版Word文档下载推荐.docx
《简易数字频率计设计 完整版Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《简易数字频率计设计 完整版Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
潘松黄继业《EDA技术实用教程》科学出版社2006.10
指导教师签字:
2009年12月14日
一、摘要…………………………………………4
二、系统方案论证………………………………4
2.1频率测量方案…………………………………5
三、数字频率频率计的基本原理……………………6
四、各个模块设计……………………………….7
4、1A/D模数转换模块……………………………8
4、2比较模块…………………………………….9
4、3频率和占空比测量模块………………………10
五、各个模块仿真波形……………………………12
六、心得体会………………………………………14
七、参考文献………………………………………15
附录一………………………………………………16
附录二………………………………………………22
一.摘要
频率计是数字电路中的一个典型应用,是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器,频率测量在科技研究和实际应用中的作用日益重要。
设计所要达到的效果,同时此设计具有抗干扰性强、易于传输,较高的测量精度等特点。
数字频率计是一种基础测量仪器,在许多情况下,要对信号的频率进行测量,利用示波器可以粗略测量被测信号的频率,精确测量则要用到数字频率计,测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
电子计数器测频有两种方式:
一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;
二是间接测频法,如周期测频法。
直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量,测量采用了多周期同步测量法,它避免了直接测量法对精度的不足,同时消除了直接与间接相结合方法,需对被测信号的频率与中介频率的关系进行判断带来的不便,能实现较高的等精度频率和周期的测量。
关键词:
频率计、仪器、频率、精度、脉冲个数
二.系统方案论证
由于本课程设计是基于特定的硬件平台,在GW48-SOPC实验开发系统上进行实现对被测信号通过AD进行转换,把转换的结果和给定的阈值进行比较,产生相应的脉冲信号。
得到脉冲信号之后,先进行频率测量,给定1S的基准信号,在1S信号内对脉冲信号进行计数,计数的方式采用BCD码,然后把计数结果直接送数码管显示,对应的就是十进制的数值。
为了实现占空比精度的要求,在适当的范围内竟可能提高基准信号的频率。
通过一个led灯来表示相应的单位。
然后对脉冲信号进行占空比测量,给定一个高频的基准信号,在脉冲信号的高电平期间对脉冲信号进行计数,把计数结果进行相应的运算,运算结果直接送数码管显示,对应的也是十进制显示。
对于报警信号,我设计的方案是接数码管显示,频率超过3khz时就会发出警告,数码管指示灯全部变为0。
下面是简单的系统原理框图:
2.1频率的测量
对于频率的测量没有现成的硬件模块,因此对于频率的测量需要我们用VHDL语言进行实现。
对于频率的测量主要考虑有两种实现方案。
方案一:
直接测频法
测频法就是在确定的闸门时间Tw内,记录被测信号的变化周期数(或脉冲个数)Nx,则被测信号的频率为:
fx=Nx/Tw。
测量的过程如图所示,在TW时间内通过计数器记录被测信号脉冲的个数,然后把记录结果锁存,经过运算后,送数码管显示,即为所测频率。
,
方案二:
测周期法
测周期法需要有标准信号的频率fs,这个标准信号应该取一个频率适中的高频信号,在待测信号的一个周期Tx内,记录标准频率的周期数Ns,则被测信号的频率为:
fx=fs/Ns。
测量测周期法的过程如上图所示,在待测信号的一个周期Tx内,记录标准信号周期的个数,然后把记录结果锁存,经过运算后,送数码管显示,即为所测频率。
比较一二两种方案:
这两种测频率的原理基本一样,都是通过在给定的时间内记录脉冲的个数,经过一定的运算处理,得出结果显示出来。
并且这两种方案的计数值都会产生误差,都与计数器中记录的数值Nx或Ns有关。
但是考虑到用VHDL语言编写乘除的算法比较困难,并且经过乘除运算后所得结果的误差较大,因此选用方案一。
方案一得好处是闸门信号直接可以选择1S的时钟信号,在这1S时间内记录的被测信号脉冲的个数,正好就是被测信号的频率,不再需要进行运算处理。
不但减少编程的难度,而且也减小了实验的误差。
因为侧周期法的标准信号是一个高频信号,在不同的被测信号的脉冲下所造成的误差有很大的不同。
而在1S闸门信号下,记录的脉冲个数,对于所有被测信号的产生的误差基本是一样。
考虑到以上的各因素,我认为方案一是比较理想的选择。
三.数字频率频率计的基本原理
(1)数字频率计的主要功能是测量周期信号的频率。
频率是单位时间(1S)内信号发生周期变化的次数。
如果我们能在给定的1S时间内对信号波形计数,并将计数结果显示出来,就能读取被测信号的频率。
数字频率计首先必须获得相对稳定与准确的时间,同时将被测信号转换成幅度与波形均能被数字电路识别的脉冲信号,然后通过计数器计算这一段时间间隔内的脉冲个数,将其换算后显示出来。
这就是数字频率计的基本原理。
(2)从频率计的基本原理出发,根据基本要求可以得到如图3的系统框图:
图3数字频率计原理框图
四.各个模块设计
本系统除了特定硬件资源外,还需通过软件实现四个模块的设计,分别是:
(1)数模转换模块:
A/D数模转换,为把数字信号转换为信息基本相同的模拟信号而设计的处理过程。
将信号发生器传过来的模拟信号转化成数字信号。
(2)比较器模块:
输出量数值与规定的参比值相比较,以产生一个差值信号(误差信号)的器件。
(3)频率和占空比测量模块:
在一个测量周期过程中,被测周期信号在输入电路中经过放大、整形、微分操作之后形成特定周期的窄脉冲,送到主门的一个输入端。
主门的另外一个输入端为时基电路产生电路产生的闸门脉冲。
在一串理想的脉冲序列中(如方波),正脉冲的持续时间与脉冲总周期的比值。
4、1A/D数模转换控制模块
通过编程实现对ADC0809的控制,具体的程序见附录,其控制模块见下图:
AD0809的工作过程是:
输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,ALE,START,OE,ADDA都是ADC0809的控制信号,ADDA为模拟通道选择,低电平选择通道0,ALE为通道地址锁存信号,START为启动AD转换的信号,OE为ADC0809转换结果输出的使能信号。
数模转换控制模块的部分程序如下:
begin
ADDA<
='
1'
;
y5<
=REGL;
LOCK0<
=LOCK;
COM:
process(CURRENT_STATE,EOC)
BEGIN
CASECURRENT_STATEIS
WHENST0=>
ALE<
0'
START<
LOCK<
OE<
NEXT_STATE<
=ST1;
WHENST1=>
=ST2;
WHENST2=>
IF(EOC='
)THENNEXT_STATE<
=ST3;
ELSENEXT_STATE<
ENDIF;
WHENST3=>
=ST4;
WHENST4=>
=ST0;
WHENOTHERS=>
ENDCASE;
ENDPROCESSCOM;
REG:
PROCESS(CLK10)
上述程序中为ADDA为1时,为通道1,当ST0=0,START<
时从状态0转换到状态1;
实现了从状态1到状态2,从状态3到状态4,再从状态4到状态0,把输入信号转化为二进制。
然后作为比较器的输入信号。
在比较器中和阀值进行比较。
其具体与ADC0809的连接电路图如下:
4、2比较模块
数字比较器用于数字信号的比较,例如,数据A和B比较,如果A>
B,则输出A大于B的结果信号FA>
B=1,FA=B=0,FA<
B=0。
如果A=B,则输出A等于B的结果信号FA>
B=0,FA=B=1,FA<
如果A<
B,则输出A小于B的结果信号FA>
B=0,FA=B=0,FA<
B=1。
我们这里用到的比较器是比较是把ADC0809转换的结果和给定的阈值进行比较,输出产生脉冲信号,结果是把正弦波和三角波转换成方波。
部分程序如下:
process(y5)
ify5>
="
10000000"
then
fin<
elsefin<
endif;
endprocess;
endblockBJ;
上述程序中选取阀值为1000000,当大于阀值时,输出为高电平,低于阀值时输出为低电平。
从而实现了把正弦波,三角波转换为方波。
然后输入到频率和占空比的控制模块中。
通过编程实现的比较模块见下图:
经过Q[7..0]输出的结果,直接给d[7..0]做为输入,然后用输入和这个阈值作比较,如果大于则输出为高电平,小于或等于则输出为低电平。
4、3频率和占空比测量模块
Clk3M为系统时钟信号,clkin是输入的时钟信号,fin是经过过比较器后的输入信号,在1S的信号下对fin信号进行计数。
计数器,要求低位的计数值溢出信号做为高位的输入信号,从而显示频率的计量。
Cnp1[3…0]为计算频率计的khz位,cnp2[3…0]为频率计数位的hz位,cnp3[3…0]为频率计数位的个位,cnp4[3…0]系统占用的位,cnp5[3…0]和beef对应的数码管是显示占空比,hz和khz是被系统占用的位。
在fin的高电平期间就对这个基准脉冲信号的个数进行计数同时也在fin二分频后的高电平期间对这个基准信号进行计数,把这两个得到的计数结果进行相除运算,相除后得到的结果进行个位和十位分离,然后再进行进制转换,送到数码管中显示。
占空比部分程序如下:
iff3='
thenn1<
=0;
m1<
l1<
else
ifclk7'
eventandclk7='
then
ifg1='
n1<
=n1+1;
iff2='
=m1+1;
=m1*100/n1;
endprocessp5;
p6:
process(m1,n1)
y3(3downto0)<
=conv_std_logic_vector(l2rem10,4);
y3(7downto4)<
=conv_std_logic_vector(l2/10rem10,4);
endprocessp6;
endblockZKB;
上面程序中m1为高电平时的所得到的频率,n1为一个周期的频率。
把12和10求余,结果转换成四位二进制,得到的就为显示占空比的个位,把上述求余后再和10求余,结果转换成四位二进制,所得到的就是显示数码管的十位,二个就是显示占空比的二位数码管。
五.各个模块仿真波行
各个模块的源程序见附录,对于各个模块的仿真如下:
A/D模数转换模块:
如果从被测信号输入端输入幅值在1V左右频率为1KHz左右的正弦信号,如果电路正常,数码管可以显示被测信号的频率。
如果数码管没有显示,或显示值明显偏离输入信号频率,则要作进一步检测。
比较模块:
正常情况下,可以观测到与输入频率一致、如观测不到输出波形,或观测到的波形形状与幅值不对,则应检测这一部分电路,消除故障。
如该部分电路正常,或消除故障后频率计仍不能正常工作时,也需要进一步检查程序。
频率和占空比模块测量:
如频率关系不一致或波形不正常,则应对计数器和反馈门的各引脚电平与波形进行检测。
正常情况各电平值或波形应与电路中给出的状态一致。
通过检测与分析找出原因,消除故障。
电路中Clkin为1Hz信号,Clk3M为系统时钟的基准信号。
fin是输入的脉冲信号,cnp1,p3为记数码管的khz,hz和个位。
Cnp5和beef为显示在数码管中的占空比。
在仿真中也应该给一个较高频率的时钟信号,对于占空比测量,在可以允许的范围内应竟可能的给一个高频的基准信号,因为频率越高输出的占空比结果会越接近真实值。
对总的系统仿真:
正常情况各电平值应与电路中给出的状态一致。
但是由于显示的是高频的信号,在输入时往往会有一些不正确,有一些功能没有显示出来,占空比不稳定等,我在程序中找到了一些错误。
通过检测与分析找出原因,消除故障,减小误差。
六.心得体会
在这实习的两周中,我了解到了很多书本上未曾有过的东西。
在我多次陷入困境时找到了出路,从而使我们能轻松完成此次设计。
数字频率计是一种用十进制数字显示被测信号频率的数字测量仪器.它的基本功能是测量正弦信号.方波信号,尖脉冲信号及其他各种单位时间内变化的物理量。
我们在此次实习中,理论结合实际,提高和培养创新能力,为后续课程的学习,毕业设计,毕业后的工作打下基础。
同时,结合实践操作,可以体现现代化的设计方法和理念,使电子课程设计在培养我们能力方面,得到比较大的提高。
通过此次的课程设计,我对数字电子课本上的基本知识有了更深刻的领悟和掌握。
由于我设计的是数字频率计,涉及的知识面很广,所以我查阅了很多的书籍,并上网查阅了相关的知识,才完成了这份课程设计。
在这个过程中,遇到了种种的问题,但是通过老师和同学的帮助,以及查阅书籍,最终解决了问题。
本次课程设计在王老师和同学的大力帮助下,我才得以完成大学里第一次的课程设计。
在次,向老师和同学表示感谢。
在课程设计中,难免有错误,希望老师和同学帮助改正,使我的运用知识的能力有更大的提高。
七.参考文献
(1)现代电子系统设计浙江大学出版社何小艇主编
(2)EDA技术使用教程科学出版社潘松编著
(3)电子技术基础(数字部分),康华光,高等教育出版社,1998年
(4)实用电子电路手册,高等教育出版社,1992年
(5)新型集成器件实用电路,杨帮文,电子工业出版社,2002年
(6)电子技术课程设计书,艾永乐、付子义,焦作工学院电气系,1998年
附录一:
系统总电路图
附录二:
模数转换模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityLLis
port(y1:
instd_logic_vector(7downto0);
d,e,clk,CLK10,eoc:
instd_logic;
a,b,c:
bufferstd_logic;
adclk:
outstd_logic;
ALE,START,OE,ADDA,LOCK0:
OUTSTD_LOGIC;
y:
outstd_logic_vector(15downto0));
end;
architecturebhvofLLis
signalclk1,clk2,clk3,clk4,clk5,clk6,clk7,fin:
std_logic;
signall:
integerrange0to2;
signalm:
integerrange0to5;
signaln:
integerrange0to5999999;
signalf,g,h:
signaldout,din:
std_logic_vector(19downto0);
signalcc:
std_logic:
signaln1:
integerrange0to999999;
signalm1:
integerrange0to199999;
signall1,l2:
integerrange0to99;
signaly3,y4:
std_logic_vector(7downto0);
signalf1,g1,h1,f3,f2:
signaly2,y5:
ad:
block
TYPESTATESIS(ST0,ST1,ST2,ST3,ST4);
signalCURRENT_STATE,NEXT_STATE:
STATES:
signalREGL:
signalLOCK:
IF(CLK10'
EVENTANDCLK10='
)THENCURRENT_STATE<
=NEXT_STATE;
ENDPROCESSREG;
LATCH1:
PROCESS(LOCK)
BEGIN
IFLOCK='
ANDLOCK'
EVENTTHENREGL<
=y1;
ENDIF;
ENDPROCESSLATCH1;
ENDblockad;
比较模块
FP:
process(clk)
ifclk'
eventandclk='
ifn=5999999then
clk1<
=notclk1;
n<
elsen<
=n+1;
ifm=5then
clk2<
=notclk2;
m<
elsem<
=m+1;
ifl=2then
clk3<
=notclk3;
l<
elsel<
=l+1;
endblockFP;
频率计模块
p1:
process(clk1)
ifclk1'
eventandclk1='
clk4<
=notclk4;
endprocessp1;
p2:
process(clk1,clk4)
ifclk1='
andclk4='
g<
elseg<
f<
h<
=clk4;
endprocessp2;
p3:
process(f)
iff'
eventandf='
din<
=dout;
c<
=cc;
endprocessp3;
p4:
process(fin,g,h)
ifg='
thendout<
=(others=>
'
);
cc<
elsiffin'
eventandfin='
ifh='
andcc='
ifdout(3downto0)="
1001"
ifdout(7downto4)="
ifdout(11downto8)="
ifdout(15downto12)="
0010"
--ifdout(19downto16)="
0001"
--elsedout(19downto16)<
=dout(19dow