西北师范大学知行学院EDA课程设计说明书系别专业班级学生姓名学号指导教师量程自动转换数字频率计的设计一、设计目标:A.设计一个3位十进制数字式频率计,其测量范围为1MHz,量程分10kHz,100kHz和1MHz三档(最大读数分别为9.99kHz,99.9kHz,999kHz)。被测信号应是一符合CMOS电路要求的脉冲或正弦波。B.要求量程可根据被测量的频率大小自动转换,即当计数器溢出时,产生一个换挡信号,让整个计数时间减少为原来的1/10,从而实现换挡功能。C.要求实现溢出报警功能,即当频率高于999kHz时,产生一个报警信号,点亮LED灯,从而实现溢出报警功能。D.小数点位置随量程变化自动移位。E.采用记忆显示方式,即计数过程中不显示数据,待计数过程结束后,显示计数结果,并将此显示结果保持到下一次计数结束。显示时间应不小于1秒。二、设计思路及实现方案:1.频率计的工作原理:常用的测量频率的方法有两种,一种是测周期法,一种是测频率法。测周期法需要有基准系统时钟频率Fs,在待测信号一个周期Tx内,记录基准系统时钟频率的周期数Ns,则被测频率可表示为:Fx=Fs/Ns测频率法就是在一定时间间隔Tw(该时间定义为闸门时间)内,测得这个周期性信号的重复变换次数为Nx,则其频率可表示为:Fx=Nx/Tw本设计采用的是直接测频率的方法。2.频率计的原理框图:频率计的系统设计可分为3位十进制计数模块,闸门控制模块,译码显示模块,可自动换挡模块和分频模块。其原理框图如下:→其中,可自动换挡模块为闸门控制模块提供3个挡,也就是三个测量范围的基准时钟信分频模块可自动换挡模块闸门控制模块3位十进制计数模块译码显示模块号,通过计数器的最高位的溢出情况来判定工作在第几挡。闸门控制模块根据基准时钟信号产生基准时钟信号周期2倍的周期使能信号,随后为锁存器产生一周期性地锁存信号,再然后为计数模块产生一周期性的清零信号。3位十进制计数模块在使能信号和清零信号的控制下对被测信号的波形变化进行计数,若产生溢出则为自动换挡模块输出一换挡信号。译码显示模块显示被测信号的频率。三、设计步骤1.分频模块:输入信号为4MHZ的高频脉冲,经过分频器后得到1KHZ的脉冲。分频器的代码如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityfenping2isport(clk:instd_logic;clk_out:outstd_logic);endfenping2;architecturebehavioroffenping2isbeginprocess(clk)variablecount:integerrange0to1999;variablex:std_logic;beginifclk'eventandclk='1'thenifcount1999thencount:=count+1;elsecount:=0;x:=notx;endif;endif;clk_out=x;endprocess;endarchitecturebehavior;模块说明:clk为4MHZ时钟脉冲输入端,clk_out为1KHZ脉冲输出端。由于输入为高频信号,不易仿真且代码编译无误,这里没有给出时序波形图。经软件编译后,得到模块为:2.3位十进制计数模块:3位十进制计数模块包含3个级联十进制计数器,用来对施加到时钟脉冲输入端的待测信号产生的脉冲进行计数,十进制计数器具有计数使能、清零控制和进位输出功能。用于计数的时间间隔(计数允许周期T)由闸门控制模块的控制信号发生器所产生的使能信号来控制,计数使能信号也在闸门控制模块中产生。自动换挡模块决定计数器读数的单位。1位十进制计数器的VHDL源程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitycount10isport(CLK,RST,EN:instd_logic;CQ:outstd_logic_vector(3downto0);COUNT:outstd_logic);endcount10;architecturebehavofcount10isbeginprocess(CLK,RST,EN)variableCQ1:std_logic_vector(3downto0);beginifRST='1'thenCQ1:=(others='0');elsifCLK'eventandCLK='1'thenifEN='1'thenifCQ19thenCQ1:=CQ1+1;elseCQ1:=(others='0');endif;endif;endif;ifCQ1=9thenCOUNT='1';elseCOUNT='0';endif;CQ=CQ1;endprocess;endbehav;以上源程序编译成功后,生成计数器模块如下:3位十进制计数模块为:3.闸门控制模块:以基准信号的周期为一秒为例,频率测量的基本原理是计算一秒内待测信号的脉冲个数,这就要求能产生一个周期为2秒,占空比为50%的周期信号TSTEN。用这个信号作为计数器的EN输入端,使其计数时间正好为1秒。当TSTEN为高电平时,计数开始,低电平时,计数停止。在计数器停止期间,首先要产生一个锁存信号LOAD,用其上升沿控制锁存器REG12将之前的计数结果存入锁存器中,并由显示模块将其显示出来。设置锁存器是为了让显示稳定,不会因为周期性的清零信号使得数值不断闪烁。锁存之后需有一清零信号CLR_CNT将计数器清零,为下一秒的计数操作做准备。闸门控制模块的VHDL源程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitytestctlisport(clk:instd_logic;clr_cnt:outstd_logic;tsten:outstd_logic;load:outstd_logic);endtestctl;architecturebehavoftestctlissignala:std_logic;beginprocess(clk)beginifclk'eventandclk='1'thena=nota;endif;endprocess;process(clk,a)ifa='0'andclk='0'thenclr_cnt='1';elseclr_cnt='0';endif;endprocess;load=nota;tsten=a;endbehav;时序仿真结果如下:编译后生成的模块为:其中,clk为基准信号输入端,clr_cnt为清零信号,tsten为计数使能信号,load为锁存允许信号。3.可自动换挡模块:本设计通过控制基准时钟信号来实现量程的自动转换。在第一个计数器的CLK端接一周期为0.001s(1KHz)的时钟信号,其测量范围为100-999000Hz,为2挡;在第一个计数器的COUNT端将会得到周期为0.01s的信号,即为1挡,其测量范围为10-99900Hz;在第二个计数器的COUNT端将会得到0.1s的信号,即为0挡,其测量范围为0-9990Hz。这里还需要一个3选1选择器来选择第几个计数器的COUNT端作为基准时钟信号。3选1选择器可根据3位十进制计数模块的溢出情况来作为选择标准。3选1选择器的VHDL源程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitymux31isport(a:instd_logic_vector(3downto0);y:outstd_logic;o:outstd_logic;input0:instd_logic;input1:instd_logic;input2:instd_logic;);endmux31;architecturebehavofmux31isbeginprocess(input0,input1,input2,a)begincaseaiswhen0000=y=input0;o=’0’;when0001=y=input1;o=’0’;when0010=y=input2;o=’0’;whenothers=y='0';o='1';endcase;endprocess;endbehav;生成的模块为:仿真波形为:当输入为0000时:当输入为0001时:当输入为0010时:当输入为0011时:可以看到,设计完全符合要求,o端可以作为量程溢出标志。综上,量程自动转换模块为:4.译码显示模块:译码显示模块的设计分为显示锁存器的设计,七段数码显示译码器的设计和小数点显示模块的设计3部分。显示锁存器是在计数结束后,利用load信号的上升沿把最新计数结果保存起来。其源程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityreg12isport(load:instd_logic;din0,din1,din2:instd_logic_vector(3downto0);dout0,dout1,dout2:outstd_logic_vector(3downto0));endreg12;architecturebehavofreg12isbeginprocess(load)beginifload'eventandload='1'thendout0=din0;dout1=din1;dout2=din2;endif;endprocess;endarchitecturebehav;生成的模块为:仿真结果为:七段数码显示译码器的vhdl源程序如下:libraryieee;useieee.std_logic_1164.all;entityseg7isport(dat:instd_logic_vector(3downto0);tmp:outstd_logic_vector(6downto0));endseg7;architecturearcofseg7isbeginprocess(dat)begincasedatiswhen0000=tmp=0000001;when0001=tmp=1001111;when0010=tmp=0010010;when0011=tmp=0000110;when0100=tmp=1001100;when0101=tmp=0100100;when0110=tmp=0100000;when0111=tmp=0001111;when1000=tmp=0000000;when1001=tmp=0000100;when1010=tmp=0001000;when1011=tmp=1100000;when1100=tmp=0110001;when1101=tmp=1000010;when1110=tmp=0110000;when1111=tmp=0111000;endcase;endprocess;endarc;生成的模块为:小数点显示模块的源程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydotisport(dang_in:instd_logic_vector(3downto0);dang:outstd_logic_vector(2downto0));enddot;architectureoneofdotisbeginprocess(dang_in)begincasedang_iniswhen0000=da