基于FPGA的等精度频率计.docx

上传人:b****2 文档编号:1968207 上传时间:2023-05-02 格式:DOCX 页数:27 大小:434.26KB
下载 相关 举报
基于FPGA的等精度频率计.docx_第1页
第1页 / 共27页
基于FPGA的等精度频率计.docx_第2页
第2页 / 共27页
基于FPGA的等精度频率计.docx_第3页
第3页 / 共27页
基于FPGA的等精度频率计.docx_第4页
第4页 / 共27页
基于FPGA的等精度频率计.docx_第5页
第5页 / 共27页
基于FPGA的等精度频率计.docx_第6页
第6页 / 共27页
基于FPGA的等精度频率计.docx_第7页
第7页 / 共27页
基于FPGA的等精度频率计.docx_第8页
第8页 / 共27页
基于FPGA的等精度频率计.docx_第9页
第9页 / 共27页
基于FPGA的等精度频率计.docx_第10页
第10页 / 共27页
基于FPGA的等精度频率计.docx_第11页
第11页 / 共27页
基于FPGA的等精度频率计.docx_第12页
第12页 / 共27页
基于FPGA的等精度频率计.docx_第13页
第13页 / 共27页
基于FPGA的等精度频率计.docx_第14页
第14页 / 共27页
基于FPGA的等精度频率计.docx_第15页
第15页 / 共27页
基于FPGA的等精度频率计.docx_第16页
第16页 / 共27页
基于FPGA的等精度频率计.docx_第17页
第17页 / 共27页
基于FPGA的等精度频率计.docx_第18页
第18页 / 共27页
基于FPGA的等精度频率计.docx_第19页
第19页 / 共27页
基于FPGA的等精度频率计.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于FPGA的等精度频率计.docx

《基于FPGA的等精度频率计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的等精度频率计.docx(27页珍藏版)》请在冰点文库上搜索。

基于FPGA的等精度频率计.docx

基于FPGA的等精度频率计

 

光电与通信工程学院

课程设计报告书

 

课设名称:

等精度频率计

年级专业及班级:

姓名:

学号:

 

一、课程设计目的

1、进一步熟悉QuartusⅡ的软件使用方法,熟悉keil软件使用;

2、熟悉单片机与可编程逻辑器件的开发流程及硬件测试方法;

3、掌握等精度频率计设计的基本原理。

4、掌握独立系统设计及调试方法,提高系统设计能力。

实验设备

EDA最小系统板一块(康芯)、PC机一台、示波器一台、信号发生器一台、

万用表一个。

二、设计任务

利用单片机与FPGA设计一款等精度频率计,待测脉冲的检测及计数部分由

FPGA实现,FPGA的计数结果送由单片机进行计算,并将最终频率结果显示在

数码管上。

要求该频率计具有较高的测量精度,且在整个频率区域能保持恒定的

测试精度,具体指标如下:

a)具有频率测试功能:

测频范围100Hz~5MHz。

测频精度:

相对误差恒为基准

频率的万分之一。

b)具有脉宽测试功能:

测试范围10μs~1s,测试精度:

0.1μs。

c)具有占空比测试功能:

测试精度1%~99%。

d)具有相位测试功能。

(注:

任务a为基本要求,任务b、c、d为提高要求)

三、基本原理

基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,在

实用中有较大的局限性,而等精度频率计不但具有较高的测量精度,而且在整个

频率区域能保持恒定的测试精度。

3.1等精度测频原理

等精度频率计主控结构如图1所示

预置门控信号CL选择为0.1~1s之间(通过测试实验得出结论:

CL在这个

范围内选择时间宽度对测频精度几乎没有影响)。

BZH和TF分别是2个高速计数器,BZH对标准频率信号(频率为Fs)进行计数,设计数结果为Ns;TF对

被测信号(频率为Fx)进行计数,计数结果为Nx,则有

MUX64-8模块并不是必须的,可根据实际设计进行取舍。

