简易数字频率计设计 完整版.docx
《简易数字频率计设计 完整版.docx》由会员分享,可在线阅读,更多相关《简易数字频率计设计 完整版.docx(24页珍藏版)》请在冰豆网上搜索。
简易数字频率计设计完整版
河南科技大学
课程设计说明书
课程名称现代电子系统设计
题目简易数字频率计设计
学院__电信学院_____
班级_______
学生姓名____________________
指导教师_________
日期__2010-01-10______
课程设计任务书
(指导教师填写)
课程设计名称现代电子系统课程设计学生姓名刘轮辉专业班级电信科071
设计题目简易数字频率计设计
一、课程设计目的
掌握高速AD的使用方法;
掌握频率计的工作原理;
掌握GW48_SOPC实验箱的使用方法;
了解基于FPGA的电子系统的设计方法。
二、设计内容、技术条件和要求
设计一个具有如下功能的简易频率计。
(1)基本要求:
a.被测信号的频率范围为1~20kHz,用4位数码管显示数据。
b.测量结果直接用十进制数值显示。
c.被测信号可以是正弦波、三角波、方波,幅值1~3V不等。
d.具有超量程警告(可以用LED灯显示,也可以用蜂鸣器报警)。
e.当测量脉冲信号时,能显示其占空比(精度误差不大于1%)。
(2)发挥部分
a.修改设计,实现自动切换量程。
b.构思方案,使整形时,以实现扩宽被测信号的幅值范围。
三、时间进度安排
布置课题和讲解:
1天查阅资料、设计:
4天
实验:
3天撰写报告:
2天
四、主要参考文献
何小艇《电子系统设计》浙江大学出版社2008.1
潘松黄继业《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<='0';LOCK<='0';OE<='0';NEXT_STATE<=ST1;
WHENST1=>ALE<='1';START<='1';LOCK<='0';OE<='0';NEXT_STATE<=ST2;
WHENST2=>ALE<='0';START<='0';LOCK<='0';OE<='0';
IF(EOC='1')THENNEXT_STATE<=ST3;ELSENEXT_STATE<=ST2;
ENDIF;
WHENST3=>ALE<='0';START<='0';LOCK<='0';OE<='1';NEXT_STATE<=ST4;
WHENST4=>ALE<='0';START<='0';LOCK<='1';OE<='1';NEXT_STATE<=ST0;
WHENOTHERS=>NEXT_STATE<=ST0;
ENDCASE;
ENDPROCESSCOM;
REG:
PROCESS(CLK10)
上述程序中为ADDA为1时,为通道1,当ST0=0,START<='0';LOCK<='0';OE<='0'时从状态0转换到状态1;实现了从状态1到状态2,从状态3到状态4,再从状态4到状态0,把输入信号转化为二进制。
然后作为比较器的输入信号。
在比较器中和阀值进行比较。
其具体与ADC0809的连接电路图如下:
4、2比较模块
数字比较器用于数字信号的比较,例如,数据A和B比较,如果A>B,则输出A大于B的结果信号FA>B=1,FA=B=0,FA
如果A=B,则输出A等于B的结果信号FA>B=0,FA=B=1,FA
如果AB=0,FA=B=0,FA
我们这里用到的比较器是比较是把ADC0809转换的结果和给定的阈值进行比较,输出产生脉冲信号,结果是把正弦波和三角波转换成方波。
部分程序如下:
begin
process(y5)
begin
ify5>="10000000"then
fin<='1';
elsefin<='0';
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二分频后的高电平期间对这个基准信号进行计数,把这两个得到的计数结果进行相除运算,相除后得到的结果进行个位和十位分离,然后再进行进制转换,送到数码管中显示。
占空比部分程序如下:
begin
iff3='1'thenn1<=0;m1<=0;l1<=0;
else
ifclk7'eventandclk7='1'then
ifg1='1'then
n1<=n1+1;
endif;
endif;
ifclk7'eventandclk7='1'then
iff2='1'then
m1<=m1+1;
endif;
endif;
endif;
l1<=m1*100/n1;
endprocessp5;
p6:
process(m1,n1)
begin
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:
std_logic;
signaldout,din:
std_logic_vector(19downto0);
signalcc:
std_logic:
='0';
signaln1:
integerrange0to999999;
signalm1:
integerrange0to199999;
signall1,l2:
integerrange0to99;
signaly3,y4:
std_logic_vector(7downto0);
signalf1,g1,h1,f3,f2:
std_logic;
signaly2,y5:
std_logic_vector(7downto0);
begin
ad:
block
TYPESTATESIS(ST0,ST1,ST2,ST3,ST4);
signalCURRENT_STATE,NEXT_STATE:
STATES:
=ST0;
signalREGL:
std_logic_vector(7downto0);
signalLOCK:
std_logic;
begin
ADDA<='1';
y5<=REGL;LOCK0<=LOCK;
COM:
process(CURRENT_STATE,EOC)
BEGIN
CASECURRENT_STATEIS
WHENST0=>ALE<='0';START<='0';LOCK<='0';OE<='0';NEXT_STATE<=ST1;
WHENST1=>ALE<='1';START<='1';LOCK<='0';OE<='0';NEXT_STATE<=ST2;
WHENST2=>ALE<='0';START<='0';LOCK<='0';OE<='0';
IF(EOC='1')THENNEXT_STATE<=ST3;ELSENEXT_STATE<=ST2;
ENDIF;
WHENST3=>ALE<='0';START<='0';LOCK<='0';OE<='1';NEXT_STATE<=ST4;
WHENST4=>ALE<='0';START<='0';LOCK<='1';OE<='1';NEXT_STATE<=ST0;
WHENOTHERS=>NEXT_STATE<=ST0;
ENDCASE;
ENDPROCESSCOM;
REG:
PROCESS(CLK10)
BEGIN
IF(CLK10'EVENTANDCLK10='1')THENCURRENT_STATE<=NEXT_STATE;
ENDIF;
ENDPROCESSREG;
LATCH1:
PROCESS(LOCK)
BEGIN
IFLOCK='1'ANDLOCK'EVENTTHENREGL<=y1;
ENDIF;
ENDPROCESSLATCH1;
ENDblockad;
比较模块
begin
process(y5)
begin
ify5>="10000000"then
fin<='1';
elsefin<='0';
endif;
endprocess;
endblockBJ;
FP:
block
begin
process(clk)
begin
ifclk'eventandclk='1'then
ifn=5999999then
clk1<=notclk1;n<=0;
elsen<=n+1;
ifm=5then
clk2<=notclk2;m<=0;
elsem<=m+1;
ifl=2then
clk3<=notclk3;l<=0;
elsel<=l+1;
endif;
endif;
endif;
endif;
endprocess;
endblockFP;
频率计模块
begin
p1:
process(clk1)
begin
ifclk1'eventandclk1='1'then
clk4<=notclk4;
endif;
endprocessp1;
p2:
process(clk1,clk4)
begin
ifclk1='0'andclk4='0'then
g<='1';
elseg<='0';
endif;
f<=notclk4;h<=clk4;
endprocessp2;
p3:
process(f)
begin
iff'eventandf='1'then
din<=dout;c<=cc;
endif;
endprocessp3;
p4:
process(fin,g,h)
begin
ifg='1'thendout<=(others=>'0');cc<='0';
elsiffin'eventandfin='1'then
ifh='1'andcc='0'then
ifdout(3downto0)="1001"then
ifdout(7downto4)="1001"then
ifdout(11downto8)="1001"then
ifdout(15downto12)="0010"then
--ifdout(19downto16)="0001"then
cc<='1';
--elsedout(19downto16)<=dout(19dow