基于FPGA的数字频率计设计报告

  • 格式:doc
  • 大小:170.00 KB
  • 文档页数:17

电子技术综合试验实验报告班级:测控一班学号:2907101002姓名:李大帅指导老师:李颖基于FPGA的数字频率计设计报告一、系统整体设计设计要求:1、被测输入信号:方波2、测试频率范围为:10Hz~100MHz3、量程分为三档:第一档:闸门时间为1S时,最大读数为999.999KHz第二档:闸门时间为0.1S时,最大读数为9999.99KHz第三档:闸门时间为0.01S时,最大读数为99999.9KHz。

4、显示工作方式:a、用六位BCD七段数码管显示读数。

b、采用记忆显示方法c、实现对高位无意义零的消隐。

系统设计原理:所谓“频率”,就是周期性信号在单位时间(1秒)内变化的次数。

若在一定的时间间隔T内计数,计得某周期性信号的重复变化次数为N,则该信号的频率可表达为:f = N / T .基于这一原理我们可以使用单位时间内对被测信号进行计数的方法求得对该信号的频率测量,具体实现过程简述如下:首先,将被测信号①(方波)加到闸门的输入端。

由一个高稳定的石英振荡器和一系列数字分频器组成了时基信号发生器,它输出时间基准(或频率基准)信号③去控制门控电路形成门控信号④,门控信号的作用时间T是非常准确的(由石英振荡器决定)。

门控信号控制闸门的开和闭,只有在闸门开通的时间内,方波脉冲②才能通过闸门成为被计数的脉冲⑤由计数器计数。

闸门开通的时间称为闸门时间,其长度等于门控信号作用时间T。

比如,时间基准信号的重复周期为1S,加到闸门的门控信号作用时间T亦准确地等于1S,即闸门的开通时间——“闸门时间”为1S。

在这一段时间内,若计数器计得N=100000个数,根据公式f = N / T,那么被测频率就是100000Hz。

如果计数式频率计的显示器单位为“KHz”,则显示100.000KHz,即小数点定位在第三位。

不难设想,若将闸门时间设为T=0.1S,则计数值为10000,这时,显示器的小数点只要根据闸门时间T的改变也随之自动往右移动一位(自动定位),那么,显示的结果为100.00Khz。

在计数式数字频率计中,通过选择不同的闸门时间,可以改变频率计的测量范围和测量精度。

系统单元模块划分:1)分频器,将产生用于计数控制的时钟分别为1HZ,10HZ,100HZ脉冲和1KHZ的用于七段显示数码管扫描显示的扫描信号。

2)闸门选择器,用于选择不同的闸门时间以及产生后续的小数点的显示位置。

3)门控电路,产生用于计数的使能控制信号,清零信号以及锁存器锁存信号。

4)计数器,用于对输入的待测信号进行脉冲计数,计数输出。

5)锁存器,用于对计数器输出数据的锁存,便于后续译码显示电路的对数据进行记忆显示,同时避免计数器清零信号对数据产生影响。

6)译码显示,用于产生使七段显示数码管的扫描数字显示,小数点显示的输出信号,同时对高位的无意义零进行消隐。

二、单元电路设计1、分频器:该电路将产生四个不同频率的信号输出,因为电路板上给出了一个48MHZ的晶振,所以我们只需要对48MHZ的信号进行适当分频即可得到我们所需的四个不同频率的信号输出,我们设计一个输入为48MHZ,有四个输出端分别为1HZ,10HZ和100HZ,1KHZ的分频器,原程序如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity fenpinqi isPort ( clk : in STD_LOGIC;clkout1 : out STD_LOGIC;clkout10 : out STD_LOGIC;clkout100 : out STD_LOGIC;clkout1K : out STD_LOGIC);end fenpinqi;architecture Behavioral of fenpinqi issignal cnt1:integer range 1 to 24000000;signal cnt10:integer range 1 to 2400000;signal cnt100:integer range 1 to 240000;signal cnt1K:integer range 1 to 24000;signal c1:std_logic;signal c2:std_logic;signal c3:std_logic;signal c4:std_logic;beginprocess(clk)isbeginif clk'event and clk='1' thenif cnt1<24000000 then --对cnt1进行计数,当cnt1未计满后对其进行加1cnt1<=cnt1+1;elsif cnt1=24000000 then --cnt1计满后对其进行赋一,并且令c1进行翻转,然后将c1的值赋给clkout1c1<=not c1; --由于48MHZ的的信号,前一半的时候c1为0,则后一半是为1,就完成了对信号进行分频,产生了1HZ的信号cnt1<=1;end if;end if;end process;process(clk)isbeginif clk'event and clk='1' then --方法同上if cnt10<2400000 thencnt10<=cnt10+1;elsif cnt10=2400000 thenc2<=not c2;cnt10<=1;end if;end if;end process;process(clk)isbeginif clk'event and clk='1' then --方法同上if cnt100<240000 thencnt100<=cnt100+1;elsif cnt100=240000 thenc3<=not c3;cnt100<=1;end if;end if;end process;process(clk)isbeginif clk'event and clk='1' then --方法同上if cnt1K<24000000 thencnt1K<=cnt1K+1;elsif cnt1=24000 thenc4<=not c4;cnt1K<=1;end if;end if;end process;clkout1<=c1;clkout10<=c2;clkout100<=c3;clkout1K<=c4;end Behavioral;源文件编写成功后编译并生成图形文件符号如图:仿真文件编写如下:LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;ENTITY tbb_vhd ISEND tbb_vhd;ARCHITECTURE behavior OF tbb_vhd ISCOMPONENT fenpinqiPORT(clk : IN std_logic;clkout1 : OUT std_logic;clkout10 : OUT std_logic;clkout100 : OUT std_logic;clkout1K : OUT std_logic);END COMPONENT;SIGNAL clk : std_logic := '0';SIGNAL clkout1 : std_logic;SIGNAL clkout10 : std_logic;SIGNAL clkout100 : std_logic;SIGNAL clkout1K : std_logic;BEGINuut: fenpinqi PORT MAP(clk => clk,clkout1 => clkout1,clkout10 => clkout10,clkout100 => clkout100,clkout1K => clkout1K);tb : PROCESSBEGINclk<='0';wait for 10 ps;clk<='1';wait for 10 ps;END PROCESS;END;对该模块进行仿真结果如下:有上图可知分频器工作正常,产生的个信号也没有毛刺,结果十分理想。