分析测频计测控

时序,着重分析START的作用,完成等精度频率计设计。

3.2FPGA模块

FPGA模块所要完成的功能如图1所示,由于单片机的速度慢,不能直接测

量高频信号,所以使用高速FPGA为测频核心。

100MHZ的标准频率信号由

FPGA内部的PLL倍频实现,待测信号TCLK为方波,由信号发生器给出待测

方波信号(注意:

该方波信号带有直流偏置,没有负电压,幅值3.3V)。

预制门控信号CL由单片机发出,BRNA和ENA分别是BZH与TF两个计数器的计数允许信号端。

FPGA将允许计数时间内的BZH、TF的运行结果送入单片机进

行最后的计算。

顶层文件如下:

2以下是把20M5倍频的设置,利用FPGA内部的PLL。

电路需要100M标准频率信号,FPGA提供20M的频率,所以需要建立PLL模块,使之五杯频,得到所需的100M信号。

功能仿真设置:

 

下图是波形仿真的结果:

3.3单片机模块

单片机模块完成对整个测频系统的控制,包括对FPGA的控制以及数码管的显示控制。

测频允许信号由单片机发出,并且单片机的P0口负责循环读取FPGA发送过来的测频结果数据(BZH、TF两个计数器的计数结果,每次传送8位数据),P2负责发送控制信号,单片机可以通过结束信号了解测频记数是否结束,以确定何时开始读取数据。

附上康芯原理图截图:

 

 

四、实验现象

占空比

五、心得体会

这周课程设计的题目是等精度频率计的设计,由于书本上有一段程序,所以一开始只是将书上的程序和显示波形研究了一下。

当到课程设计的时候,将书上程序敲入并实现效果后有点茫然的感觉。

于是,我又仔仔细细地分析了一遍设计原理,从新改变了输入的代码,加上自己的思路,并能自己添加预置控制信息CL模块。

原本我还想将测试频率显示在数码管上,但是最终没能实现,这应该是我的一个遗憾吧。

设计中,我感受到了硬件描述语言的强大,我可以几乎不用考虑硬件条件,将代码导入就可实现功能。

不要总想着去依靠书本上的原题或者是他人,自己思考的做出来的,才算是自己真正收获的。

本次实验最大的收获莫过于,独立系统的去完成一项任务。

在其中我查阅了大量的资料,尤其是数字电路、quartersⅡ软件使用说明、EDA设计等方面的资料。

 

通过本次学习使我对时序电路有了更深的理解,具体体现在复位、计数、锁存多环节的控制上。

同时,在这次实验中,我第一次联合单片机和EDA一起完成一个项目。

EDA充分的发挥其高频工作的特点,使得频率测量的上限很高。

单片机则在整个系统中充当控制及数据处理的作用

设计的优点及缺点 

   本频率计最大优点在于它的高精度。

信号频率的测量,不受闸门信号精度的影响。

在被测信号送入计数器之前,先通过D触发器,使闸门信号和被测信号同步,有效地避免了±1误差。

不仅如此,本频率计对100HZ至5MHZ的全域相对误差均小于百万之一。

 

     当然,本频率计也存在缺点。

在频率计的设计中,乘法器为32位,除法器采用64位,资源占用率太大。

单片机处理32位数据的方式有待改进,要是它变得更优化

六、系统设计步骤及程序,结果

FPGA:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYEQUALFRECOUNTIS

PORT(

BCLK,TCLK:

INSTD_LOGIC;

DATA_OUT:

OUTSTD_LOGIC_VECTOR(7DOWNTO0);

EN:

INSTD_LOGIC;

ADDRESS:

INSTD_LOGIC_VECTOR(3DOWNTO0)

);

ENDEQUALFRECOUNT;

ARCHITECTUREARCHOFEQUALFRECOUNTIS

SIGNALEN2,WIDE_TEST:

STD_LOGIC;

