简易频率滤波器_第1页
简易频率滤波器_第2页
简易频率滤波器_第3页
简易频率滤波器_第4页
简易频率滤波器_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1 引言12 简易数字频率计设计原理22.1基本原理22.2原理框图23 各模块程序及仿真43.1测频控制发生器fenpin模块的设计43.2待测信号计数器jishu模块的设计53.3锁存器suncunqi模块的设计83.4顶层模块的设计133.5 引脚锁定164 心得体会17参考文献181 引言 随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,因此测频计常受到人们的青昧。目前许多高精度的数字频率计都采用单片机加上外部的高速计数器来实现,然而单片机的时钟频率不高导致测频速度比较慢,并且在这种设计中,由于PCB版的集成度不高,导致PCB板走线长,因此难以提高计数器的工作频率。为了克

2、服这种缺点,大大提高测量精度和速度,我们可以设计一种可编程逻辑器件来实现数字频率计。EDA技术是以硬件语言为主要的描述方式,以EDA软件为主要的设计软件,以大规模课编程逻辑器件为载体的数字电路的设计过程。其设计的灵活性使得EDA技术得以快速发展和广泛应用。本设计以Quartus软件为设计平台,采用VHDL语言现数字频率计的整体设计。电子设计自动化(EDA)逐渐成为重要的设计手段,已经广泛应用于模拟与数字电路系统等许多领域,电子设计自动化是一种实现电子系统或电子产品自动化设计的技术,它与电子技术,微电子技术的发展密切相关,它吸收了计算机科学领域的大多数最新研究成果,以高性能的计算机作为工作平台,

3、促进了工程发展。EDA的一个重要特征就是使用硬件描述语言(HDL)来完成的设计文件,VHDL语言是经IEEE确认的标准硬件语言,在电子设计领域受到了广泛的接受。EDA技术就是以计算机为工具,设计者在EDA软件平台上,有硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作,最终形成集成电子系统或专业集成芯片的一门新技术。EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,因此频率计常受到人们的青睐。众

4、所周知,频率信号易于传输,抗干扰性强,可以获得较好的测量精度。因此,频率检测是电子测量领域最基本的测量之一。本设计基于我们对EDA技术、数字电子技术的基础知识的理解,用VHDL硬件描述语言进行模块电路的设计,用元件例化语句写出频率计的顶层文件,要求我们设计一个四位十进制的简易数字频率计,对1HZ-10MHZ的方波信号进行测量,测量的方波频率值要在4位数码管上进行动动态显示,根据不同的待测方波信号,频率计分为4个量程进行测量,四个量程分别为乘1,乘10,乘100,乘1000量程,要有一个整体复位控制,并且当量程选择不恰当或者超出10MHZ时要有错误报告。2 简易数字频率计设计原理2.1基本原理数

5、字频率计的主要功能是测量周期信号的频率。频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。频率是单位时间(1秒)内方波信号发生周期变化的次数。在给定的1秒时间内对方波信号波形计数,并将所计数值显示出来,就能读取被测信号的频率。数字频率计首先必须获得相对稳定与准确的时间,然后通过计数器计算这一段时间间隔内的方波脉冲个数并显示出来。这就是数字频率计的基本原理。脉冲信号的频率就是在单位时间内所产生的脉冲个数,其表达式为fNT,其中f为被测信号的频率,N为计数器所累计的脉冲个数,T为产生N个脉冲所需的时间。本设计要求基准时钟的频率为6MHZ,所以需要分频设计产生脉宽为1

6、秒的脉冲。再利用这个脉宽为1秒的脉冲计数,计数器所记录的结果,就是被测信号的频率。因为待测方波信号的频率在1HZ-10MHZ,所以仅用四位7段数码管无法完全正确显示,所以需要选择恰当的量程来显示待测方波信号的频率,当量程选择不当或者频率超出10MHZ时,用一个LED灯点亮来警告我们这样测量有错误。2.2原理框图本设计要求用基准时钟信号(f=6MHZ)的控制完成对1HZ-10MHZ的方波信号进行测量,使得所测量的方波频率值在4位7段数码管上进行显示,并根据不同的待测方波信号,将频率计分为4个量程进行测量,四个量程分别为乘1,乘10,乘100,乘1000量程,量程的选择分为手动和自动两种。当手动选

