基于FPGA的等精度频率计_第1页
基于FPGA的等精度频率计_第2页
基于FPGA的等精度频率计_第3页
基于FPGA的等精度频率计_第4页
基于FPGA的等精度频率计_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、XIAMEN UNIVERSliTVOF TECHNOLOGY光电与通信工程学院课程设计报告课设名称:等精度频率计年级专业及班级:名: 号:、课程设计目的1、 进一步熟悉Quartus n的软件使用方法,熟悉keil软件使用;2、熟悉单片机与可编程逻辑器件的开发流程及硬件测试方法;3、掌握等精度频率计设计的基本原理。4、掌握独立系统设计及调试方法,提高系统设计能力。实验设备EDA最小系统板一块(康芯)、PC机一台、示波器一台、信号发生器一台、 万用表一个。二、设计任务利用单片机与FPGA设计一款等精度频率计,待测脉冲的检测及计数部分由 FPGA实现,FPGA勺计数结果送由单片机进行计算,并将最

2、终频率结果显示在 数码管上。 要求该频率计具有较高的测量精度, 且在整个频率区域能保持恒定的 测试精度,具体指标如下:a)具有频率测试功能:测频范围100Hz5MHz测频精度:相对误差恒为基准 频率的万分之一。0.1 卩 s。b)具有脉宽测试功能:测试范围10卩s1s,测试精度:c)具有占空比测试功能:测试精度 1%99%d)具有相位测试功能。(注:任务 a 为基本要求,任务 b 、 c、 d 为提高要求)三、基本原理基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,在实用中有较大的局限性, 而等精度频率计不但具有较高的测量精度, 而且在整个 频率区域能保持恒定的测试精度。3.1

3、 等精度测频原理等精度频率计主控结构如图 1 所示预置门控信号 CL 选择为 0.11s 之间(通过测试实验得出结论: CL 在这个范围内选择时间宽度对测频精度几乎没有影响) 。BZH和TF分别是2个高速 计数器,BZH对标准频率信号(频率为Fs )进行计数,设计数结果为Ns ;TF对 被测信号(频率为Fx)进行计数,计数结果为 Nx,则有MUX64-8 模块并不是必须的,可根据实际设计进行取舍。分析测频计测控时序,着重分析START的作用,完成等精度频率计设计。3.2 FPGA 模块FPGA 模块所要完成的功能如图 1 所示,由于单片机的速度慢,不能直接测 量高频信号,所以使用高速FP GA

