光电与通信工程学院课程设计报告书课设名称:等精度频率计年级专业及班级:姓名:学号:一、课程设计目的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;ENTITYEQUALFRECOUNTISPORT(BCLK,TCLK:INSTD_LOGIC;DATA_OUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0);EN:INSTD_LOGIC;ADDRESS:INSTD_LOGIC_VECTOR(3DOWNTO0));ENDEQUALFRECOUNT;ARCHITECTUREARCHOFEQUALFRECOUNTISSIGNALEN2,WIDE_TEST:STD_LOGIC;SIGNALWIDE_COUNT,B_COUNT,T_COUNT:STD_LOGIC_VECTOR(31DOWNTO0);SIGNALSAVE_WIDE,SAVE_B,SAVE_T:STD_LOGIC_VECTOR(31DOWNTO0);BEGINPROCESS(EN,TCLK)BEGINIFRISING_EDGE(TCLK)THENEN2=EN;ELSENULL;ENDIF;ENDPROCESS;PROCESS(EN2,TCLK,BCLK)BEGINIFEN2='1'THENIFRISING_EDGE(TCLK)THENIFT_COUNT=XFFFF_FFFFTHENT_COUNT=(OTHERS='1');ELSET_COUNT=T_COUNT+1;SAVE_T=T_COUNT+1;--SAVET_COUNTENDIF;ELSENULL;ENDIF;IFFALLING_EDGE(TCLK)THENIFWIDE_TEST='0'THENWIDE_COUNT=B_COUNT;WIDE_TEST='1';ELSESAVE_WIDE=WIDE_COUNT;--SAVEWIDE_COUNTENDIF;ENDIF;IFRISING_EDGE(BCLK)THENIFB_COUNT=XFFFF_FFFFTHENB_COUNT=(OTHERS='1');ELSEB_COUNT=B_COUNT+1;SAVE_B=B_COUNT+1;--SAVEB_COUNTINSAVE_BENDIF;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)BEGINIFRISING_EDGE(BCLK)THENIFEN2='0'THEN--USESOMECONSTANTSTOTESTCASEADDRESSISWHENX0=DATA_OUT=SAVE_T(7DOWNTO0);WHENX1=DATA_OUT=SAVE_T(15DOWNTO8);WHENX2=DATA_OUT=SAVE_T(23DOWNTO16);WHENX3=DATA_OUT=SAVE_T(31DOWNTO24);WHENX4=DATA_OUT=SAVE_B(7DOWNTO0);WHENX5=DATA_OUT=SAVE_B(15DOWNTO8);WHENX6=DATA_OUT=SAVE_B(23DOWNTO16);WHENX7=DATA_OUT=SAVE_B(31DOWNTO24);WHENX8=DATA_OUT=SAVE_WIDE(7DOWNTO0);WHENX9=DATA_OUT=SAVE_WIDE(15DOWNTO8);WHENXA=DATA_OUT=SAVE_WIDE(23DOWNTO16);WHENXB=DATA_OUT=SAVE_WIDE(31DOWNTO24);WHENOTHERS=NULL;ENDCASE;ELSENULL;ENDIF;ELSENULL;ENDIF;ENDPROCESS;ENDARCH;单片机:/**.c文件,文件名:EqualFre_main.c*各模块的流程控制*/#includeEqualFre_main.hintmain(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-910-19跟了点号的0-920暗选***************************************/staticvoiddisDelay(){//显示延时uchardatax,y;for(x=250;x0;x--)for(y=50;y0;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;i8;i++)wData_Ex(1);}staticvoiddisWide(){uchardatai;for(i=0;i8;i++)wData_Ex(2);}staticvoiddisDuty(){uchardatai;for(i=0;i8;i++)wData_Ex(3);}*///数据显示--显示频率,单位Hz或MHz(双模式)staticvoiddisFre(){uchardatadataTemp[8],i;ulongdatafreTemp=fre;//为了显示1位小数,这里已经将频率扩大10倍uchardataflag=0;//消零标志位if(1000000=freTemp){//当频率值大于1M时,使用兆显示模式freTemp/=100000;//0.00MHzfor(i=2;i8;i++){//数据从低位到高位装入数据暂存器dataTemp,这里保留2位,用于显示nH(即MHz)dataTemp[i]=(uchar)(freTemp%10);freTemp/=10;}dataTemp[4]+=10;//取2位小数,这里是加入小数点dataTemp[1]