7、择量程时,自动量程显示为零,手动量程部分依手动所选量程而定;当手动选择信号不工作时,频率计自动选择比较合适的量程进行显示,手动量程部分显示为零。而且此频率计具有记忆功能,在测量过程中不刷新数据,等数据测量过程结束后才显示测量值,显示测量的频率值,并保存到下一次测量结束。数字频率计还有一个整体的异步清零端,随时可以进行清零操作。此外,数字频率计还有一个不能正确显示待测方波信号频率时的警告灯。数字频率计通过测频控制发生器将基准信号转换成所需要的控制信号clk1和en,待测信号计数器在en的控制下对待测信号进行测量并通过锁存器在clk1的控制下按要求进行显示,数字频率计包括测频控制发生器fenpin

8、、待测信号计数器jishu、锁存器suocunqi三个功能模块,其原理框图如图1所示。图1 原理框图其中a是手动选择量程输入端,sd代表手动量程的显示,rst是整体异步清零输入端,clk是频率为6MHZ的基准时钟,clkin是待测的方波信号,b是显示是否超出了频率计的测量范围,zd是在手动选择量程不工作时频率计进行的自动选择合适的量程显示,通过weixuan、co控制数码管从低位到高位的动态显示结果。3 各模块程序及仿真此设计运用元件例化的方法进行功能的实现,所以各个模块即使相互独立又是彼此联系的,三个模块共同完成方波信号的测量。3.1测频控制发生器fenpin模块的设计本设计要求为该模块fe

9、npin提供的基准信号频率为6MHZ,所以要做一个12M分频器控制产生一个脉宽为1秒的周期信号en和一个锁存信号clk1。rst为高电平时进行整体异步清零。当en处于高电平的时候对输入的待测方波信号进行计数测量,当en处于低电平的时候停止计数,并保持所计数值。当clk1是上升沿的时候将所保持的数值输出显示。此测频控制发生器的程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity fenpin isport(clk,rst:

10、in std_logic; clk1,en: buffer std_logic);end fenpin;architecture bhv of fenpin isbeginprocess(clk,rst)variable c:integer range 0 to 8;beginif rst=1 thenen=0;elsif clkevent and clk=1 thenc:=c+1;if c=4 thenc:=0;en=not en;end if;end if;clk1=not en and clk;end process;end bhv;此测频控制发生器的仿真结果如图2所示。图2 测频控制发

11、生器的仿真结果此模块如果仿真12M分频器很困难,为了看到仿真效果,改成8倍分频器,得到了此仿真结果。如果按程序下载,在硬件上能很清楚的看到由6MHZ的基准信号得到了脉宽为1秒的控制信号en和控制输出信号clk1,rst实现了整体异步清零的功能。3.2待测信号计数器jishu模块的设计该模块通过fenpin模块所产生的脉宽为1秒的en信号来对待测信号进行计数。用7位整数数d进行对待测信号的计数,同时用sel表示自动量程根据所得数值d变化,sel为“0001”时代表乘1,sel为“0010”时代表乘10,sel为“0100”时代表乘100,sel为“1000”时代表乘1000。如果测量选择量程太小

12、或者待测方波信号频率超出10MHZ,均无法正确显示测量结果,则将b置高电平进行警告。此待测信号计数器的程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;entity jishu isport(en,clkin,rst:in std_logic;a:in std_logic_vector(3 downto 0);sel:out std_logic_vector(3 downto 0);d :out integer range 0 to ;b:out std_logic);end jishu;arc

13、hitecture bhv of jishu issignal d1: integer range 0 to ;beginprocess(rst,en,clkin)variable dd:integer range 0 to ;beginif rst=1 thendd:=0;b)then dd:=0;b thenseldd and dd99999 thenseldd and dd9999 thensel=0010;elsesel thenif a=1000 thenb=0;elsif a=0000 thenb=0;elseb99999 thenif a=1000 thenb=0;elsif a

14、=0100 thenb=0;elsif a=0000 thenb=0;elseb9999 thenif a=1000 thenb=0;elsif a=0100 thenb=0;elsif a=0010 thenb=0;elsif a=0000 thenb=0;elseb=1;end if;elseb=0; end if; d1=dd;end process;process(en)beginif enevent and en=0 thend=d1;end if;end process;end bhv;此待测信号计数器的仿真结果如图3所示。 图3 待测信号计数器的仿真结果该模块实现了在en为高电平

15、时对输入的待测信号clkin进行测量,当en为低电平时停止测量并将所计数值输出,即在1秒内待测信号的脉冲数,也就是待测信号的频率值。sel为根据所计数值自动合理选择的量程,此时sel为“0001”,代表乘1HZ的量程,即所测方波信号的频率在9999HZ之内。3.3锁存器suncunqi模块的设计该模块用于实现记忆显示,在测量过程中不刷新新的数据,直到测量过程结束后,锁存显示测量结果,并且保存到下一次测量结束。其功能是对四位整数进行锁存并且将每一位转换成为对应的1组七段码,用于驱动数码管。当weixuan为“0001”时数码管最低位亮,“0010”时数码管次低位亮,“0100”时数码管次高位亮,

