
9bg高等教育6位十进制频率计实践报告.doc
12页六位十进制频率计引言在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更加重要数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差随着现场可编程门阵列FPGA的广泛应用,以EDA工具作为开发手段,运用VHDL等硬件描述语言语言,将使整个系统大大简化,提高了系统的整体性能和可靠性一、 课程设计题目和设计要求简易频率计要求:设计一个简易的6位十进制频率计功能分析:可以测量的频率范围:0~999999Hz,并在数码管显示器频率的值二、 设计思路分析与方案选择1、 频率计设计原理在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一数字式频率计的测量原理有两类:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法即测周期法,如周期测频法。
直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数器阀门的时间长短在达到不同的测量精度;间接测频法适用于低频信号的频率测量本设计中使用的就是直接测频法,即用计数器在计算1S内输入信号周期的个数,其测频范围为1Hz~999999Hz2、 频率计设计思路频率测量的基本原理是计算每秒钟内待测信号的脉冲个数这就要求测频控制信号发生器TESTCTL的计数使能信号TSTEN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的使能端ENA进行同步控制当TSTEN为高电平时,允许计数;为低电平时停止计数,并保持其计数结果在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1 秒种的计数值锁存进24位锁存器REG24B中,并由外部的7段译码器译出,并稳定显示设置锁存器的好处是,显示的数据稳定,不会由于周期性的清零信号而不断闪烁锁存信号之后,必须有一个清零信号CLR-CNT对计数器进行清零,为下1 秒的计数操作做准备测频控制信号发生器的工作时序如所示寄存器REG24B设计要求是:若已有24 位BCD码存在于此模块的输入口,在信号LOAD的上升沿后即被锁存到寄存器REG24B的内部,并由REG24B的输出端输出,然后由7段译码器译成能在数码管上显示输出的相应数值。
计数器CNT10设计要求:有一时钟使能输入端,用于锁定计数值当高电平时计数允许,低电平时禁止计数3、 系统的总体框图分频电路模块测频信号控制模块计数模块锁存模块译码显示模块三、 频率计的层次化设计方案1、 分频模块由于KHF—3型实验箱上基准时钟信号没有1Hz的频率,本设计采用10MHz的频率,首先通过设计一个10分频的电路,然后将七个10分频电路级联就可以将10MHz的方波信号变为1Hz的方波信号10分频电路的源程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity clk_div is port(clk:in std_logic; clk_div10:out std_logic);end;architecture one of clk_div is signal count:std_logic_vector(2 downto 0); signal clk_temp:std_logic;begin process(clk) begin if(clk'event and clk='1') then if (count="100")then count<=(others=>'0'); clk_temp<=not clk_temp; else count<=count+1; end if; end if; end process; clk_div10<=clk_temp;end;设计完一个10分频电路后,采用元器件例化将七个10分频级联,源程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity clk_div_10m is port(clk1:in std_logic; clk_div10m:out std_logic);end;architecture atr3 of clk_div_10m is component clk_div is port(clk:in std_logic; clk_div10:out std_logic); end component;signal s1,s2,s3,s4,s5,s6:std_logic;begin u1:clk_div port map(clk=>clk1,clk_div10=>s1); u2:clk_div port map(clk=>s1,clk_div10=>s2); u3:clk_div port map(clk=>s2,clk_div10=>s3); u4:clk_div port map(clk=>s3,clk_div10=>s4); u5:clk_div port map(clk=>s4,clk_div10=>s5); u6:clk_div port map(clk=>s5,clk_div10=>s6); u7:clk_div port map(clk=>s6,clk_div10=>clk_div10m);end;将程序进行编译、仿真成功后生成一个电路图可供顶层设计调用。
电路图如图(1)所示:图(1)2、 测频控制信号发生器测频控制信号发生器使能信号tsten 能产生一个1秒脉宽的周期信号,并对频率计的每一个计数器CNT10 的ENA使能端进行控制当tsten为高电平时允许计数,当为低电平时禁止计数,并保持其所计的脉冲个数源程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity div2clk is port(clk:in std_logic; tsten:out std_logic; clr_cnt:out std_logic; load:out std_logic);end;architecture one of div2clk is signal div2clk:std_logic;begin process(clk) begin if clk'event and clk='1'then div2clk<=not div2clk; end if ; end process; process (clk ,div2clk) begin if( clk='0'and div2clk='0')then clr_cnt<='1'; else clr_cnt<='0'; end if; end process; load<=not div2clk; tsten<=div2clk;end ;将程序进行编译、仿真成功后生成一个电路图可供顶层设计调用,电路图如图(2)所示:图(2)3,计数模块 首先设计一个10进制计数器,要求在计到9的时候产生一个进位输出,然后将用6个10进制计数器相连接形成6位的计数器,能够从0计到999999。
10进制计数器,当清零端为高电平时,将计数值清零,在时钟上升沿处,并且要在使能端为高电平时才能计数源程序如下:library ieee; use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity count10 is port(clr,en,clk: in std_logic; cq: out std_logic_vector(3 downto 0); cout: out std_logic);end;architecture atr of count10 is signal cqi:std_logic_vector(3 downto 0);begin process(clk,clr,en) begin if clr='1' then cqi<="0000"; elsif (clk'event and clk='1') then if en='1' then if cqi="1001" then cqi<="0000"; cout<='1'; else cqi<=cqi+1; cout<='0'; end if; end if; end if; cq<=cqi; end process;end;将6个10进制计数器相连,形成一个六位的计数器,当清零端为高电平时,将计数值清零,在时钟上升沿处,并且要在使能端为高电平时才能计数。
源程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity count is port(clk,clr,en:in std_logic; co:out std_logic; q1:out std_logic_vector(3 downto 0); q2:out std_logic_vector(7 downto 4); q3:out std_logic_vector(11 downto 8); q4:out std_logic_vector(15 downto 12); 。












