基于fpga的数字频率计设计报告

基于fpga的数字频率计设计报告

ID:871609

大小:228.03 KB

页数:20页

时间:2017-09-22

上传者:^_^
基于fpga的数字频率计设计报告_第1页
基于fpga的数字频率计设计报告_第2页
基于fpga的数字频率计设计报告_第3页
基于fpga的数字频率计设计报告_第4页
基于fpga的数字频率计设计报告_第5页
资源描述:

《基于fpga的数字频率计设计报告》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

电子技术综合试验实验报告班级:测控一班学号:2907101002姓名:李大帅指导老师:李颖 基于FPGA的数字频率计设计报告一、系统整体设计设计要求:1、被测输入信号:方波2、测试频率范围为:10Hz~100MHz3、量程分为三档:第一档:闸门时间为1S时,最大读数为999.999KHz第二档:闸门时间为0.1S时,最大读数为9999.99KHz第三档:闸门时间为0.01S时,最大读数为99999.9KHz。4、显示工作方式:a、用六位BCD七段数码管显示读数。b、采用记忆显示方法c、实现对高位无意义零的消隐。系统设计原理:所谓“频率”,就是周期性信号在单位时间(1秒)内变化的次数。若在一定的时间间隔T内计数,计得某周期性信号的重复变化次数为N,则该信号的频率可表达为:f=N/T.基于这一原理我们可以使用单位时间内对被测信号进行计数的方法求得对该信号的频率测量,具体实现过程简述如下:首先,将被测信号①(方波)加到闸门的输入端。由一个高稳定的石英振荡器和一系列数字分频器组成了时基信号发生器,它输出时间基准(或频率基准)信号③去控制门控电路形成门控信号④,门控信号的作用时间T是非常准确的(由石英振荡器决定)。门控信号控制闸门的开与闭,只有在闸门开通的时间内,方波脉冲②才能通过闸门成为被计数的脉冲⑤由计数器计数。闸门开通的时间称为闸门时间,其长度等于门控信号作用时间T。比如,时间基准信号的重复周期为1S,加到闸门的门控信号作用时间T亦准确地等于1S,即闸门的开通时间——“闸门时间”为1S。在这一段时间内,若计数器计得N=100000个数,根据公式f=N/T,那么被测频率就是100000Hz。如果计数式频率计的显示器单位为“KHz”,则显示100.000KHz,即小数点定位在第三位。不难设想,若将闸门时间设为T=0.1S,则计数值为10000,这时,显示器的小数点只要根据闸门时间T的改变也随之自动往右移动一位(自动定位),那么,显示的结果为100.00Khz。在计数式数字频率计中,通过选择不同的闸门时间,可以改变频率计的测量范围和测量精度。系统单元模块划分:1)分频器,将产生用于计数控制的时钟分别为1HZ,10HZ,100HZ脉冲和1KHZ的用于七段显示数码管扫描显示的扫描信号。2)闸门选择器,用于选择不同的闸门时间以及产生后续的小数点的显示位置。3)门控电路,产生用于计数的使能控制信号,清零信号以及锁存器锁存信号。4)计数器,用于对输入的待测信号进行脉冲计数,计数输出。5)锁存器,用于对计数器输出数据的锁存,便于后续译码显示电路的对数据进行记忆显示,同时避免计数器清零信号对数据产生影响。6)译码显示,用于产生使七段显示数码管的扫描数字显示,小数点显示的输出信号,同时对高位的无意义零进行消隐。二、单元电路设计1、分频器:该电路将产生四个不同频率的信号输出,因为电路板上给出了一个48MHZ的晶振,所以我们只需要对48MHZ的信号进行适当分频即可得到我们所需的四个不同频率的信号输出,我们设计一个输入为 48MHZ,有四个输出端分别为1HZ,10HZ和100HZ,1KHZ的分频器,原程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityfenpinqiisPort(clk:inSTD_LOGIC;clkout1:outSTD_LOGIC;clkout10:outSTD_LOGIC;clkout100:outSTD_LOGIC;clkout1K:outSTD_LOGIC);endfenpinqi;architectureBehavioraloffenpinqiissignalcnt1:integerrange1to24000000;signalcnt10:integerrange1to2400000;signalcnt100:integerrange1to240000;signalcnt1K:integerrange1to24000;signalc1:std_logic;signalc2:std_logic;signalc3:std_logic;signalc4:std_logic;beginprocess(clk)isbeginifclk'eventandclk='1'thenifcnt1<24000000then--对cnt1进行计数,当cnt1未计满后对其进行加1cnt1<=cnt1+1;elsifcnt1=24000000then--cnt1计满后对其进行赋一,并且令c1进行翻转,然后将c1的值赋给clkout1c1<=notc1;--由于48MHZ的的信号,前一半的时候c1为0,则后一半是为1,就完成了对信号进行分频,产生了1HZ的信号cnt1<=1;endif;endif;endprocess;process(clk)isbeginifclk'eventandclk='1'then--方法同上ifcnt10<2400000thencnt10<=cnt10+1;elsifcnt10=2400000thenc2<=notc2; cnt10<=1;endif;endif;endprocess;process(clk)isbeginifclk'eventandclk='1'then--方法同上ifcnt100<240000thencnt100<=cnt100+1;elsifcnt100=240000thenc3<=notc3;cnt100<=1;endif;endif;endprocess;process(clk)isbeginifclk'eventandclk='1'then--方法同上ifcnt1K<24000000thencnt1K<=cnt1K+1;elsifcnt1=24000thenc4<=notc4;cnt1K<=1;endif;endif;endprocess;clkout1<=c1;clkout10<=c2;clkout100<=c3;clkout1K<=c4;endBehavioral;源文件编写成功后编译并生成图形文件符号如图:仿真文件编写如下:LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.all;USEieee.numeric_std.ALL;ENTITYtbb_vhdISENDtbb_vhd;ARCHITECTUREbehaviorOFtbb_vhdISCOMPONENTfenpinqi PORT(clk:INstd_logic;clkout1:OUTstd_logic;clkout10:OUTstd_logic;clkout100:OUTstd_logic;clkout1K:OUTstd_logic);ENDCOMPONENT;SIGNALclk:std_logic:='0';SIGNALclkout1:std_logic;SIGNALclkout10:std_logic;SIGNALclkout100:std_logic;SIGNALclkout1K:std_logic;BEGINuut:fenpinqiPORTMAP(clk=>clk,clkout1=>clkout1,clkout10=>clkout10,clkout100=>clkout100,clkout1K=>clkout1K);tb:PROCESSBEGINclk<='0';waitfor10ps;clk<='1';waitfor10ps;ENDPROCESS;END;对该模块进行仿真结果如下:有上图可知分频器工作正常,产生的个信号也没有毛刺,结果十分理想。2、闸门选择器:在这个模块中我们有四个输出端和六个输入端,其中四个输出端中有一个是频率输出端,是通过三个闸门选择开关输入和三个输入频率决定的,另外三个输出端则是用来后面的小数点控制的,而六个输入端中的三个是上面分频器的三个输出1HZ,10HZ和100HZ,另外三个是电路板上的拨动开关,用来选择闸门,控制输出。其原程序和分析如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitySELEisPort(SE1:inSTD_LOGIC; SE10:inSTD_LOGIC;SE100:inSTD_LOGIC;F1HZ:INSTD_LOGIC;F10HZ:INSTD_LOGIC;F100HZ:INSTD_LOGIC;FREF:outSTD_LOGIC;DP1:outSTD_LOGIC;DP2:outSTD_LOGIC;DP3:outSTD_LOGIC);endSELE;architectureBehavioralofSELEisbeginPROCESS(SE1,SE10,SE100)ISBEGINIFSE1='1'ANDSE10='0'ANDSE100='0'THENFREF<=F1HZ;--当闸门控制在第一档的时候,令输出端输出1HZ输入端的输入,小数点控制dp1有效,dp2,dp3无效DP1<='0';DP2<='1';DP3<='1';ENDIF;IFSE1='0'ANDSE10='1'ANDSE100='0'THENFREF<=F10HZ;--第二档,输出为10HZ,dp2有效DP1<='1';DP2<='0';DP3<='1';ENDIF;IFSE1='0'ANDSE10='0'ANDSE100='1'THENFREF<=F100HZ;--第三档,输出为100HZ,dp3有效DP1<='1';DP2<='1';DP3<='0';ENDIF;ENDPROCESS;endBehavioral;源代码编写完成后保存并生成图形文件符号如图:仿真文件编写如下:LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.all;USEieee.numeric_std.ALL;ENTITYTTB_vhdISENDTTB_vhd;ARCHITECTUREbehaviorOFTTB_vhdISCOMPONENTSELE PORT(SE1:INstd_logic;SE10:INstd_logic;SE100:INstd_logic;F1HZ:INstd_logic;F10HZ:INstd_logic;F100HZ:INstd_logic;FREF:OUTstd_logic;DP1:OUTstd_logic;DP2:OUTstd_logic;DP3:OUTstd_logic);ENDCOMPONENT;SIGNALSE1:std_logic:='1';SIGNALSE10:std_logic:='0';SIGNALSE100:std_logic:='0';SIGNALF1HZ:std_logic:='0';SIGNALF10HZ:std_logic:='0';SIGNALF100HZ:std_logic:='0';SIGNALFREF:std_logic;SIGNALDP1:std_logic;SIGNALDP2:std_logic;SIGNALDP3:std_logic;BEGINuut:SELEPORTMAP(SE1=>SE1,SE10=>SE10,SE100=>SE100,F1HZ=>F1HZ,F10HZ=>F10HZ,F100HZ=>F100HZ,FREF=>FREF,DP1=>DP1,DP2=>DP2,DP3=>DP3);tb:PROCESSBEGINF1HZ<='0';FREF<='0';waitfor100ns;F1HZ<='1';FREF<='1';WAITFOR100NS;ENDPROCESS;END;仿真结果如图: 有仿真结果可知闸门选择器工作正常,能够准确输出我们所需的信号。3、门控信号:在此模块中有一个输入端和两个输出端,输入端为上面的闸门选择器输出的频率,两个输出端分别为计数器是能控制信号(锁存器控制信号),和计数器清零信号。具体源程序即分析如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityCONTROLSisPort(FREF:inSTD_LOGIC;GAT:outSTD_LOGIC;CLR:outSTD_LOGIC);endCONTROLS;architectureBehavioralofCONTROLSisSIGNALG1:STD_LOGIC:='0';beginPROCESS(FREF)ISBEGINIFFREF'EVENTANDFREF='1'THENG1<=NOTG1;--该过程对时钟信号又一次进行分频,产生出半个周期时间为1的控制信号,作为计数使能,保证了时间的准确性ENDIF;ENDPROCESS;PROCESS(FREF,G1)ISBEGINIFFREF='0'ANDG1='0'THENCLR<='1';--该过程产生清零信号,即当使能信号为无效0同时时钟为0时,即在技术始终无效半个时钟时间后,对计数器清零ELSECLR<='0';--清零信号高电平有效ENDIF;ENDPROCESS;GAT<=G1;--将G1赋给gat输出端,它是计数器的使能信号同时也是锁存器的锁存信号endBehavioral;源文件编写完成后保存编译并生成图形文件符号如图:仿真文件代码如下:LIBRARYieee; USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.all;USEieee.numeric_std.ALL;ENTITYTBCON_vhdISENDTBCON_vhd;ARCHITECTUREbehaviorOFTBCON_vhdISCOMPONENTCONTROLSPORT(FREF:INstd_logic;GAT:OUTstd_logic;CLR:OUTstd_logic);ENDCOMPONENT;SIGNALFREF:std_logic:='0';SIGNALGAT:std_logic;SIGNALCLR:std_logic;BEGINuut:CONTROLSPORTMAP(FREF=>FREF,GAT=>GAT,CLR=>CLR);tb:PROCESSBEGINFREF<='0';WAITFOR100NS;FREF<='1';WAITFOR100NS;ENDPROCESS;END;对上面的文件进行仿真,结果如下:由上图的仿真结果可知,控制电路工作正常,输出信号稳定,很理想。同时我们也可以看出来该模块对分频器的时钟输出的稳定性依赖十分严重,一旦分频器输出时钟有毛刺,该控制信号将会完全的无效,这也是为什么我知道上面的分频器设计不是最优的方案,却还是采用了上述方法的原因。4、计数器:该模块实现的功能是对输入信号脉冲的计数,并正确的输出结果和溢出。使用上面的门控信号产生的gat信号控制计数器的使能端,以实现计数器的定时计数。该模块是使用六个十进制计数器同步并联而成的,首先我们设计用于并联的十进制计数器,原程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL; entityCNT10isPort(CLK:inSTD_LOGIC;CLR:inSTD_LOGIC;ENA:inSTD_LOGIC;CQ:outSTD_LOGIC_VECTOR(3downto0);CO:outSTD_LOGIC);endCNT10;architectureBehavioralofCNT10isSIGNALCQI:STD_LOGIC_VECTOR(3DOWNTO0):="0000";--定义中间信号CQI,用于数据输出的循环计数beginPROCESS(CLK,CLR)ISBEGINIFCLR='1'THENCQI<="0000";--当CLR清零信号有效时使输出为0000,无效时进行下述操作ELSIFCLK'EVENTANDCLK='1'THEN--对时钟进行计数IFENA='1'THEN--判断使能信号,有效则进行计数,否则不作处理IFCQI="1001"THENCQI<="0000";--数据0~9循环,计满后重新回到0ELSECQI<=CQI+'1';ENDIF;ENDIF;ENDIF;ENDPROCESS;CO<='1'whenena='1'andcqi=9else'0';--进位信号,最高位的仅为信号作为计数的溢出信号CQ<=CQI;--当且仅当使能有效且计数为9时产生进位信号,进位信号1有效,同步并联时连高位的使能端endBehavioral;文件编写完成后保存编译生成图形文件符号,如上图:创建图形文件cnt6并按照下图进行连接,保存后编译生成图形文件符号如图: 仿真文件代码如下:LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.all;USEieee.numeric_std.ALL;ENTITYTBCNT10_vhdISENDTBCNT10_vhd;ARCHITECTUREbehaviorOFTBCNT10_vhdISCOMPONENTCNT10PORT(CLK:INstd_logic;CLR:INstd_logic;ENA:INstd_logic;CQ:OUTstd_logic_vector(3downto0);CO:OUTstd_logic);ENDCOMPONENT;SIGNALCLK:std_logic:='0';SIGNALCLR:std_logic:='0';SIGNALENA:std_logic:='1';SIGNALCQ:std_logic_vector(3downto0);SIGNALCO:std_logic;BEGINuut:CNT10PORTMAP(CLK=>CLK,CLR=>CLR,ENA=>ENA,CQ=>CQ,CO=>CO);tb:PROCESSBEGINCLK<='0';waitfor100ns;CLK<='1';WAITFOR100NS;ENDPROCESS;END;仿真结果如图:如仿真结果我们可以看出,该模块运行正常,计数稳定,结果十分理想。 5、锁存器:由于前面的计数器的输出为六组四位二进制数和一个溢出信号,所以我们使用的锁存器也使用六个四位锁存器和一个一位锁存器。锁存器使用下降沿锁存,即当计数器的使能信号变为无效的一瞬间我们令锁存器将数据锁存。四位锁存器的原代码如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityLATCH4isPort(CLK:inSTD_LOGIC;DIN:inSTD_LOGIC_VECTOR(3downto0);QOU:outSTD_LOGIC_VECTOR(3downto0));endLATCH4;architectureBehavioralofLATCH4isbeginPROCESS(CLK,DIN)ISBEGINIFCLK'EVENTANDCLK='0'THEN--当时钟信号下降沿时,实现锁存QOU<=DIN;ENDIF;ENDPROCESS;endBehavioral;上述文件编写完成后保存编译生成图形文件符号如图:再编写一位锁存器,源程序代码如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityLATCH1isPort(CLK:inSTD_LOGIC;DIN:inSTD_LOGIC_VECTOR;QOU:outSTD_LOGIC_VECTOR);endLATCH1;architectureBehavioralofLATCH1isbeginPROCESS(CLK,DIN)ISBEGINIFCLK'EVENTANDCLK='0'THEN--当时钟信号下降沿时,实现锁存QOU<=DIN;ENDIF;ENDPROCESS;endBehavioral; 文件编写完成后保存编译生成图形文件符号,如图:锁存完成后有六组四位二进制数和一个一位二进制数,所以我们队总线进行了合并,即将六组四位数合并成一个二十四位数,合并程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityADVOCATESisPort(S0:inSTD_LOGIC_VECTOR(3downto0);S1:inSTD_LOGIC_VECTOR(3downto0);S2:inSTD_LOGIC_VECTOR(3downto0);S3:inSTD_LOGIC_VECTOR(3downto0);S4:inSTD_LOGIC_VECTOR(3downto0);S5:inSTD_LOGIC_VECTOR(3downto0);S6:outSTD_LOGIC_VECTOR(23downto0));endADVOCATES;architectureBehavioralofADVOCATESisbeginS6(23DOWNTO20)<=S0;--将总线的对应位进行连接S6(19DOWNTO16)<=S1;S6(15DOWNTO12)<=S2;S6(11DOWNTO8)<=S3;S6(7DOWNTO4)<=S4;S6(3DOWNTO0)<=S5;endBehavioral;文件编写完成后保存编译生成图形文件符号,如图:创建该模块的顶层图形文件LAT.sch将上述个文件按照如图所示连接,保存编译生成图形文件符号如图:该模块的输入输出简单,无需仿真。6、译码显示: 该模块实现的是对锁存器锁存的数据进行处理并显示输出,以及小数点的不同闸门的输出显示,以及电路板上七段显示译码管的扫描信号输出。其中对锁存数据的处理包括溢出有效时的数据消除,和对高位无意义零的自动消隐。首先我们编写小数点控制的源文件代码:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityPOINTCONisPort(SE1:inSTD_LOGIC;SE10:inSTD_LOGIC;SE100:inSTD_LOGIC;SEL:inSTD_LOGIC_VECTOR(2downto0);DP:outSTD_LOGIC);endPOINTCON;architectureBehavioralofPOINTCONisbeginPROCESS(SE1,SE10,SE100,SEL)ISBEGINIFSE1='1'ANDSE10='0'ANDSE100='0'ANDSEL="011"THENDP<='0';--当为第一档时,令第四位的数码管的小数点点亮,其他的不亮ELSIFSE1='0'ANDSE10='1'ANDSE100='0'ANDSEL="010"THENDP<='0';--第二档时,第三位的数码管小数点点亮ELSIFSE1='0'ANDSE10='0'ANDSE100='1'ANDSEL="001"THENDP<='0';--第三档时,第二位的小数点点亮ELSEDP<='1';--不符合上述三档时,小数点全部消隐ENDIF;ENDPROCESS;endBehavioral;编写完成后保存编译生成图形文件符号如图:再编写用于数码管扫描显示的的位选信号生成文件,其代码如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityCTRLSisPort(CLK:inSTD_LOGIC;SEL:outSTD_LOGIC_VECTOR(2downto0));endCTRLS;architectureBehavioralofCTRLSisSIGNALCNT:STD_LOGIC_VECTOR(2DOWNTO0):="000";begin PROCESS(CLK)ISBEGINIFCLK'EVENTANDCLK='1'THEN--接入1KHZ的时钟信号,使CNT进行循环计数,从000到101IFCNT=”101”THENCNT<=”000”;--计满则清零,不满则加一ELSECNT<=CNT+’1’;ENDIF;ENDIF;ENDPROCESS;SEL<=CNT;--将CNT信号赋给SEL输出endBehavioral;文件编写完成后保存编译生成图形文件符号如图:再编写使高位无意义零自动消隐功能的的文件,源程序代码如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityDSELEisPort(DP1:INSTD_LOGIC;DP2:INSTD_LOGIC;DIN:inSTD_LOGIC_VECTOR(23downto0);QOU:outSTD_LOGIC_VECTOR(23downto0));endDSELE;architectureBehavioralofDSELEisbeginPROCESS(DP1,DP2,DIN)ISBEGINIFDP1='0'ANDDP2='1'THENIFDIN(23DOWNTO20)="0000"THENQOU(23DOWNTO20)<="1111";QOU(19DOWNTO0)<=DIN(19DOWNTO0);ENDIF;IFDIN(23DOWNTO20)="0000"ANDDIN(19DOWNTO16)="0000"THENQOU(23DOWNTO20)<="1111";QOU(19DOWNTO16)<="1111";QOU(15DOWNTO0)<=DIN(15DOWNTO0);ENDIF;ENDIF;IFDP1='1'ANDDP2='0'THENIFDIN(23DOWNTO20)="0000"THENQOU(23DOWNTO20)<="1111";QOU(19DOWNTO0)<=DIN(19DOWNTO0);ENDIF;IFDIN(23DOWNTO20)="0000"ANDDIN(19DOWNTO16)="0000"THENQOU(23DOWNTO20)<="1111"; QOU(19DOWNTO16)<="1111";QOU(15DOWNTO0)<=DIN(15DOWNTO0);ENDIF;IFDIN(23DOWNTO20)="0000"ANDDIN(19DOWNTO16)="0000"ANDDIN(15DOWNTO12)="0000"THENQOU(23DOWNTO20)<="1111";QOU(19DOWNTO16)<="1111";QOU(15DOWNTO12)<="1111";QOU(11DOWNTO0)<=DIN(11DOWNTO0);ENDIF;ENDIF;IFDP1='1'ANDDP2='1'THENIFDIN(23DOWNTO20)="0000"THENQOU(23DOWNTO20)<="1111";QOU(19DOWNTO0)<=DIN(19DOWNTO0);ENDIF;IFDIN(23DOWNTO20)="0000"ANDDIN(19DOWNTO16)="0000"THENQOU(23DOWNTO20)<="1111";QOU(19DOWNTO16)<="1111";QOU(15DOWNTO0)<=DIN(15DOWNTO0);ENDIF;IFDIN(23DOWNTO20)="0000"ANDDIN(19DOWNTO16)="0000"ANDDIN(15DOWNTO12)="0000"THENQOU(23DOWNTO20)<="1111";QOU(19DOWNTO16)<="1111";QOU(15DOWNTO12)<="1111";QOU(11DOWNTO0)<=DIN(11DOWNTO0);ENDIF;IFDIN(23DOWNTO20)="0000"ANDDIN(19DOWNTO16)="0000"ANDDIN(15DOWNTO12)="0000"ANDDIN(11DOWNTO8)="0000"THENQOU(23DOWNTO20)<="1111";QOU(19DOWNTO16)<="1111";QOU(15DOWNTO12)<="1111";QOU(11DOWNTO8)<="1111";QOU(7DOWNTO0)<=DIN(7DOWNTO0);ENDIF;ENDIF;ENDPROCESS;endBehavioral;该段代码的编写的主要原理是首先判断小数点的位置,然后对小数点前的高位数从高到低依次进行判断,如果高位为零则将数据取反,在后续译码中将不再显示,从而实现高位无意义零的自动消隐。代码编写完成后保存编译生成图形文件符号如上图:然后我们编写数据显示输出文件,代码如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL; entityDISPLAY1isPort(SEL:inSTD_LOGIC_VECTOR(2downto0);OVERIN:INSTD_LOGIC;DATAIN:inSTD_LOGIC_VECTOR(23downto0);SEG:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDDISPLAY1;architectureBehavioralofDISPLAY1isSIGNALDATA:STD_LOGIC_VECTOR(3DOWNTO0):="0000";BEGINPROCESS(SEL,OVERIN)ISBEGINCASESELIS--对位选信号进行判断,对应每一位分别提取数据中的不同位置的数据赋给中间信号DATAWHEN"000"=>DATA<=DATAIN(3DOWNTO0);WHEN"001"=>DATA<=DATAIN(7DOWNTO4);WHEN"010"=>DATA<=DATAIN(11DOWNTO8);WHEN"011"=>DATA<=DATAIN(15DOWNTO12);WHEN"100"=>DATA<=DATAIN(19DOWNTO16);WHEN"101"=>DATA<=DATAIN(23DOWNTO20);WHENOTHERS=>DATA<="0000";ENDCASE;CASEDATAIS--对中间信号DATA进行译码,SEG为数码管的数据显示输出,从而使不同位置上有不同的数字显示WHEN"0000"=>SEG<="1000000";WHEN"0001"=>SEG<="1111001";WHEN"0010"=>SEG<="0100100";WHEN"0011"=>SEG<="0110000";WHEN"0100"=>SEG<="0011001";WHEN"0101"=>SEG<="0010010";WHEN"0110"=>SEG<="0000010";WHEN"0111"=>SEG<="1111000";WHEN"1000"=>SEG<="0000000";WHEN"1001"=>SEG<="0010000";WHENOTHERS=>SEG<="1111111";ENDCASE;ifOVERIN='1'THEN--判断溢出,若溢出则令输出全部不显示SEG<="1111111";ENDIF;ENDPROCESS;endBehavioral;代码编写完成后保存编译生成图形文件符号如图:建立该模块的顶层图形文件DISPLAY.sch,按照下图连接各元件,保存编译生成图形文件符号如下图: 该模块的输入数据量太大难以仿真,故这里只对其中的扫描信号生成文件进行仿真,仿真文件代码如下:LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.all;USEieee.numeric_std.ALL;ENTITYTBCTRLS_vhdISENDTBCTRLS_vhd;ARCHITECTUREbehaviorOFTBCTRLS_vhdISCOMPONENTCTRLSPORT(CLK:INstd_logic;SEL:OUTstd_logic_vector(2downto0));ENDCOMPONENT;SIGNALCLK:std_logic:='0';SIGNALSEL:std_logic_vector(2downto0);BEGINuut:CTRLSPORTMAP(CLK=>CLK,SEL=>SEL);tb:PROCESSBEGINCLK<='0';WAITFOR100NS;CLK<='1';WAITFOR100NS;ENDPROCESS;END;结果如下: 有仿真结果我们可以看出程序运行正常,逻辑上没有任何问题。至此所有的单元电路全部完成。三、设计实现1、顶层文件:创建图形文件FRYALL.sch,按照下图连接各模块生成的图形文件符号,完成后保存编译。2、管脚分配:由系统的顶层文件可以看到该系统的输入端共有5个,输出端有11个,管脚分配文件FRYALL.ucf如下:NET"CLKIN"LOC=T8;NET"DCLK"LOC=C16;NET"DP"LOC=C11;NET"NECT"LOC=D7;NET"SE1"LOC=L6;NET"SE10"LOC=N5;NET"SE100"LOC=L7;NET"SEG<0>"LOC=B14;NET"SEG<1>"LOC=A13;NET"SEG<2>"LOC=C13;NET"SEG<3>"LOC=C12;NET"SEG<4>"LOC=A12;NET"SEG<5>"LOC=B12;NET"SEG<6>"LOC=A11;NET"SEL<0>"LOC=F8;NET"SEL<1>"LOC=D8;NET"SEL<2>"LOC=E7; 3、下载过程:光标移至【GenerateProgramingFile】后单击鼠标右键,然后单击【Properties】在打开的对话框的左侧栏选中【ConfigurationOptions】将右侧的UnusedIOBPins这一项改为PullUp,单击OK。在界面的左下角双击【GenerateProgramingFile】,软件将自动对整个系统进行编译并生成可执行文件FRYALL.bit。将弹出的对话框关掉,双击【GenerateProm,ACE,orJTAGFile】在弹出的对话框中点击Finish,在随后出现的对话框中选择FRYALL.bit,然后点击打开,在随后的对话框中点击Bypass。右键单击左边图标选择Program,在随后的对话框中单击OK,文件将自动下载到开发板上,成功后,接入函数发生器进行测试。四、测试结果及结论经过了前三步,最后我们将所完成的工程下载到了板子上,连接好函数发生器,并设定好了函数发生器的输出信号电平(5Vpp),就可以进行使用了。最后结果显示程序工作正常,读数清晰稳定,完全符合开始时的要求。误差分析:我将函数发生器的频率调节到999,999HZ时,频率计不显示,即产生了计数溢出,然后我进行了进一步的调节,将函数发生器的频率调节到999,997时读书显示为999.999,单位为KHZ。由此可知相对误差为±0.0002%,误差很小。所以本次实验圆满成功。通过对数字频率计的设计实现,我深入的学习了ise软件的使用,VHDL语言的编写规范,语法结构等。在本次试验中我回顾了在《数字电路》课程中学过的关于数字电路的设计的部分,了解了VHDL和Verilog语言的区别与联系,以及它们的优缺点,以及它们主要针对的设计对象。我觉得我通过本次试验学会了很多。袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