《基于VHDL的8位十进制频率计设计.doc》由会员分享,可在线阅读,更多相关《基于VHDL的8位十进制频率计设计.doc(14页珍藏版)》请在三一办公上搜索。
1、基于VHDL的8位十进制频率计设计目录目录1摘要21.设计目的22.设计要求23.设计思路24.频率计设计原理34.1频率计的组成部分34.2频率计工作原理34.3频率计各模块介绍35.频率计仿真75.1fctrl控制模块仿真75.2regester寄存器模块仿真75.3seltime扫描模块仿真75.4deled显示模块仿真85.5cnt10计数器模块仿真85.6总电路仿真86.频率计各模块程序97.频率计下载到实验箱现象138.设计体会149.参考资料14 摘要 使用VHDL 语言来设计数字频率计, 给出了原理图和仿真图形, 所设计的电路通过硬件仿真, 下载到目标器件上运行, 能够满足测量
2、频率的要求, 具有理论与实践意义, 实现了电子电路自动化(EDA)的过程。 关键词 VHDL; EDA; 仿真; FPGA; 频率计1. 设计目的1.1熟悉Max+plusII 10.2的软件的基本使用方法。1.2理解频率计的测量原理。1.3掌握VHDL语言的编写方法。1.4掌握虚拟数字频率计的软件设计。2. 设计要求在Max+plusII中设计一个数字频率计电路,设计要求为: 测量范围:1Hz100MHz,数码管动态扫描显示所测的频率。3. 设计思路方案一:采用周期法。通过测量待测信号的周期并求其倒数,需要有标准倍的频率,在待测信号的一个周期内,记录标准频率的周期数,这种方法的计数值会产生最
3、大为1个脉冲误差,并且测试精度与计数器中记录的数值有关,为了保证测试精度,测周期法仅适用于低频信号的测量。方案二:采用直接测频法。直接测频法就是在确定的闸门时间内,记录被测信号的脉冲个数。由于闸门时间通常不是待测信号的整数倍,这种方法的计数值也会产生最大为1个脉冲误差。进一步分析测量准确度:设待测信号脉冲周期为Tx,频率为Fx,当测量时间为T=1s时,测量准确度为=Tx/T=1/Fx。由此可知直接测频法的测量准确度与信号的频率有关:当待测信号频率较高时,测量准确度也较高,反之测量准确度也较低。因此直接测频法只适合测量频率较高的信号,不能满足在整个测量频段内的测量精度保持不变的要求。方案三:采用
4、等精度频率测量法,测量精度保持恒定,不随所测信号的变化而变化。在快速测量的要求下,要保证较高精度的测频,必须采用较高的标准频率信号。采用高集成度、高速的现场可编程门阵列FPGA为实现高速、高精度的测频提供了保证。本设计所采用的测频方法就是直接测频法。3.频率计设计原理3.1频率计的组成部分频率计主要由5 个部分组成: 测频控制信号发生器fctrl、8 个有时钟使能的十进制计数器cnt10、1 个锁存器regester32、显示模块deled 和控制显示模块seltime。数字频率计的框图如下图所示。3.2频率计工作原理频率计是直接用十进制数字来显示被测信号频率的一种测量装置。所谓频率, 就是周
5、期性信号在单位时间( 1s) 里变化的次数。若在一定时间间隔T 内测得的这个周期性信号的重复变化次数N , 则其频率可表示为f = N / T。频率测量的基本原理是计算每秒钟内待测信号的脉冲个数,测频的基本原理要求fctrl的计数使能信号en 能产生一个1s 脉宽的周期信号, 并对频率计的每一个计数器cnt10的使能端进行同步控制。当en为高电平时允许计数,为低电平时停止计数,并保持其所计脉冲个数。在停止计数期间,首先需要一个锁存信号load 的上跳沿将计数器在前1s 的计数值锁存进regester32中,并由外部的7 段译码器译出,并稳定显示。锁存信号之后,必须有一个清零信号对计数器进行清零
6、,为下1s 的计数操作做准备。测频控制信号发生器的工作时序图如下图所示。其中控制信号频率始终为1Hz,那么信号en的脉宽正好为1s,可以用作计数闸门信号。然后根据测频的时序要求,可得出信号load和清零信号clr_cnt的逻辑描述。计数完成后, 利用计数使能信号反向值的上跳沿产生一个锁存信号load。0.5s后,clr_cnt产生一个清零信号上跳沿。计数器cnt10的特殊之处是, 有一时钟使能输入端ena,用于锁存计数值。当高电平时计数允许, 低电平时计数禁止。锁存器的设计要求:若已有24位BCD码存于此模块的输入口,在信号load的上跳沿后即被锁存到寄存器regester内部,并由reges
7、ter的输出端输出, 然后有实验箱上7 段译码器译成能在数码管上显示输出的相应数值。3.3频率计各模块介绍测频控制信号模块控制模块的作用是产生测频所需要的各种控制信号。控制信号的标准输入时钟为1HZ,每两个时钟周期进行一次频率测量。该模块产生的3个控制信号,分别为EN,LOAD,CLR_CNT。CLR_CNT信号用于在每次测量开始时,对计数器进行复位,以清除上次测量的结果,该复位信号高电平有效,持续半个时钟周期的时间。EN为计数允许信号,在EN信号的上升沿时刻计数模块开始对输入信号的频率进行测量,测量时间恰为一个时钟周期(正好为单位时间1s),在此时间里被测信号的脉冲数进行计数,即为信号的频率
8、。然后将值锁存,并送到数码管显示出来。设置锁存器的好处是使显示的数据稳定,不会由于周期性的清零信号而不断闪烁。在每一次测量开始时,都必须重新对计数器清0。测频控制产生器如下图所示,图中1HZDE CLK1接CNT,EN为计数允许信号,接计数器CNT10的ENA(此图未画出),CLR_CNT信号用于在每次测量开始时,对计数器进行复位,接计数器CNT10的CLR,LOAD接锁存器的LOAD(此图未画出)。锁存器模块测量模块测量完成后,在load信号的上升沿时刻将测量值锁存到寄存器中,然后输出到显示模块。锁存器是起数据保持的作用,它将会把数据保存到下次触发或复位。主要是主从触发器组成的。用于存储数据
9、来进行交换,使数据稳定下来保持一段时间不变化,直到新的数据将其替换。锁存器REGESTER的封装如下图所示,图中load接控制测频产生器FTRL的load,而DIN31.0接计数器CNT10的CQ3.0,DOUT31.0接显示器seltime模块的DIN31.0端。扫描模块首先扫描模块接一个clk时钟,频率为32768HZ,DIN310接REGESTER的DOUT310,SEL20锁存到74LS138译码器的三个引脚,以便于让数码管显示,daout30接deled的s30端。sel为一个7进制计数器,当sel为000时,daout对应着输入din的0到3位,当sel为001时,daout对应着
10、输入din的4到7位,以此类推,当sel为111时,daout对应din 的28到31位。seltime模块如下图所示sel接线如右图所示显示模块LED有段码和位码之分,所谓段码就是让LED显示出八位数据,一般情况下要通过一个译码电路,将输入的4位2进制数转换为与LED显示对应的8位段码。位码也就是LED的显示使能端,对于共阴级的LED而言,低电平使能。在本设计中位码由扫描模块的sel接至74ls138进行译码。位码由显示模块输出。例如:要让8个LED同时工作显示数据,就是要不停的循环扫描每一个LED,并在使能每一个LED的同时,输入所需显示的数据对应的8位段码。虽然8个LED是依次显示,但是
11、受视觉分辨率的影响,看到的现象是8个LED同时工作。Deled模块如下图所示。s30经过译码对应着一个32位的dout,而A到G分别对应dout(0)至dout(7)。十进制计数器模块计数器模块是由8个带有异步清零端,进位信号输出的模为10的计数模块级连而成。它有一时钟使能输入端ENA,用于锁定计数器。当高电平计数允许,低电平时计数禁止。计数器模块用于对输入信号的脉冲进行计数,该模块有计数允许、异步清零等端口,以便于控制模块对其进行控制。CNT10如下图所示,其中CLR为复位接FCTRL的CLR_CNT端,ENA接FCTRL的EN端,CQ3.0接锁存器的DOUT31.0端。综上,总电路设计图如
12、下所示:5.频率计仿真5.1fctrl控制模块仿真由图可以看出CLK为一个1HZ的时钟信号,EN为CLK的二分频,LOAD为EN的非,CLR_CNT在CLK和EN都为低电平时,为高电平。5.2regester寄存器模块仿真由上图可以看出,当RST为高电平时,32位输出DOUT立即全部置零,当RST为低电平时,在LOAD信号有上升沿时,DIN将值赋给DOUT。5.3seltime扫描模块仿真由上图可以看出,sel从000开始循环计数至111,当clk上升沿到来时,若sel为111,则将sel置为000重新计数。sel的000至111依次对应daout从第四位至高四位。5.4deled显示模块仿真
13、5.5cnt10计数器模块仿真使能信号ena一直为高电平,则clk来一个上升沿,cq计一次数,计数范围为0到9,到9后,cq从0开始重新计数,并且carry_out输出一个高电平;当clr信号为高电平时,cq清零,开始重新计数。5.6总电路仿真clk1为1HZ(基准频率),clk2为待测频率,clk3为32768HZ(扫描频率),剩下的几个参数,在前几个仿真中均已提过,此处不再赘述。6.频率计各模块程序6.1fctrl控制模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fctrl
14、 isport( clk: in std_logic; en: out std_logic; clr_cnt: out std_logic; load: out std_logic);end fctrl;architecture behav of fctrl issignal div2clk : std_logic;beginprocess(clk)beginif(clkevent and clk=1) then div2clk=not div2clk;end if;end process;process(clk,div2clk)beginif(clk=0 and div2clk=0) the
15、nclr_cnt=1;elseclr_cnt=0;end if;end process;load=not div2clk;en=div2clk;end behav; 6.2regester寄存器模块library ieee;use ieee.std_logic_1164.all;entity regester32 isport( load : in std_logic; rst: in std_logic; din: in std_logic_vector(31 downto 0); dout:out std_logic_vector(31 downto 0);end regester32;a
16、rchitecture behav of regester32 issignal data:std_logic_vector(31 downto 0);beginprocess(rst,load)beginif rst=1 then data0);elsif(loadevent and load=1) then data=din;end if;dout=data;end process;end behav;6.3seltime扫描模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity s
17、eltime isport( clk : in std_logic; din : in std_logic_vector(31 downto 0); daout: out std_logic_vector(3 downto 0); sel : out std_logic_vector(2 downto 0);end seltime;architecture behav of seltime issignal sec : std_logic_vector(2 downto 0);beginprocess(clk)begin if(clkevent and clk=1) then if(sec=1
18、11) then sec=000; else secdaoutdaoutdaoutdaoutdaoutdaoutdaoutdaoutnull;end case;end process;sel=sec;end behav;6.4deled显示模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DELED ISPORT( S: IN STD_LOGIC_VECTOR(3 DOWNTO 0); A,B,C,D,E,F,G,H: OUT STD_LOGIC);END DELED;ARCHITECTURE BEHAV OF DELED ISSIGNAL D
19、ATA:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINDATADOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUTDOUT=00000000;END CASE;END PROCESS;H=DOUT(7);G=DOUT(6);F=DOUT(5);E=DOUT(4);D=DOUT(3);C=DOUT(2);B=DOUT(1);A=DOUT(0);END BEHAV;6.5cnt10计数器模块library ieee;us
20、e ieee.std_logic_1164.all;entity cnt10 isport(clk: in std_logic; clr: in std_logic; ena: in std_logic; cq : out integer range 0 to 9; carry_out: out std_logic);end cnt10;architecture behav of cnt10 issignal cqi: integer range 0 to 9;beginprocess(clr,clk,ena)beginif(clr=1) then cqi=0;elsif(clkevent a
21、nd clk=1) then if(ena=1) then if(cqi=9) then cqi=0; carry_out=1; else cqi=cqi+1; carry_out=0; end if; end if;end if;end process;cq=cqi;end behav;7.频率计下载到实验箱现象左图为数码管显示的频率第一幅图显示128HZ第二幅图显示8234HZ第三幅图显示32847HZ8. 设计体会用VHDL 来对数字频率计进行设计, 比较与用芯片搭电路进行硬件实现来说是一种新的尝试,通过仿真调试到下载试验,结果都能清楚明了地显示出来, 相当的快捷和方便, 不同模块之间相互独立, 底层模块的修改不会影响其他模块的工作, 采用这种设计方法设计结构清晰, 层次清楚, 便于对设计进行修改。9.参考资料潘松,黄继业EDA技术实用教程VHDL版(第四版)科学出版社2010年6月