2、闸门选择器:在这个模块中我们有四个输出端和六个输入端,其中四个输出端中有一个是频率输出端,是通过三个闸门选择开关输入和三个输入频率决定的,另外三个输出端则是用来后面的小数点控制的,而六个输入端中的三个是上面分频器的三个输出1HZ,10HZ和100HZ,另外三个是电路板上的拨动开关,用来选择闸门,控制输出。

其原程序和分析如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity SELE isPort ( SE1 : in STD_LOGIC;SE10 : in STD_LOGIC;SE100 : in STD_LOGIC;F1HZ : IN STD_LOGIC;F10HZ : IN STD_LOGIC;F100HZ :IN STD_LOGIC;FREF : out STD_LOGIC;DP1 : out STD_LOGIC;DP2 : out STD_LOGIC;DP3 : out STD_LOGIC);end SELE;architecture Behavioral of SELE isbeginPROCESS(SE1,SE10,SE100) ISBEGINIF SE1='1' AND SE10='0' AND SE100='0' THENFREF<=F1HZ; --当闸门控制在第一档的时候,令输出端输出1HZ输入端的输入,小数点控制dp1有效,dp2,dp3无效DP1<='0';DP2<='1';DP3<='1';END IF;IF SE1='0' AND SE10='1' AND SE100='0' THENFREF<=F10HZ; --第二档,输出为10HZ,dp2有效DP1<='1';DP2<='0';DP3<='1';END IF;IF SE1='0' AND SE10='0' AND SE100='1' THENFREF<=F100HZ; --第三档,输出为100HZ,dp3有效DP1<='1';DP2<='1';DP3<='0';END IF;END PROCESS;end Behavioral;源代码编写完成后保存并生成图形文件符号如图:仿真文件编写如下:LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;ENTITY TTB_vhd ISEND TTB_vhd;ARCHITECTURE behavior OF TTB_vhd ISCOMPONENT SELEPORT(SE1 : IN std_logic;SE10 : IN std_logic;SE100 : IN std_logic;F1HZ : IN std_logic;F10HZ : IN std_logic;F100HZ : IN std_logic;FREF : OUT std_logic;DP1 : OUT std_logic;DP2 : OUT std_logic;DP3 : OUT std_logic);END COMPONENT;SIGNAL SE1 : std_logic := '1';SIGNAL SE10 : std_logic := '0';SIGNAL SE100 : std_logic := '0';SIGNAL F1HZ : std_logic := '0';SIGNAL F10HZ : std_logic := '0';SIGNAL F100HZ : std_logic := '0';SIGNAL FREF : std_logic;SIGNAL DP1 : std_logic;SIGNAL DP2 : std_logic;SIGNAL DP3 : std_logic;BEGINuut: SELE PORT MAP(SE1 => SE1,SE10 => SE10,SE100 => SE100,F1HZ => F1HZ,F10HZ => F10HZ,F100HZ => F100HZ,FREF => FREF,DP1 => DP1,DP2 => DP2,DP3 => DP3);tb : PROCESSBEGINF1HZ<='0';FREF<='0';wait for 100 ns;F1HZ<='1';FREF<='1';WAIT FOR 100 NS;END PROCESS;END;仿真结果如图:有仿真结果可知闸门选择器工作正常,能够准确输出我们所需的信号。