八位十六进制频率计设计摘要频率计又称为频率计数器,是一种专门对被测信号频率进行测量的电子测量仪器。可用来测量频率、时间、周期、计数。该设计是利用VHDL语言实现频率计的功能,频率计主要由四个模块构成:计数模块、锁存模块显示模块以及控制模块。对各个部分的设计思路、对各部分电路设计方案的选择、元器件的筛选、以及对它们的调试、对调试结果的分析,最后得到实验结果的方方面面。关键字:频率计、VHDL、元件例化。AbstractFrequencymeteriscalledforfrequencycounter,whichisaspecializedmeasuringdevicetobeusedformeasuringmeasuredsignalfrequency.Itcanbeusedtomeasurefrequency,time,period,counting.ThelayoutmakeuseofVHDLlanguagetocometruethefunctionoffrequencymeter,itismadeupoffourblockswhicharecountingblock,registeringblock,showingblockandcurbingblock.Thinking,electriccircuitprojectdesign,componentscreen,shakedowntestandanalysingresultofeverypart,finallygettingallaspectsofexperimentingresult.Key:frequencymeter,VHDL,component.1一.原理八位十六进制频率计是由TFCTRL的计数使能信号CNT_EN能产生一个1秒脉宽的周期信号,并对频率计中的32位二进制计数器COUNTER32B的ENABL使能进行同步控制。当CNT_EN高电平时允许计数;低电平时停止计数,并保持其所计的脉冲数。在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前一秒钟的计数值锁存进各锁存器REG32B中,并由八位十六进制7段译码器译出,显示计数值。设置锁存器的好处是数据显示稳定,不会由于周期性的清零信号而不断闪烁。锁存信号后,必须有清零信号RST_CNT对计数器进行清零,为下一秒的计数操作作准备。二.方案论证用VHDL设计电路系统,可以把任何复杂的电路系统视为一个模块,对应一个设计实体。在VHDL层次化设计中,它所设计的模块既可以是顶层实体,又可以是较低层实体,但对不同层次模块应选择不同的描述方法。在系统的底层设计中,采用VHDL进行描述,由于其对系统很强的行为描述能力,可以不必使系统层层细化,从而避开具体的器件结构,从逻辑行为上直接对模块进行描述和设计,之后,EDA软件中的VHDL综合器将自动将程序综合成为具体FPGA/CPLD等目标芯片的网表文件,无疑可使设计大为简化。VHDL特点:1.能形式化地抽象表示电路的行为和结构;2.支持逻辑设计中层次与范围地描述;23.可借用高级语言地精巧结构来简化电路行为和结构;具有电路仿真与验证机制以保证设计的正确性;4.支持电路描述由高层到低层的综合转换;5.硬件描述和实现工艺无关;6.便于文档管理7.易于理解和设计重用总体框图三.各模块的实现和功能仿真1、测频控制模块设计频率计的关键是设计一个测频率控制信号发生器,产生测量频率的控制时序。控制时钟信号clk1取为1Hz,2分频后即可查声一个脉宽为1秒的时钟cnt-en,一此作为计数闸门信号。当cnt-en为高电平时,允许计数;当cnt-en由高电平变为低电平(下降沿到来)时,应控制模块计数模块锁存模块显示模块CLKfinout3产生一个锁存信号,将计数值保存起来;锁存数据后,还要在下次cnt-en上升沿到来之前产生零信号rst_en,将计数器清零,为下次计数作准备。程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYFIC1ISPORT(CLK1:INSTD_LOGIC;CNT:OUTSTD_LOGIC;RST:OUTSTD_LOGIC;LOAD:OUTSTD_LOGIC);ENDFIC1;ARCHITECTUREoneOFFIC1ISSIGNALM:STD_LOGIC;BEGINPROCESS(CLK1)BEGINIFCLK1'EVENTANDCLK1='1'THENM=NOTM;ENDIF;ENDPROCESS;PROCESS(CLK1,M)BEGINIFCLK1='0'ANDM='0'THENRST='1';ELSERST='0';ENDIF;4ENDPROCESS;LOAD=NOTM;CNT=M;ENDone;仿真结果:2.计数模块计数器以待测信号作为时钟,清零信号rst到来时,异步清零;cnt-en为高电平时开始计数。计数是以十进制数显示,本文设计了一个简单的10kHz以内信号的频率机计,如果需要测试较高的频率信号,则将cout的输出位数增加,当然锁存器的位数也要增加。程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT32ISPORT(CLR:INSTD_LOGIC;EN:INSTD_LOGIC;FIN:INSTD_LOGIC;5COUT:OUTSTD_LOGIC_VECTOR(31DOWNTO0));ENDCNT32;ARCHITECTUREtwoOFCNT32ISSIGNALCQI:STD_LOGIC_VECTOR(31DOWNTO0);BEGINPROCESS(CLR,EN,FIN)BEGINIFCLR='1'THENCQI=(OTHERS='0');ELSIFFIN'EVENTANDFIN='1'THENIFEN='1'THENCQI=CQI+1;ENDIF;ENDIF;ENDPROCESS;COUT=CQI;ENDtwo;仿真结果:3、锁存模块当cnt-en下降沿到来时,将计数器的计数值锁存,这样可由外部的七段译码器译码并在数码管显示。设置锁存器的好处是显示的数据稳定,不会由于周期性的清零信号而不断闪烁。锁存器的位数应跟计数器完全一样。程序:LIBRARYIEEE;6USEIEEE.STD_LOGIC_1164.ALL;ENTITYREG32AISPORT(LK:INSTD_LOGIC;DIN:INSTD_LOGIC_VECTOR(31DOWNTO0);DOUT:OUTSTD_LOGIC_VECTOR(31DOWNTO0));ENDREG32A;ARCHITECTUREthreeOFREG32AISBEGINPROCESS(LK,DIN)BEGINIFLK'EVENTANDLK='1'THENDOUT=DIN;ENDIF;ENDPROCESS;ENDthree;仿真结果:4.显示模块在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前一秒钟的计数值锁存进各锁存器REG32B中,并由八位十六进制7段译码器译出,显示计数值。程序:LIBRARYIEEE;7USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDECL7SISPORT(Q:INSTD_LOGIC_VECTOR(31DOWNTO0);LED7S1,LED7S2,LED7S3,LED7S4,LED7S5,LED7S6,LED7S7,LED7S8:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDENTITYDECL7S;ARCHITECTUREfourOFDECL7SISBEGINPROCESS(Q)VARIABLEQ1:STD_LOGIC_VECTOR(3DOWNTO0);BEGINQ1:=Q(0)&Q(1)&Q(2)&Q(3);CASEQ1ISWHEN0000=LED7S1=0111111;WHEN0001=LED7S1=0000110;WHEN0010=LED7S1=1011011;WHEN0011=LED7S1=1001111;WHEN0100=LED7S1=1100110;WHEN0101=LED7S1=1101101;WHEN0110=LED7S1=1111101;WHEN0111=LED7S1=0000111;WHEN1000=LED7S1=1111111;WHEN1001=LED7S1=1101111;WHEN1010=LED7S1=1110111;WHEN1011=LED7S1=1111100;WHEN1100=LED7S1=0111001;WHEN1101=LED7S1=1011110;WHEN1110=LED7S1=1111011;8WHEN1111=LED7S1=1110001;WHENOTHERS=NULL;ENDCASE;ENDPROCESS;PROCESS(Q)VARIABLEQ2:STD_LOGIC_VECTOR(3DOWNTO0);BEGINQ2:=Q(4)&Q(5)&Q(6)&Q(7);CASEQ2ISWHEN0000=LED7S2=0111111;WHEN0001=LED7S2=0000110;WHEN0010=LED7S2=1011011;WHEN0011=LED7S2=1001111;WHEN0100=LED7S2=1100110;WHEN0101=LED7S2=1101101;WHEN0110=LED7S2=1111101;WHEN0111=LED7S2=0000111;WHEN1000=LED7S2=1111111;WHEN1001=LED7S2=1101111;WHEN1010=LED7S2=1110111;WHEN1011=LED7S2=1111100;WHEN1100=LED7S2=0111001;WHEN1101=LED7S2=1011110;WHEN1110=LED7S2=1111011;WHEN1111=LED7S2=1110001;WHENOTHERS=NULL;ENDCASE;ENDPROCESS;PROCESS(Q)VARIABLEQ3:STD_LOGIC_VECTOR(3DOWNTO0);9BEGINQ3:=Q(8)&Q(9)&Q(10)&Q(11);CASEQ3ISWHEN0000=LED7S3=0111111;WHEN0001=LED7S3=0000110;WHEN0010=LED7S3=1011011;WHEN0011=LED7S3=1001111;WHEN0100=LED7S3=1100110;WHEN0101=LED7S3=1101101;WHEN0110=LED7S3=1111101;WHEN0111=LED7S3=0000111;WHEN1000=LED7S3=1111111;WHEN1001=LED7S3=1101111;WHEN1010=LED7S3=1110111;WHEN1011=LED7S3=1111100;WHEN1100=LED7S3=0111001;WHEN1101=LED7S3=1011110;WHEN1110=LED7S3=1111011;WHEN1111=LED7S3=1110001;WHENOTHERS=NULL;ENDCASE;ENDPROCESS;PROCESS(Q)VARIABLEQ4:STD_LOGIC_VECTOR(3DOWNTO0);BEGINQ4:=Q(12)&Q(13)&Q(14)&Q(15);CASEQ4ISWHEN0000=LED7