4、为测频核心。100MHZ的标准频率信号由 FPGA内部的PLL倍频实现,待测信号TCLK为方波,由信号发生器给出待测 方波信号(注意:该方波信号带有直流偏置,没有负电压,幅值3.3V ) 。预制门控信号 CL 由单片机发出, BRNA 和 ENA 分别是 BZH 与 TF 两个计数器的 计数允许信号端。FPGA将允许计数时间内的BZH、TF的运行结果送入单片机进 行最后的计算。顶层文件如下:2以下是把 20M 5倍频的设置,利用FPGA内部的PLL 。MslEiTreG去止jpjilerIniffYd:End Itire500. D bs 401D HZ 43D 0 u1I(埶.0HZ 浜0

5、0 L5 720. G us 60G 0 恥 360.0- asKD.O 匸11.陌tzJa顾傘KI£fwnmmmrmimmrraraiojmoiramirarmraini电路需要100M标准频率信号,FPGA提供20M的频率,所以需要建立PLL模块,使之五杯频,得到所需的100M信号。功能仿真设置:二IUbiem"尸Ltni:i*i:广3l SfrUmbpri hbUwLSimuLsii口Fl inpuiSlahrdadFiq vrjl Add Mullpfc Fle«.w FUim flifv.i1-IP lil vet-hr>r加 阳亡 4±

6、曰门厂 EniT am il-Acin 朮 I > >'下图是波形仿真的结果:-討wn cpiicr-isAuTTm.icoly 日日i± pm I口 Trnul<<ior ljRiXf Checka.- s-f«_ ii C _iL j-arr.i_" i T;dr _ . I3.3单片机模块单片机模块完成对整个测频系统的控制,包括对FPGA的控制以及数码管的( -iiii -Ir r I. r |e.L Ovei wir.o TmLjIflton inpiLil No vJlh :imLia»icn -osiJtT r

7、 GakvaiAla 占i口cd ActKitp Fila:Inn显示控制。测频允许信号由单片机发出,并且单片机的P0 口负责循环读取FPGA发送过来的测频结果数据(BZH、TF两个计数器的计数结果,每次传送 8位数据),P2负责发送控制信号,单片机可以通过结束信号了解测频记数是否结束,以确定何时开始读取数据。附上康芯原理图截图:四、实验现象Ms丰一二lbE -I -I- 1 * p:斥- 三w長十« K-岂艮一: 肓盯 HIrin-vVavll |vH* * « V I ITnWMWSMliSMffllfflMSbura.i.jiijijzjH iBpli_Si3_11p

8、 rjJ mB 33*=BPTTlBi匸 ”毛TiBwir 一*IIEriClT14JPt;m-Kwr-JL=»才;二tr:占空比71 0 D 0 0 5 0由于书本上有一段程序,所以 当到课程设计的时候,将书上 我又仔仔细细地分析了一遍设计 并能自己添加预置控制信息五、心得体会这周课程设计的题目是等精度频率计的设计, 一开始只是将书上的程序和显示波形研究了一下。 程序敲入并实现效果后有点茫然的感觉。于是, 原理,从新改变了输入的代码,加上自己的思路,CL模块。原本我还想将测试频率显示在数码管上,但是最终没能实现,这应该 是我的一个遗憾吧。设计中,我感受到了硬件描述语言的强大, 我可

9、以几乎不用 考虑硬件条件, 将代码导入就可实现功能。 不要总想着去依靠书本上的原题或者 是他人, 自己思考的做出来的, 才算是自己真正收获的。 本次实验最大的收获莫 过于,独立系统的去完成一项任务。 在其中我查阅了大量的资料, 尤其是数字电 路、quarters n软件使用说明、EDA设计等方面的资料。通过本次学习使我对时序电路有了更深的理解, 具体体现在复位、 计数、锁 存多环节的控制上。同时,在这次实验中,我第一次联合单片机和EDA一起完成 一个项目。EDA充分的发挥其高频工作的特点,使得频率测量的上限很高。单片 机则在整个系统中充当控制及数据处理的作用设计的优点及缺点本频率计最大优点在于

10、它的高精度。信号频率的测量,不受闸门信号精度 的影响。在被测信号送入计数器之前,先通过 D 触发器,使闸门信号和被测信 号同步,有效地避免了 ±误差。不仅如此,本频率计对100HZ至5MHZ的全域 相对误差均小于百万之一。当然,本频率计也存在缺点。在频率计的设计中,乘法器为 32位,除法 器采用 64 位,资源占用率太大。 单片机处理 32 位数据的方式有待改进, 要是它 变得更优化六、 系统设计步骤及程序,结果FPGA:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY EQ

11、UALFRECOUNT ISPORT(BCLK,TCLK:IN STD_LOGIC;DATA_OUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); EN:IN STD_LOGIC;ADDRESS:IN STD_LOGIC_VECTOR(3 DOWNTO 0) );END EQUALFRECOUNT;ARCHITECTURE ARCH OF EQUALFRECOUNT ISSIGNAL EN2,WIDE_TEST:STD_LOGIC;SIGNAL WIDE_COUNT,B_COUNT,T_COUNT:STD_LOGIC_VECTOR(31 DOWNTO 0);SIGNAL

12、SAVE_WIDE,SAVE_B,SAVE_T:STD_LOGIC_VECTOR(31 DOWNTO 0); BEGINPROCESS(EN,TCLK)BEGINIF RISING_EDGE(TCLK) THEN EN2<=EN;ELSE NULL;END IF;END PROCESS;PROCESS(EN2,TCLK,BCLK)BEGINIF EN2='1' THENIF RISING_EDGE(TCLK) THENIF T_COUNT=X"FFFF_FFFF" THENT_COUNT<=(OTHERS=>'1');ELS

13、E T_COUNT<=T_COUNT+1;SAVE_T<=T_COUNT+1;-SAVE T_COUNTEND IF;ELSE NULL;END IF;IF FALLING_EDGE(TCLK) THENIF WIDE_TEST='0' THEN WIDE_COUNT<=B_COUNT; WIDE_TEST<='1'ELSE SAVE_WIDE<=WIDE_COUNT;-SAVE WIDE_COUNT END IF;END IF;IF RISING_EDGE(BCLK) THENIF B_COUNT=X"FFFF_FFFF

