数字频率计设计报告书一、设计要求设计一个4位十进制数字式频率计,最大测量范围为10MHz。量程分10kHz、100kHz、1MHz和10MHz四档(最大读数分别为9.999kHz、99.99kHz、999.9kHz、9999.kHz).量程自动转换规则如下:(1)当读数大于9999时,频率计处于超量程状态,此时显示器发出溢出指示,下一次测量时,量程自动增大一档,小数点位置随量程变更自动移位。(2)可用手动方式使量程在每次测量开始时处于最低档。显示方式如下:(3)采用记忆显示方式,即计数过程中不显示数据,待计数过程结束以后,显示计数结果,将此显示结果保持到下一次计数结束。显示时间应不小于1s。(4)送入信号应是符合CMOS电路要求的脉冲波,对于小信号模拟信号应有放大整形电路。二、方案设计<1>整体思路所谓频率就是周期性信号在单位时间(1s)内变化的次数。若在一定时间间隔T内测得周期性信号的重复变化次数为N,则频率可表示为f=N/T(Hz)。被测信号fx经放大整形电路变成计数电路所要求的脉冲信号,其频率与被测信号fx的频率相同。基准电路提供标准时间基准信号clk,其高电平持续时间t1=1s,当1s信号来到时,闸门电路开通,被测脉冲信号通过闸门电路,成为计数电路的计数脉冲CP,计数电路开始计数,直到ls信号结束时闸门电路关闭,停止计数。若在闸门时间1s内计数电路计得的脉冲个数为N,则被测信号频率f=NHz。控制电路的作用有两个:一是产生锁存脉冲CLK,使显示电路上的数字稳定;二是产生清“0”脉冲,使计数电路每次测量从零开始计数。<2>时钟信号的选择设计电路中时钟信号采用12M有源晶振产生,下面是12M有源晶振引脚图:<3>整形电路的选择整形电路中可以用运算放大器LM311组成电压选择器实现,以下是关于此芯片的资料:引脚功能:GROUND/GND接地INPUT+正向输入端INPUT-反向输入端OUTPUT输出端BALANCE平衡BALANCE/STROBE平衡/选通V+电源正V-电源负NC空脚LM311引脚图由于LM311过于复杂且此次设计要求精度不高,整形电路可以改为如下电路:R11.0kD1BAS81D2BAS81这样产生稳定3.3V为幅值的信号送入EPM570中,对芯片起到保护作用。<3>设计所用核心芯片资料及其原理所用核心芯片为CPLD器件EPM570T100C5。基本设计方法是借助集成开发软件平台quartusII6.0,用原理图、硬件描述语言(VerilogHDL)等方法,生成相应的目标文件,通过下载电缆(“在系统”编程)将代码传送到目标芯片中,实现设计的数字系统。EPM570引脚图:待测信号输出在QuartusII6.0中设定的引脚分布如下:<4>计数译码原理图:<5>分频选择器原理图:千位计数器百位计数器十位计数器个位计数器进位进位进位锁存器千位译码器百位译码器十位译码器个位译码器四位共阴极数码管小数点位置<6>数码管引脚图:通过VerilogHDL语言设计程序,实现上述原理图功能,最终所测信号频率以四位共阴极数码管显示,单位为KHz。6MHz转1Hz分频计时钟信号待测信号10/100/1000分频选择器小数点移位小数点位置多位计数器三、调试1、按照分频计、计数器、锁存器、选择器、译码器模块分别进行编程调试、仿真;2、建立工程,把五个模块连接,调试。针对错误模块进行修改,重新建立工程、连接模块;3、将程序下载到EMP570中,利用数电实验板以及数码管进行调试;4、将各种器件焊接到万用板上,连接电源进行实际调试。程序代码1.modulessss(b,base);inputb;outputregbase;reg[23:0]q;always@(posedgeb)if(q<5999999)q<=q+1;elsebeginbase<=!base;q<=0;endEndmodule2moduleFen6M(b,base);inputb;outputregbase;reg[23:0]q;always@(posedgeb)if(q<5999999)q<=q+1;elsebeginbase<=!base;q<=0;endEndmodule3.modulectrl(clk,Counter_EN,Latch_EN,Counter_Clr);inputclk;outputCounter_EN,Latch_EN,Counter_Clr;regwire_1=0,wire_2=0;always@(posedgeclk)beginwire_1<=!wire_1;endalways@(negedgeclk)beginwire_2<=wire_1;endassignCounter_EN=wire_1;assignLatch_EN=(!Counter_EN)&wire_2;assignCounter_Clr=(!Counter_EN)&(!Latch_EN)&(!wire_2);endmodule4.modulecounter(clk,clr,en,q,ql);inputclk,en,clr;outputreg[3:0]q;outputql;assignql=en&(q==9);always@(posedgeclk,posedgeclr)if(clr)q...