SIGNALWIDE_COUNT,B_COUNT,T_COUNT:

STD_LOGIC_VECTOR(31DOWNTO0);

SIGNALSAVE_WIDE,SAVE_B,SAVE_T:

STD_LOGIC_VECTOR(31DOWNTO0);

BEGIN

PROCESS(EN,TCLK)

BEGIN

IFRISING_EDGE(TCLK)THEN

EN2<=EN;

ELSENULL;

ENDIF;

ENDPROCESS;

PROCESS(EN2,TCLK,BCLK)

BEGIN

IFEN2='1'THEN

IFRISING_EDGE(TCLK)THEN

IFT_COUNT=X"FFFF_FFFF"THEN

T_COUNT<=(OTHERS=>'1');

ELSET_COUNT<=T_COUNT+1;

SAVE_T<=T_COUNT+1;--SAVET_COUNT

ENDIF;

ELSENULL;

ENDIF;

IFFALLING_EDGE(TCLK)THEN

IFWIDE_TEST='0'THEN

WIDE_COUNT<=B_COUNT;

WIDE_TEST<='1';

ELSESAVE_WIDE<=WIDE_COUNT;--SAVEWIDE_COUNT

ENDIF;

ENDIF;

IFRISING_EDGE(BCLK)THEN

IFB_COUNT=X"FFFF_FFFF"THEN

B_COUNT<=(OTHERS=>'1');

ELSEB_COUNT<=B_COUNT+1;

SAVE_B<=B_COUNT+1;--SAVEB_COUNTINSAVE_B

ENDIF;

ELSENULL;

ENDIF;

ELSE

--WHENENA=0,WEOUTPUTTHEDATAANDRESETTHECOUNTER.

WIDE_COUNT<=(OTHERS=>'0');

B_COUNT<=(OTHERS=>'0');

T_COUNT<=(OTHERS=>'0');

WIDE_TEST<='0';

ENDIF;

ENDPROCESS;

PROCESS(ADDRESS,EN2,SAVE_T,SAVE_B,SAVE_WIDE,BCLK)

BEGIN

IFRISING_EDGE(BCLK)THEN

IFEN2='0'THEN

--USESOMECONSTANTSTOTEST

CASEADDRESSIS

WHENX"0"=>DATA_OUT<=SAVE_T(7DOWNTO0);

WHENX"1"=>DATA_OUT<=SAVE_T(15DOWNTO8);

WHENX"2"=>DATA_OUT<=SAVE_T(23DOWNTO16);

WHENX"3"=>DATA_OUT<=SAVE_T(31DOWNTO24);

WHENX"4"=>DATA_OUT<=SAVE_B(7DOWNTO0);

WHENX"5"=>DATA_OUT<=SAVE_B(15DOWNTO8);

WHENX"6"=>DATA_OUT<=SAVE_B(23DOWNTO16);

WHENX"7"=>DATA_OUT<=SAVE_B(31DOWNTO24);

WHENX"8"=>DATA_OUT<=SAVE_WIDE(7DOWNTO0);

WHENX"9"=>DATA_OUT<=SAVE_WIDE(15DOWNTO8);

WHENX"A"=>DATA_OUT<=SAVE_WIDE(23DOWNTO16);

WHENX"B"=>DATA_OUT<=SAVE_WIDE(31DOWNTO24);

WHENOTHERS=>NULL;

ENDCASE;

ELSENULL;

ENDIF;

ELSENULL;

ENDIF;

ENDPROCESS;

ENDARCH;

单片机:

/**.c文件,文件名:

EqualFre_main.c

*各模块的流程控制*/

#include"EqualFre_main.h"

intmain(void){

communicationInit_Ex();

while

(1){

mode=getMode_Ex();//确定选择的模式

askForData_Ex();//请求数据

if(HOLD_DATA_MODE!

=mode){//表示没有固定数据时,则载入数据

loadData();

}

disData();//数据显示

}

}