14、" THENB_COUNT<=(OTHERS=>'1');ELSE B_COUNT<=B_COUNT+1;SAVE_B<=B_COUNT+1;-SAVE B_COUNT IN SAVE_BEND IF;ELSE NULL;END IF;ELSE-WHEN ENA=0,WE OUTPUT THE DATA AND RESET THE COUNTER. WIDE_COUNT<=(OTHERS=>'0');B_COUNT<=(OTHERS=>'0');T_COUNT<=(OTHERS=&g

15、t;'0'); WIDE_TEST<='0'END IF;END PROCESS;PROCESS(ADDRESS,EN2,SAVE_T,SAVE_B,SAVE_WIDE,BCLK) BEGINIF RISING_EDGE(BCLK) THENIF EN2='0' THEN-USE SOME CONSTANTS TO TESTCASE ADDRESS ISWHEN X"0"=>DATA_OUT<=SAVE_T(7 DOWNTO 0); WHEN X"1"=>DATA_OUT<=S

16、AVE_T(15 DOWNTO 8);WHEN X"2"=>DATA_OUT<=SAVE_T(23 DOWNTO 16);WHEN X"3"=>DATA_OUT<=SAVE_T(31 DOWNTO 24);WHEN X"4"=>DATA_OUT<=SAVE_B(7 DOWNTO 0);WHEN X"5"=>DATA_OUT<=SAVE_B(15 DOWNTO 8);WHEN X"6"=>DATA_OUT<=SAVE_B(23 DOWNT

17、O 16);WHEN X"7"=>DATA_OUT<=SAVE_B(31 DOWNTO 24);WHEN X"8"=>DATA_OUT<=SAVE_WIDE(7 DOWNTO 0);WHEN X"9"=>DATA_OUT<=SAVE_WIDE(15 DOWNTO 8);WHEN X"A"=>DATA_OUT<=SAVE_WIDE(23 DOWNTO 16);WHEN X"B"=>DATA_OUT<=SAVE_WIDE(31 DOWNTO

18、 24);WHEN OTHERS=>NULL;END CASE;ELSE NULL;END IF;ELSE NULL;END IF;END PROCESS;END ARCH;单片机:/* *.c 文件 ,文件名 : EqualFre_main.c* 各模块的流程控制 */#include "EqualFre_main.h" int main(void)communicationInit_Ex();while(1)/ 确定选择的模式/ 请求数据mode = getMode_Ex();askForData_Ex();if(HOLD_DATA_MODE != mode) l

19、oadData();/ 表示没有固定数据时 , 则载入数据disData();/ 数据显示/ 数据载入static void loadData() fre = getFre_Ex();wide = getWide_Ex();duty = getDuty_Ex();/*数据显示中 :wData(uchar) 传入的参数意义0 - 9 数字 0-910 - 19跟了点号的 0-920 暗选*/static void disDelay()/ 显示延时uchar data x,y;for(x=250;x>0;x-)for(y=50;y>0;y-);/ 数据显示 - 总控static voi