16、“1000”时数码管最高位亮。其中rst为高电平时对锁存器进行异步清零。rst为低电平时正常工作。输入信号a对锁存器进行控制即手动选择量程,当a为“0001”时,代表选择乘1档,自动量程显示为零,手动量程显示乘1HZ,只输出计数所得值d的低四位并显示在四个十进制数码管上;当a为“0010”时,代表选择乘10档,自动量程显示为零,手动量程显示乘10HZ,只输出计数所得值d的次低四位并显示在四个十进制数码管上;当a为“0100”时,代表选择乘100档,自动量程部分清零,手动量程显示乘100HZ,只输出计数所得值d的次高四位并显示在四个十进制数码管上;当a为“1000”时,代表选择乘1000档,自动

17、量程部分清零,手动量程显示乘1000HZ,只输出计数所得值d的高四位并显示在四个十进制数码管上。当a为“0000”时,代表不进行手动选择,则手动量程显示为零,自动量程部分根据所计数值进行合理选择。sel为“0001”代表所测得的频率值在09999HZ之内,则自动量程显示乘1HZ,输出所测数值的有效部分并显示在四个十进制数码管上;sel为“0010”代表所测得的频率值在1000099999HZ之内,则自动量程显示乘10HZ,输出所测数值的有效部分的高四位并显示在四个十进制数码管上;sel为“0100”代表所测得的频率值在HZ之内,则自动量程显示乘100HZ,输出所测数值的有效部分的高四位并显示在