//数据载入

staticvoidloadData(){

fre=getFre_Ex();

wide=getWide_Ex();

duty=getDuty_Ex();

}

/***************************************

数据显示中:

wData(uchar)传入的参数意义

0-9数字0-9

10-19跟了点号的0-9

20暗选

***************************************/

staticvoiddisDelay(){//显示延时

uchardatax,y;

for(x=250;x>0;x--)

for(y=50;y>0;y--);

}

//数据显示--总控

staticvoiddisData(){

switch(mode){

caseSHOW_FRE_MODE:

disFre();disDelay();break;

caseSHOW_WIDE_MODE:

disWide();disDelay();break;

caseSHOW_DUTY_MODE:

disDuty();disDelay();break;

default:

break;

}

}

/*staticvoiddisFre(){

uchardatai;

for(i=0;i<8;i++)

wData_Ex

(1);

}

staticvoiddisWide(){

uchardatai;

for(i=0;i<8;i++)

wData_Ex

(2);

}

staticvoiddisDuty(){

uchardatai;

for(i=0;i<8;i++)

wData_Ex(3);

}*/

//数据显示--显示频率,单位Hz或MHz(双模式)

staticvoiddisFre(){

uchardatadataTemp[8],i;

ulongdatafreTemp=fre;//为了显示1位小数,这里已经将频率扩大10倍

uchardataflag=0;//消零标志位

if(1000000<=freTemp){//当频率值大于1M时,使用兆显示模式

freTemp/=100000;//0.00MHz

for(i=2;i<8;i++){//数据从低位到高位装入数据暂存器dataTemp,这里保留2位,用于显示nH(即MHz)

dataTemp[i]=(uchar)(freTemp%10);

freTemp/=10;

}

dataTemp[4]+=10;//取2位小数,这里是加入小数点

dataTemp[1]=21;//n

dataTemp[0]=22;//H

}

else{

for(i=1;i<8;i++){

dataTemp[i]=(uchar)(freTemp%10);

freTemp/=10;

}

dataTemp[2]+=10;

dataTemp[0]=22;//H

}

for(i=0;i<8;i++){//数据从高位到低位显示,并进行高位消零操作

if(0!

=dataTemp[7-i]){

flag=1;

}

if((0==dataTemp[7-i])&&(0==flag)){

dataTemp[7-i]=20;

}

wData_Ex(dataTemp[7-i]);//显示数据

}

}

//数据显示--显示脉宽,单位us,意味着最大只能测1MHz的频率

staticvoiddisWide(){

uchardatadataTemp[8],i;

ulongdatawideTemp=wide;

uchardataflag=0;

for(i=0;i<8;i++){

dataTemp[i]=(uchar)(wideTemp%10);

wideTemp/=10;

}

for(i=0;i<8;i++){//数据从高位到低位显示,并进行高位消零操作

if(0!

=dataTemp[7-i]){

flag=1;

}

dataTemp[1]|=10;

if((0==dataTemp[7-i])&&(0==flag)){

dataTemp[7-i]=20;

}

wData_Ex(dataTemp[7-i]);

}

}

//数据显示--显示占空比

staticvoiddisDuty(){

uchardatadataTemp[4],i;

uintdatadutyTemp=duty;

for(i=0;i<4;i++){

dataTemp[i]=(uchar)(dutyTemp%10);

dutyTemp/=10;

}

dataTemp[2]+=10;

wData_Ex(20);//补4个暗选

wData_Ex(20);

wData_Ex(20);

wData_Ex(20);

for(i=0;i<4;i++){

wData_Ex(dataTemp[3-i]);

}

}

/*

*.h文件,文件名:

EqulaFre_SGMDisplay.h

*SGM显示模块,用于显示由主程序传过来的数据

*硬件资源:

164时钟端--P3.1

164数据端--P3.0

*/

#ifndef_EQUALFRE_SGMDISPLAY_H_H_

