您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 基于CPLD实现的DDS频率计
基于STC89C51和CPLD实现的DDS与频率计键盘输入DDSSTC89C51LCD1602显示电路频率计系统框图功能描述:以STC89C51为控制核心,实现任意频率值fa(小于10KHz)的输入,经单片机出来后,生成相应的频率字,然后送给DDS模块,DDS模块开始工作,生成以频率值fs;但键盘测频键按下后,单片机控制频率计,让其开始控制,频率计输出值送回单片机处理,得出测量到的频率值fc,最后单片机控制LCD1602显示人为输入的频率值fa和频率计测得的频率值fc,两个值的差异可以直观的显示出系统的误差。基于CPLD/FPGA的DDS原理图如下:基于CPLD/FPGA的频率计的原理图如下:DDS模块代码:(1)MUX832LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMUX832ISPORT(DATAINN:INSTD_LOGIC_VECTOR(7DOWNTO0);clk:instd_logic;DATAOUTT:OUTSTD_LOGIC_VECTOR(31DOWNTO0);SELL:INSTD_LOGIC_VECTOR(1DOWNTO0));ENDMUX832;ARCHITECTUREbehavOFMUX832ISBEGINPROCESS(SELL,DATAINN,clk)BEGINifclk'eventandclk='1'thenCASESELLISWHEN00=DATAOUTT(7DOWNTO0)=DATAINN;WHEN01=DATAOUTT(15DOWNTO8)=DATAINN;WHEN10=DATAOUTT(23DOWNTO16)=DATAINN;WHEN11=DATAOUTT(31DOWNTO24)=DATAINN;ENDCASE;endif;ENDPROCESS;ENDbehav;(2)32位加法器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYADDER32BISPORT(A:INSTD_LOGIC_VECTOR(31DOWNTO0);B:INSTD_LOGIC_VECTOR(31DOWNTO0);S:OUTSTD_LOGIC_VECTOR(31DOWNTO0));ENDADDER32B;ARCHITECTUREbehavOFADDER32BISBEGINS=A+B;ENDbehav;(3)32位寄存器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYREG32BISPORT(LOAD:INSTD_LOGIC;DIN:INSTD_LOGIC_VECTOR(31DOWNTO0);DOUT:OUTSTD_LOGIC_VECTOR(31DOWNTO0));ENDREG32B;ARCHITECTUREbehavOFREG32BISBEGINPROCESS(LOAD,DIN)beginIFLOAD'EVENTANDLOAD='1'THENDOUT=DIN;ENDIF;ENDPROCESS;ENDbehav;频率计模块代码:(1)标准频率计数器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYBZHHISPORT(BCLK:INSTD_LOGIC;--FsBENA:INSTD_LOGIC;CLR:INSTD_LOGIC;--清零BZQ:inOUTSTD_LOGIC_VECTOR(31DOWNTO0));ENDBZHH;ARCHITECTUREbehavOFBZHHISBEGINPROCESS(BCLK,CLR)--标准频率计数开始BEGINIFCLR='1'THENBZQ=(OTHERS='0');ELSIFBCLK'EVENTANDBCLK='1'THENIFBENA='1'THENBZQ=BZQ+1;ENDIF;ENDIF;ENDPROCESS;ENDbehav;(2)待测频率计数器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYTTFFISPORT(TCLK:INSTD_LOGIC;--FsENA:INSTD_LOGIC;CLR:INSTD_LOGIC;--清零TSQ:inOUTSTD_LOGIC_VECTOR(31DOWNTO0));ENDTTFF;ARCHITECTUREbehavOFTTFFISBEGINPROCESS(TCLK,CLR,ENA)BEGINIFCLR='1'THENTSQ=(OTHERS='0');ELSIFTCLK'EVENTANDTCLK='1'THENIFENA='1'THENTSQ=TSQ+1;ENDIF;ENDIF;ENDPROCESS;ENDbehav;(3)MUX648LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMUX648ISPORT(DATAIN1:INSTD_LOGIC_VECTOR(31DOWNTO0);DATAIN2:INSTD_LOGIC_VECTOR(31DOWNTO0);DATAOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0);SEL:INSTD_LOGIC_VECTOR(2DOWNTO0));ENDMUX648;ARCHITECTUREbehavOFMUX648ISBEGINDATAOUT=DATAIN1(7DOWNTO0)WHENSEL=000ELSE--标准频率计低八位输出DATAIN1(15DOWNTO8)WHENSEL=001ELSEDATAIN1(23DOWNTO16)WHENSEL=010ELSEDATAIN1(31DOWNTO24)WHENSEL=011ELSE--标准频率计最高八位输出DATAIN2(7DOWNTO0)WHENSEL=100ELSE--待测频率计数值低八位输出DATAIN2(15DOWNTO8)WHENSEL=101ELSEDATAIN2(23DOWNTO16)WHENSEL=110ELSEDATAIN2(31DOWNTO24)WHENSEL=111ELSE--待测频率计数值最高八位输出DATAIN2(31DOWNTO24);ENDbehav;单片机程序如下:主程序#includereg52.h#includeintrins.h#includekey.h//scankey();keyexe();setfre();testfre();#includelcd1602.h//display();voidmain(void){lcd_init();bena=0;clr=1;load_dds=0;oe=0;start=1;lcd_str(0,2,dds.and.testfre!);while(1){keyexe();}}键盘程序:#ifndef__KEY_H__#define__KEY_H__#includereg52.h#includeintrins.h#includelcd1602.h#definedinoutP3;unsignedcharkeybuffer[8],longtochar[4],recieve[8];unsignedlongfreword,setdispbuf;unsignedlongtfrecount,bfrecount;//Fs、Fx计数值unsignedlongtfreword;//-----------pindefineforddsandtestfre------sbitsel2=P1^2;sbitsel1=P1^1;sbitsel0=P1^0;sbitoe=P2^3;//-----------pindefineforddsloading----------sbitload_dds=P2^4;//-----------pindefinefortestfre--------------sbitclr=P2^0;sbitbena=P2^1;sbitstart=P2^2;//-----------delayprogramm----------------------voiddelay(unsignedintn){while(n--)_nop_();}//-----------formatexchange---------------------voidkeytofreword(void){freword=keybuffer[0]*10000000+keybuffer[1]*1000000+keybuffer[2]*100000+keybuffer[3]*10000+keybuffer[4]*1000+keybuffer[5]*100+keybuffer[6]*10+keybuffer[7];//合成输入频率值setdispbuf=freword;freword=(unsignedlong)(freword*214.7493648);//计算相应的频率字longtochar[0]=(freword24)&0xff;//频率字最高八位longtochar[1]=(freword16)&0xff;//频率字次高八位longtochar[2]=(freword8)&0xff;//频率字次低八位longtochar[3]=(freword)&0xff;//频率字最低八位}//-----------selectchannel-----------------------voidselect(unsignedcharsel){unsignedchari,j;j=sel;sel=sel&0x07;i=P1;i=i&0xf8;i=i|sel;P1=i;}//-----------settingfrequency--------------------voidsetfre(void){unsignedchari;keytofreword();display(setdispbuf,1);//显示输入的频率值lcd_str(0,2,--setting.fre!-);oe=0;load_dds=0;for(i=0;i4;i++){select(i);P3=longtochar[i];_nop_();_nop_();_nop_();load_dds=1;_nop_();_nop_();_nop_();load_dds=0;}lcd_str(0,2,--setting.succ!-);}//----------testfrequency------------------------voidtestfre(void){unsignedchari;unsignedintj;lcd_str(0,2,--testing.fre---);bena=0;clr=0;_nop_();_nop_();_nop_();_nop_();clr=1;//-----clearregister--------清零bena=1;//允许频率计开始工作delay1ms_x(1000);//门控时间2Sdelay1ms_x(1000);bena=0;//------countuntilstartequals0------------j=10000;while((start==1)&&(j--));//----waitforendoftesttingortimeout---if(j==0)lcd_str(0,2,--test.fre.err!-);elselcd_str(0,2,-test.fre.succ!-);oe=1;//双向口for(i=0;i8;i++){select(i);P3=0xff;//P3作为输入口_nop_();_nop_(
本文标题:基于CPLD实现的DDS频率计
链接地址:https://www.777doc.com/doc-2568959 .html