18、四个十进制数码管上;sel为“1000”代表所测得的频率值在HZ之内,则自动量程显示乘1000HZ,输出所测数值的有效部分的高四位并显示在四个十进制数码管上。此锁存与译码器的程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity suocunqi isport(clk,clk1,rst:in std_logic; d:in integer range 0 to ; sel,a:in std_logic_vector(3 do

19、wnto 0); weixuan:buffer std_logic_vector(3 downto 0); co:out std_logic_vector(6 downto 0); zd,sd:out std_logic_vector(3 downto 0); end suocunqi;architecture bhv of suocunqi issignal q,q1,q2,q3,q4: integer range 0 to 9;signal yimaqi:std_logic_vector(2 downto 0);beginprocess(rst,clk1)begin if rst=1 th

20、en q1=0; q2=0; q3=0; q4=0; zd=0000; elsif(clk1event and clk1=0) then if(a=0000) then if sel=1000 then q1=d/; q2=d/-10*q1; q3=d/10000-100*q1-10*q2; q4=d/1000-1000*q1-100*q2-10*q3; zd=1000; sd=0000; elsif sel=0100 then q1=d/; q2=d/10000-10*q1; q3=d/1000-100*q1-10*q2; q4=d/100-1000*q1-100*q2-10*q3; els

21、if sel=0010 then q1=d/10000; q2=d/1000-10*q1; q3=d/100-100*q1-10*q2; q4=d/10-1000*q1-100*q2-10*q3; zd=0010; sd=0000; elsif sel=0001 then q1=d/1000; q2=d/100-10*q1; q3=d/10-100*q1-10*q2; q4=d/1-1000*q1-100*q2-10*q3; zd=0001; sd=0000; end if; elsif(a=0001) then q1=d/1000; q2=d/100-10*q1; q3=d/10-100*q

22、1-10*q2; q4=d/1-1000*q1-100*q2-10*q3; zd=0000; sd=0001; elsif(a=0010) then q1=d/10000; q2=d/1000-10*q1; q3=d/100-100*q1-10*q2; q4=d/10-1000*q1-100*q2-10*q3; zd=0000; sd=0010; elsif(a=0100) then q1=d/; q2=d/10000-10*q1; q3=d/1000-100*q1-10*q2; q4=d/100-1000*q1-100*q2-10*q3; zd=0000; sd=0100; elsif(a=

23、1000) then q1=d/; q2=d/-10*q1; q3=d/10000-100*q1-10*q2; q4=d/1000-1000*q1-100*q2-10*q3; zd=0000; sd=1000; end if;end if;end process;process(clk)variable temp:std_logic_vector(2 downto 0);beginif(clkevent and clk=1)thentemp:=temp+1;if(temp=100)thentemp:=000;end if;end if;yimaqiweixuanweixuanweixuanwe

24、ixuannull;end case;end process;process(rst,weixuan)beginif(weixuan=1000)thenq=q1; elsif(weixuan=0100)thenq=q2;elsif(weixuan=0010)thenq=q3;elsif(weixuan=0001)thenqcocococococococococonull;end case;end process;end bhv;此锁存与译码器的仿真结果如图4所示。图4 锁存器的仿真结果该模块的仿真为了将各个功能都清晰的显示出来将sel进行了提前设置,并不是根据所测频率值进行的自动选择。sel是

25、输入信号,前提我们已经知道sel和a不能同时工作,所以为了使用a,将sel人为的提前设成“0001”了,不过如此提前将sel的值进行设定并不影响整体的功能。此仿真图中sel为“0001”代表乘1量程,只显示所计数值d的低四位,即十进制的“8” “2” “1” “0”,此时手动量程zd显示为“0001”,自动量程sd显示“0000”代表不工作。3.4顶层模块的设计该模块用元件调用(元件例化语句)实现本设计要求的整体功能。顶层文件的作用是将三个底层文件联系到一起,共同实现该简易数字频率计数器的功能。此处定义了en0,d0,sel0,clko等四个信号进行底层文件之间以及底层与顶层之间的连接。此模块

26、的程序如下所示:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity jianyipinlvji isport(rst,clk,clkin:in std_logic; co:out std_logic_vector(6 downto 0); sd,zd:out std_logic_vector(3 downto 0); weixuan:buffer std_logic_vector(3 downto 0); a:in std_log

27、ic_vector(3 downto 0); b:out std_logic);end jianyipinlvji;architecture bhv of jianyipinlvji iscomponent fenpin isport(clk,rst : in std_logic; clk1,en : buffer std_logic);end component;component jishuport(en,clkin,rst :in std_logic;a:in std_logic_vector(3 downto 0); sel :out std_logic_vector(3 downto

28、 0); d :out integer range 0 to ; b :out std_logic);end component;component suocunqi port(clk,clk1,rst:in std_logic; d:in integer range 0 to ; sel,a:in std_logic_vector(3 downto 0); weixuan:buffer std_logic_vector(3 downto 0); co:out std_logic_vector(6 downto 0); zd,sd:out std_logic_vector(3 downto 0

29、);end component;signal clk0: std_logic;signal en0: std_logic;signal d0: integer range 0 to ;signal sel0: std_logic_vector(3 downto 0);beginU1:fenpin port map(clk,rst,clk0,en0);U2:jishu port map(en0,clkin,rst,a,sel0,d0,b);U3:suocunqi port map(clk,clk0,rst,d0,sel0,a,weixuan,co,zd,sd);end bhv;此模块的仿真结果如

30、图5所示:图5 整体仿真结果由于顶层模块调用fenpin模块,所以仿真时遇到类似的问题,我们改用8倍分频器来仿真,则在4个基准信号周期时间内对待测信号计数,所以得到的数值除以4就是待测信号与基准信号的频率倍数关系。所以整体功能仿真结果显示,基准信号周期为250ms,即频率为4HZ,所以此待测信号的频率为128HZ。当sel为“0001”时,代表选择乘1HZ的量程,即显示低四位,此时,自动量程显示为“0001”表示乘1HZ量程,手动量程显示为“0000”表示不工作。当sel为“0010”时,代表选择乘10HZ的量程,即显示次低四位,此时,自动量程显示为“0010”表示乘10HZ量程,手动量程显示

31、为“0000”表示不工作。当rst为高电平时,输出均为0,则进行了整体异步清零。3.5 引脚锁定硬件下载前,进行引脚锁定,各引脚锁定情况如图6所示。图6 引脚锁定图引脚锁定完成后,再次对设计文件进行编译。重新编译完成后,执行QuartusII主窗口“Processing”菜单下“Start Programming”,将配置文件下载到CycloneIII系统的目标芯片EP3C40Q240C8上,下载适配后,将clk0的6MHZ频率用短路帽短路,再将clk5的各个频率段不同时用短路帽进行短路并观察数码管上的显示数字,检查是否正确,同时还可以拨开关1到键4进行手动选择量程,查看各个部分是否能够完成其功能。可以拨开关8进行异步清零。数码管从左向右是从低位到高位显示的频率。最左边LED灯显示手动选择的量程数值,最右边四个LED灯是自动默认选择的量程数值。硬件电路简捷,体积小,所有电路都在一块芯片里,因此性能稳定。4 心得体会通过这学期学的EDA技术,再加上这几天边查资料边请教老师,终于理清了头绪,完成了此次课程设计。刚开始拿到本次程序设计题的时候确实有点儿

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论