20、d disData()switch(mode)case SHOW_FRE_MODE:case SHOW_WIDE_MODE:disFre(); disDelay(); break; disWide(); disDelay();break;case SHOW_DUTY_MODE:disDuty(); disDelay(); break;default:break;/*static void disFre()uchar data i;for(i=0;i<8;i+)wData_Ex(1);static void disWide()uchar data i;for(i=0;i<8;i+)w

21、Data_Ex(2);static void disDuty()uchar data i;for(i=0;i<8;i+)wData_Ex(3);*/数据显示-显示频率,单位Hz或MHz ( 双模式 )static void disFre()为了显示 1位小数,这里已经将频率扩大 10 倍uchar data dataTemp8,i;ulong data freTemp = fre;/uchar data flag = 0;/消零标志位if(1000000 <= freTemp)/当频率值大于 1M 时 ,使用兆显示模式freTemp /= 100000;/0.00MHZfor(i=

22、2;i<8;i+)/ 数据从低位到高位装入数据暂存器 dataTemp , 这里保留 2 位, 用于显示 nH( 即 MHZ)dataTempi = (uchar)(freTemp%10); freTemp /= 10;dataTemp4 += 10;/ 取 2 位小数 , 这里是加入小数点 dataTemp1 = 21;/ndataTemp0 = 22;/Helsefor(i=1;i<8;i+)dataTempi = (uchar)(freTemp%10);freTemp /= 10;dataTemp2 += 10;dataTemp0 = 22;/H for(i=0;i<8

23、;i+)/ 数据从高位到低位显示 ,并进行高位消零操作if(0 != dataTemp7-i)flag = 1;if(0=dataTemp7-i)&&(0=flag)dataTemp7-i = 20; wData_Ex(dataTemp7-i);/ 显示数据/数据显示-显示脉宽,单位us ,意味着最大只能测1MHZ的频率static void disWide()uchar data dataTemp8,i;ulong data wideTemp = wide;uchar data flag = 0;for(i=0;i<8;i+)dataTempi = (uchar)(wi

24、deTemp%10);wideTemp /= 10;for(i=0;i<8;i+)/ 数据从高位到低位显示 ,并进行高位消零操作if(0 != dataTemp7-i)flag = 1;dataTemp1|=10;if(0=dataTemp7-i)&&(0=flag)dataTemp7-i = 20;wData_Ex(dataTemp7-i);/ 数据显示 - 显示占空比static void disDuty()uchar data dataTemp4,i; uint data dutyTemp = duty;for(i=0;i<4;i+)dataTempi = (

25、uchar)(dutyTemp%10);dutyTemp /= 10;dataTemp2 += 10;wData_Ex(20);/ 补 4 个暗选wData_Ex(20);wData_Ex(20);wData_Ex(20);for(i=0;i<4;i+)wData_Ex(dataTemp3-i);/*.h文件,文件名 : EqulaFre_SGMDisplay.h*SGM 显示模块 ,用于显示由主程序传过来的数据* 硬件资源 :164 时钟端 -P3.1 164 数据端 -P3.0*/#ifndef _EQUALFRE_SGMDISPLAY_H_H#define _EQUALFRE_SG

26、MDISPLAY_H_H#include<reg52.h>#include<intrins.h>#define uchar unsigned charsbit sgm_clk=P 3人1;sbit sgm_data=卩3人0;/164 时钟端/164 数据端static uchar code num = /从低位到高位 , 高电平有效数字 0-9带点号的 0-9void wData_Ex(uchar );/ 在数码管上显示数据0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,/0xfd,0x61,0xdb,0xf3,0x

27、67,0xb7,0xbf,0xe1,0xff,0xf7,/0x00,0x2a,0x6e/ 暗选 ,n,h ;/ 接口函数#endif /*.c 文件,文件名 : EqualFre_SGMDisplay.c*/#include "EqualFre_SGMDisplay.h"/ 接口函数void wData_Ex(uchar index)uchar data i,byte;byte = numindex;for(i=0;i<8;i+)sgm_clk = 0;sgm_data = (bit)(byte>>i)&0x01);_nop_();sgm_clk

28、= 1;_nop_();/*.c文件 , 文件名 : EqualFre_modeFromKey.c*/#include "EqualFre_modeFromKey.h" /* 内部函数 */ 按键检测延时static void keyDelay()uchar data x,y;for(x=100;x>0;x-);for(y=200;y>0;y-) ;/ 按键扫描static void keyScan()/ 选择模式if(0 = Key_Mode)keyDelay();if(1 = Key_Mode) return ;switch(mode)case SHOW_F

29、RE_MODE:/ 测频率mode = SHOW_WIDE_MODE; break;/ 下一次测的是脉宽case SHOW_WIDE_MODE:/ 测脉宽mode = SHOW_DUTY_MODE;/ 下一次测的是占空比/ 测占空比mode = SHOW_FRE_MODE;/ 下一次测的是频率break;case SHOW_DUTY_MODE:break;default:mode = SHOW_FRE_MODE;break;while(0 = Key_Mode) ;keyDelay();if(0 = Key_Hold_Data)keyDelay();/ 按下 Key_Hold_Data , 即

30、 为if(1 = Key_Hold_Data) return ; mode = HOLD_DATA_MODE;PIT时,数据保持不变while(0 = Key_Hold_Data);keyDelay();/*接口函数 *uchar getMode_Ex(void)/ 返回 mode, 确定选择的模式keyScan();return mode;/*.h文件 , 文件名 : equalFre.h* 模式控制模块 ,通过键盘来控制模式的选择 ,并将所选模式传递给函数* 所使用的硬件资源 :频率显示 、 脉宽显示 、 占空比显示的切换建 -P1.0测试值保持键-PIT*/ #ifndef _EQUAL

