1EDA课程设计报告名称:8位十进制频率计学号:姓名:年级专业:2011级电子信息工程学院:物电学院指导老师:日期:2014年6月2日安徽师范大学物理与电子信息学院CollegeofPhysicsandElectronicInformation,AnhuiNormalUniversity2目录一、设计目的···········································2二、设计要求···········································2三、设计思路···········································3四、设计原理···········································3五、设计仿真···········································3六、实验现象···········································4七、设计源码···········································4八、总结···············································9参考书目···············································9引言数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件教多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。随着现场可编程阵列FPGA的应用,以EDA工具作为开发手段,运用VHDL等硬件描述语言语言,将使整个系统大大简化,提高了系统的整体性能和可靠性。一、课程设计目的1)巩固和加深对“EDA技术”、“数字电子技术”的基本知识的理解,提高综合运用本课程所学知识的能力。2)培养学生根据课题需要选学参考书籍、查阅手册、图表和文献资料的自学能力。通过独立思考,深入钻研相关问题,学会自己分析解决问题的方法。3)培养硬件设计、软件设计及系统软、硬件调试的基本思路、方法和技巧,并能熟练使用当前较流行的一些有关电路设计与分析的软件和硬件。二、课程设计要求1)脉冲信号的频率就是在单位时间内所产生的脉冲个数,其表达式为,f为被3测信号的频率,N为计数器所累积的脉冲个数,T为产生N个脉冲所需的时间。所以,在1秒时间内计数器所记录的结果,就是被测信号的频率。2)被测频率信号取自实验箱晶体振荡器输出信号,加到主控室的输入端。3)再取晶体振荡器的另一标准频率信号,经分频后产生各种时基脉冲:1ms,10ms,0.1s,1s等,时基信号的选择可以控制,即量程可以改变。4)时基信号经控制电路产生闸门信号至主控门,只有在闸门信号采样期间内(时基信号的一个周期),输入信号才通过主控门。5)f=N/T,改变时基信号的周期T,即可得到不同的测频范围。6)当主控门关闭时,计数器停止计数,显示器显示记录结果,此时控制电路输出一个置零信号,将计数器和所有触发器复位,为新一次采样做好准备三、课程设计思路频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。这就要求TESTCTL的计数使能信号TSTEN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。当TSTEN高电平时,允许计数;低电平时,停止计数,并保持其所计的数。在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进32位锁存器REG32B中,并由外部的7段译码器译出并稳定显示。锁存信号之后,必须有一清零信号CLR_CNT对计数器进行清零,为下1秒钟的计数操作作准备。寄存器REG32B设计要求是:若已有32位BCD码存在于此模块的输入口,在信号LOAD的上升沿后即被锁存到寄存器REG32B内部,并由REG32B的输出端输出,然后由7段译码器译者成能在数码管上显示输出的相应数值。计数器CNT10设计要求:有一时钟使能输入端,用于锁定计数值。当高电平时计数允许,低电平时禁止计数。这次设计能通过实验箱下载验证,将第一全局时钟CLK接实验箱1Hz频率信号,第二全局时钟CLK2作为待测频率输入,输出接6个数码管显示所测的频率值。四、课程设计原理在电子技术中,频率是最基本得参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。测量频率的方法有很多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。数字式频率计的测量原理有两类:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法即周期法,如周期测频法。直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数器阀门的时间长短在达到不同的测量精度;间接测频法适用于低频信号的频率测量。本次设计中使用的就是直接测频法,即用计数器在计算机1S内输入信号周期的个数,其测频范围为1Hz~999999Hz。五、设计电路的顶层结构及仿真图这次设计有三个模块组成,测频控制信号发生器TESTCTL八个有时钟时能功能的十进制计数器CNT10和一个32位锁存器REG32B,如图:4顶层结构图测频控制信号发生器TESTCTL仿真效果图六、实验现象从时钟源TJ4~TJ6输入一方波信号,数码管则将显示该信号的频率值,输入信号频率范围为1Hz~100MHz,频率高时有误差。另外,可从GCLK2端输入外部数字信号,进行测量。七、设计源码十进制计数器CNT10程序:libraryieee;useieee.std_logic_1164.all;5entitycnt10isport(clk:instd_logic;clr:instd_logic;ena:instd_logic;cq:outintegerrange0to9;carry_out:outstd_logic);endcnt10;architecturebehavofcnt10issignalcqi:integerrange0to9;beginprocess(clr,clk,ena)beginif(clr='1')thencqi=0;elsif(clk'eventandclk='1')thenif(ena='1')thenif(cqi=9)thencqi=0;carry_out='1';elsecqi=cqi+1;carry_out='0';endif;endif;endif;endprocess;cq=cqi;endbehav;作用:实现十进制计数功能。当第一个CNT10计数输出CQ=9时,下一秒时钟上升沿到来时,将产生一个CARRY_OUT信号作为下一个CNT10的时钟信号,同时CQ清零。依次递推到8个CNT10。32位锁存器REG32B程序:libraryieee;useieee.std_logic_1164.all;entityreg32bisport(load:instd_logic;rst:instd_logic;din:instd_logic_vector(31downto0);dout:outstd_logic_vector(31downto0));endreg32b;architecturebehavofreg32bis6signaldata:std_logic_vector(31downto0);beginprocess(rst,load)beginifrst='1'thendata=(others='0');elsif(load'eventandload='1')thendata=din;endif;dout=data;endprocess;endbehav;实现方式:复位信号RST为高电平时复位,为低电平时LOAD信号上升沿到来时将对输入到内部的CNT10计数信号进行锁存。作用:锁存信号,并将结果输出给SELTIME。测频控制信号发生器TESTCTL程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitytestctlisport(clk:instd_logic;tsten:outstd_logic;clr_cnt:outstd_logic;load:outstd_logic);endtestctl;architecturebehavoftestctlissignaldiv2clk:std_logic;beginprocess(clk)beginif(clk'eventandclk='1')thendiv2clk=notdiv2clk;endif;endprocess;process(clk,div2clk)beginif(clk='0'anddiv2clk='0')thenclr_cnt='1';elseclr_cnt='0';7endif;endprocess;load=notdiv2clk;tsten=div2clk;endbehav;作用:对8个CNT10产生同步使能信号TSTEN;产生一个清零信号CLR_CNT,计数完成时对8个CNT10清零;产生一个锁存信号LOAD对锁存器RED32B,对CNT10产生的信号进行锁存。数码管译码显示DELED的程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDELEDISPORT(S:INSTD_LOGIC_VECTOR(3DOWNTO0);A,B,C,D,E,F,G,H:OUTSTD_LOGIC);ENDDELED;ARCHITECTUREBEHAVOFDELEDISSIGNALDATA:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALDOUT:STD_LOGIC_VECTOR(7DOWNTO0);BEGINDATA=S;PROCESS(DATA)BEGINCASEDATAISWHEN0000=DOUT=00111111;WHEN0001=DOUT=00000110;WHEN0010=DOUT=01011011;WHEN0011=DOUT=01001111;WHEN0100=DOUT=01100110;WHEN0101=DOUT=01101101;WHEN0110=DOUT=01111101;WHEN0111=DOUT=00000111;WHEN1000=DOUT=01111111;WHEN1001=DOUT=01101111;WHEN1010=DOUT=01110111;WHEN1011=DOUT=01111100;WHEN1100=DOUT=00111001;WHEN1101=DOUT=01011110;WHEN1110=DOUT=01111001;WHEN1111=DOUT=01110001;WHENOTHERS=DOUT=00000000;8ENDCASE;ENDPROCESS;H=DOUT(7);G=DOUT(6);F=DOUT(5);E=DOUT(4);D=DOUT(3);C=DOUT(2);B=DOUT(1);A=DOUT(0);ENDBEHAV;作用:将实验结果使用数码管直观的显示出来。数码管扫描SELTTIME的程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityseltimeisport(clk:instd_logic;din:instd_logic_vector(31downto0);daout:outstd_logic_vector(3downto0);sel:outstd_logic_vector(2downto0));endseltim