-1-数字频率计班级:08(5)姓名:陈实学号:0708051518日期:2010-12-22-2-摘要:本设计给出了用VHDL语言实现1—10KHz的频率计数器方案,显示四位十进制测量结果。包括:分频模块,时基产生与测评时序控制电路模块,待测信号脉冲计数电路,锁存与译码显示控制电路。分频模块产生用于时序控制的基础时钟,和用于控制数码管显示的时钟。时基产生与测评时序控制电路模块产生计数清零、频率计数使能、计数完成锁存等控制信号,脉冲计数模块在计数使能信号控制下进行脉冲计数,1s中所记脉冲数即为待测信号频率,译码控制模块在锁存信号控制下直接输出控制二极管显示的信号。该系统可对直接输入的1—10KHz信号进行测试,响应时间≤2S,并在测量结束后数码管上显示测试信号频率,显示时间≥2S,保存到下一次测量结束为止。关键词:VHDL语言、分频、时基控制、待测信号脉冲计数电路、锁存与译码显示。-3-目录摘要·······························2一、方案设计与论证···················4二、系统电路设计····················5(一)系统总体框图··············5(二)系统各模块功能的实现······51.分频模块功能的实现2.时基控制模块实现3.频率计数模块实现(1)模十计数器(2)四位十进制计数4.锁存与译码显示模块实现三、仿真与测试分析··················13四、设计总结························14五、附件····························14完整电路图···············14完整程序代码·············15参考文献·················22-4-一、方案设计与论证(一)、分频电路模块:方案一:计数分频,分别产生1Hz、50Hz、1000Hz、10KHz四种时钟信号控制时基电路的使能与清零、锁存与译码显示电路,周期测量电路,该方案要实现多个分频,相对繁琐。方案二:两次分频产生10KHz信号,第一次2500分频,得到20KHz信号,再二分频得到稳定的10KHz方波。能够实现方案二中要求同时更加精确。(二)、时基产生与测评控制电路模块:方案一:依次输出清零、清零结束使能、使能结束锁存,使能大于1S时,所得到的计数值要转变后才能得到频率值,若是二进制计数,容易转变,但不易过渡到BCD码控制输出显示;若BCD码计数,不易转变。方案二:对分频模块基础时钟计时,到相应时间依次输出清零、使能、锁存信号,保证各功能依次实现互不干扰,使能1S,所得到的计数值即为频率。(三)、待测信号脉冲计数电路模块:方案一:二进制计数,得到的频率值转化成BCD码,控制锁存与译码电路显示。由于频率较大,二进制位数多达13位左右,转化成BCD码相对复杂,可行度低。方案二:四个十进制计数器串联计数,实现4位十进制输出,当地位的十进制计数器进位时,高一位的计数器累加1,直接读得-5-十进制的频率值,易于控制数码管显示。(四)、锁存与译码显示模块:方案一:将接受到的BCD码转换成控制数码管显示得信号,并在锁定信号到来时控制数码管显示,转换繁琐,但不能实现输出稳定的显示信号,不能满足设计要求。方案二:根据内部储存的数值,输出待测信号的频率值,并保存到下一次锁定信号到来接收新的频率值,根据锁定信号来接受外部传输的频率数据并锁存,保持输出控制数码管显示信号,知道下次接受才改变。二、系统电路设计(一)、系统框图(二)、系统各模块功能的实现1.分频模块功能的实现输入50MHz,输出cp端为10KHz-6-ss为待测频率。为了测试该设计的功能,由于外部无已知的输入待测信号,所以也有分屏产生待测的信号。代码:dividefreENTITYdividefreISPORT(cp_50M:INstd_logic;cp:OUTstd_logic;--10khzss:OUTstd_logic);ENDENTITY;ARCHITECTUREbehaviorOFdividefreISsignaltout1:std_logic_vector(11downto0);--count2500signaltout2:std_logic_vector(5downto0);--count2signalcp_1:std_logic;BEGINPROCESS(cp_50M)BEGINIF(cp_50M'eventandcp_50M='1')THENif(tout1=100111000011)thentout1=000000000000;cp_1='1';elsetout1=tout1+1;cp_1='0';endif;ENDIF;ENDPROCESS;PROCESS(cp_1)BEGINIF(cp_1'eventandcp_1='1')THENtout2=tout2+1;ENDIF;cp=tout2(0);ss=tout2(3);ENDPROCESS;ENDbehavior;-7-2.时基控制模块实现:输入10KHz信号;输出clr:清零;en:使能;lock:锁定。代码:timecontrolENTITYtimecontrolISPORT(clk:instd_logic;--10khzclr:bufferstd_logic;en:bufferstd_logic;lock:bufferstd_logic);ENDENTITY;ARCHITECTUREbehaveOFtimecontrolISsignalcount:std_logic_vector(13downto0);beginPROCESS(clk)beginif(clk'eventandclk='1')thenif(count=10111001111100)thencount=00000000000000;clr='1';en='0';lock='0';--11900elsif(count=00000011001000)thencount=count+1;clr='0';en='0';lock='0';--200elsif(count=00001100100000)thencount=count+1;clr='1';en='0';lock='0';--800elsif(count=00001111101000)thencount=count+1;clr='1';en='1';lock='0';--1000elsif(count=10101011111000)thencount=count+1;clr='1';en='0';lock='0';--11000elsif(count=10101111000000)thencount=count+1;clr='1';en='0';lock='1';--11200elsif(count=10111000011000)thencount=count+1;clr='1';en='0';lock='0';--11800-8-elsecount=count+1;clr=clr;en=en;lock=lock;endif;endif;endprocess;ENDbehave;3.频率计数模块实现:(1)模十计数器:ci:使能;nrest:清零;clk:计数脉冲。co:进位。qcnt:BCD码对应计数值。代码:cntm10ENTITYcntm10isport(ci:instd_logic;nreset:instd_logic;clk:instd_logic;co:outstd_logic;qcnt:bufferstd_logic_vector(3downto0));endcntm10;architecturebehaveofcntm10isbeginprocess(clk,nreset)beginif(nreset='0')thenqcnt=0000;elsif(clk'eventandclk='1')thenif(ci='1')thenif(qcnt=9)thenqcnt=0000;co='1';elseqcnt=qcnt+1;-9-co='0';endif;endif;endif;endprocess;endbehave;(2)四位十进制计数:四个十进制计数器串联,clr、en是共同控制端,clk从最低位输入开始计数。得到输出的四位十进制数(BCD码)。代码:frequtestENTITYfrequtestISPORT(ss:instd_logic;--inclk:instd_logic;--10khzclr:instd_logic;--set0en:instd_logic;--2miniteq3,q2,q1,q0:outstd_logic_vector(3downto0));ENDENTITY;architecturebehaveoffrequtestiscomponentcntm10port(ci:instd_logic;-10-nreset:instd_logic;clk:instd_logic;co:outstd_logic;qcnt:bufferstd_logic_vector(3downto0));endcomponent;signalco1,co2,co3,co4:std_logic;BEGINu0:cntm10portmap(en,clr,ss,co1,q0);u1:cntm10portmap(en,clr,co1,co2,q1);u2:cntm10portmap(en,clr,co2,co3,q2);u3:cntm10portmap(en,clr,co3,co4,q3);endbehave;4.锁存与译码显示模块实现:cp为扫频的10KHz脉冲,lock是锁存信号,q对应四位要显示得值。Seg为显示得段码,scan为控制的显示位使屏幕动态改变。代码:displayENTITYdisplayISPORT(cp:INstd_logic;--10khzlock:INstd_logic;q3,q2,q1,q0:instd_logic_vector(3downto0);seg:OUTstd_logic_vector(6downto0);scan:OUTstd_logic_vector(3downto0));ENDdisplay;ARCHITECTUREbehaviorOFdisplayISSIGNALstate:integerrange0to3;-11-SIGNALsel:std_logic_vector(3downto0);signalp0,p1,p2,p3:std_logic_vector(3downto0);BEGINprocess(lock)beginif(lock'eventandlock='1')thenp0=q0;p1=q1;p2=q2;p3=q3;endif;endprocess;PROCESS(cp)BEGINIF(cp'eventandcp='1')THENifstate=3thenstate=0;elsestate=state+1;endif;ENDIF;ENDPROCESS;PROCESS(state)BEGINCASEstateISwhen0=sel=1110;when1=sel=1101;when2=sel=1011;when3=sel=0111;ENDCASE;ENDPROCESS;PROCESS(sel,p0,p1,p2,p3)BEGINif(sel(0)='0')thencasep0iswhen0000=seg=1111110;when0001=seg=0110000;when0010=seg=1101101;when0011=seg=1111001;when0100=seg=011