31、FRE_MODEFROMKEY_H_H #define _EQUALFRE_MODEFROMKEY_H_H #include<reg52.h> #define SHOW_FRE_MODE 0 #define SHOW_WIDE_MODE 1 #define SHOW_DUTY_MODE 2 #define HOLD_DATA_MODE 3 #define uchar unsigned charsbit Key_Mode = P 1人0;sbit Key_Hold_Data = P IT;/ 实现频率显示 , 脉宽显示 ,占空比显示的转化/ 将测得的数值定住static uchar

32、data mode;/ 内部函数static void keyDelay();/ 按键检测延时static void keyScan();/ 接口函数/ 按键扫描uchar getMode_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 _EQUA

33、LFRE_COMMUNICATION_H_H#define _EQUALFRE_COMMUNICATION_H_H#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define ulong unsigned long#define uint unsigned int#define MY_THO Ox5d/ 对于 2OMhz 晶振来说 ,25ms#define MY_TL0 0x3d#define FREE_TIME 8O/ 空闲时间 , 即让 FPGA 测频率的时间 ,5Oms*FREE_TI

34、ME#define DATA_IN P0#define BASE_FRE 100000000 /FPGA的基准频率sbit addressO = PSO;sbit addressl = P21;sbit address2 = P 2人2;sbit address3 = P23;sbit TEST_EN = P24;/ 当它为1表示测频结束static ulong data fre,wide;static uint data duty;/ 内部函数static ulong getSourceData(uchar );/ 接口函数/ 从 FPGA 中获得基准信号 ,被测信号的数据void comm

35、unicationInit_Ex(void);void askForData_Ex(void);/ 请求数据ulong getFre_Ex(void);/ 计算频率值ulong getWide_Ex(void);/ 计算脉宽值/ 计算占空比uint getDuty_Ex(void);#endif /*.c 文件 , 文件名 : EqualFre_communication.c*/ #include "EqualFre_communication.h"/ 从 FPGA 那里获得频率 、脉宽 、占空比的原始值static ulong getSourceData(uchar so

36、urceKind)uchar data byte0,byte1,byte2,byte3;ulong data temp = 0;byte0 = byte1 = byte2 = byte3 = 0;switch(sourceKind)case 1:/ 被测信号 T 值address3 = 0; address2 = 0; address1 = 0; address0 = 0;_nop_();_nop_();_nop_();_nop_();/FPGA 反应时间byte0 = DATA_IN;address3 = 0; address2 = 0; address1 = 0; address0 = 1

37、;_nop_();_nop_();_nop_();_nop_();/FPGA 反应时间byte1 = DATA_IN;address3 = 0; address2 = 0; address1 = 1; address0 = 0;_nop_();_nop_();_nop_();_nop_();/FPGA 反应时间 byte2 = DATA_IN;address3 = 0; address2 = 0; address1 = 1; address0 = 1;_nop_();_nop_();_nop_();_nop_();/FPGA 反应时间byte3 = DATA_IN;break;case 2:/

38、 基准信号 B 值address3 = 0; address2 = 1; address1 = 0; address0 = 0;_nop_();_nop_();_nop_();_nop_();/FPGA 反应时间byte0 = DATA_IN;address3 = 0; address2 = 1; address1 = 0; address0 = 1;_nop_();_nop_();_nop_();_nop_();/FPGA 反应时间byte1 = DATA_IN;address3 = 0; address2 = 1; address1 = 1; address0 = 0;_nop_();_n

39、op_();_nop_();_nop_();/FPGA 反应时间byte2 = DATA_IN;address3 = 0; address2 = 1; address1 = 1; address0 = 1;_nop_();_nop_();_nop_();_nop_();/FPGA 反应时间byte3 = DATA_IN;break;case 3:/ 脉宽 W 值address3 = 1; address2 = 0; address1 = 0; address0 = 0;_nop_();_nop_();_nop_();_nop_();/FPGA 反应时间byte0 = DATA_IN;address3 = 1; address2 = 0; address1 = 0; address0 = 1;_nop_();_nop_();_nop_();_nop_();/FPGA 反应时间byte1 = DATA_IN;address3 = 1; address2 = 0; address1 = 1; address0 = 0;_nop_();_nop_();_nop_();_n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论