#define_EQUALFRE_SGMDISPLAY_H_H_

#include

#include

#defineucharunsignedchar

sbitsgm_clk=P3^1;//164时钟端

sbitsgm_data=P3^0;//164数据端

staticucharcodenum[]={//从低位到高位,高电平有效

0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,//数字0-9

0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xbf,0xe1,0xff,0xf7,//带点号的0-9

0x00,0x2a,0x6e//暗选,n,h

};

//接口函数

voidwData_Ex(uchar);//在数码管上显示数据

#endif

/*

*.c文件,文件名:

EqualFre_SGMDisplay.c

*/

#include"EqualFre_SGMDisplay.h"

//接口函数

voidwData_Ex(ucharindex){

uchardatai,byte;

byte=num[index];

for(i=0;i<8;i++){

sgm_clk=0;

sgm_data=(bit)((byte>>i)&0x01);

_nop_();

sgm_clk=1;

_nop_();

}

}

/*

*.c文件,文件名:

EqualFre_modeFromKey.c

*/

#include"EqualFre_modeFromKey.h"

//**************内部函数************

//按键检测延时

staticvoidkeyDelay(){

uchardatax,y;

for(x=100;x>0;x--);

for(y=200;y>0;y--);

}

//按键扫描

staticvoidkeyScan(){//选择模式

if(0==Key_Mode){

keyDelay();

if(1==Key_Mode)return;

switch(mode){

caseSHOW_FRE_MODE:

//测频率

mode=SHOW_WIDE_MODE;//下一次测的是脉宽

break;

caseSHOW_WIDE_MODE:

//测脉宽

mode=SHOW_DUTY_MODE;//下一次测的是占空比

break;

caseSHOW_DUTY_MODE:

//测占空比

mode=SHOW_FRE_MODE;//下一次测的是频率

break;

default:

mode=SHOW_FRE_MODE;

break;

}

while(0==Key_Mode);

keyDelay();

}

if(0==Key_Hold_Data){

keyDelay();

if(1==Key_Hold_Data)return;

mode=HOLD_DATA_MODE;//按下Key_Hold_Data,即为P1^1时,数据保持不变

while(0==Key_Hold_Data);

keyDelay();

}

}

//*******************接口函数**************

uchargetMode_Ex(void){//返回mode,确定选择的模式

keyScan();

returnmode;

}

/*

*.h文件,文件名:

equalFre.h

*模式控制模块,通过键盘来控制模式的选择,并将所选模式传递给函数

*所使用的硬件资源:

频率显示、脉宽显示、占空比显示的切换建---P1.0

测试值保持键--P1^1

*/

#ifndef_EQUALFRE_MODEFROMKEY_H_H_

#define_EQUALFRE_MODEFROMKEY_H_H_

#include

#defineSHOW_FRE_MODE0

#defineSHOW_WIDE_MODE1

#defineSHOW_DUTY_MODE2

#defineHOLD_DATA_MODE3

#defineucharunsignedchar

sbitKey_Mode=P1^0;//实现频率显示,脉宽显示,占空比显示的转化

sbitKey_Hold_Data=P1^1;//将测得的数值定住

staticuchardatamode;

//内部函数

staticvoidkeyDelay();//按键检测延时

staticvoidkeyScan();//按键扫描

//接口函数

uchargetMode_Ex(void);//在数码管上显示数据

#endif

/*

*.h文件,文件名:

EqulaFre_communication.h

*通信模块,用于和FPGA通信,获取频率、脉宽、占空比的原始数据。

*并将处理好数据传给主程序

*所使用的硬件资源:

地址线0---P2.0

地址线1---P2.1

地址线2---P2.2

地址线3---P2.3

测频标志位---P2.4

数据线----P0

定时器T0

*/

#ifndef_EQUALFRE_COMMUNICATION_H_H_

#define_EQUALFRE_COMMUNICATION_H_H_

#include

#include

#defineucha

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2