量程自动转换数字式频率计的设计_第1页
量程自动转换数字式频率计的设计_第2页
量程自动转换数字式频率计的设计_第3页
量程自动转换数字式频率计的设计_第4页
量程自动转换数字式频率计的设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、EDA课 程 设 计 (量程自动转换数字式频率的设计)题 目: 数字频率计的设计 学 院: 班 级: 学 号: 姓 名: 指导老师: 提交时间: 目录 一 设计要求二 设计方案 1,频率计的工作原理 2,频率计的系统框图三 详细设计 1, 4位十进制计数模块 (1)十进制计数器元件cnt10v的设计 (2)计数器的顶层设计(3)分频模块的设计 2. 闸门控制模的设计 3可自动换挡基准时钟模块的设计 4.锁存模块的设计 5.译码显示模块的设计与实现 七段数码显示译码管的VHDL设计 6.频率计电路顶层原理图的设计 7实验数据和误差分析四总结五参考文献数字频率计的设计摘要: 数字频率计是一种能够测

2、量被测信号频率的数字测量仪器。它被广泛应用于航天、航空、电子、自动化测量、测控等领域。本文利用测频原理,设计一个量程自动转换数字式频率计,主要硬件电路由Altera公司生产的复杂可编程逻辑(CPLD)EPM7128构成。复杂可编程逻辑器件CPLD芯片EPM7128SLC84-15完成各种时序逻辑控制、计数功能。在QUARTUS II平台上,用VHDL语言编程完成了CPLD的软件设计、编译、调试、仿真和下载。由于本系统采用了先进的EDA技术,不但大大缩短了开发研制周期,而且使本系统具有结构紧凑、体积小,可靠性高,测频范围宽、精度高等优点。关键词:频率计;可编程逻辑器件;VHDL一、设计要求1.

3、频率计的测量范围为1,量程分10、100和1000三档(最大读数分别为9.99、99.9、999)。2. 要求量程可根据被测量的大小自动转换。即当计数器溢出时,产生一个换档信号,让整个计数时间减少为原来的1/10,从而实现换档功能。3. 要求实现溢出报警功能。即当频率高于999时,产生一报警信号,点亮LED灯,从而实现溢出报警功能。二、设计方案1、频率计的工作原理常用的测量频率的方法有两种,一个是测周期法,一个是测频率法。测周期法需要有基准系统时钟频率,在待测信号一个周期内,记录基准时钟频率的周期数,则被测频率可表示为:=/ 测频率法就是在一定的时间间隔内内,得到这个周期信号重复变化的次数,则

4、被测频率可表示为=/ 本设计采用的是直接测频率的方法。2、频率计的系统框图频率计的系统设计可以分为4位10进制计数模块、闸门控制模块、锁存器模块、译码显示模块和可自动换档基准时钟模块,其系统框图如图2.1所示。可自动换档基准时钟模块闸门控制模块4位10进制计数模块译码显示模块锁存模 块图2.1:频率计的系统框图其中,可自动换档模块为闸门控制模块提供3个档也就是3个测量范围的基准时钟信号,通过计数器的最高位溢出情况来判定工作在第几档。闸门控制模块根据基准时钟信号产生基准时钟信号周期2倍的周期使能信号,随后为锁存器产生一周期性地锁存信号,再然后为计数模块产生一周期性地清零信号。4位10进制计数模块

5、在使能信号和清零信号的控制下对被测信号的波形变化进行计数,若产生溢出则为自动换档模块输出一换档信号。译码显示模块负责不闪烁的显示被测信号的频率以及数字频率计目前工作的档位。三、详细设计1、4位十进制计数器模块4位十进制计数器模块包含4个级联十进制计数器,用来对施加到时钟脉冲输入端的待测信号产生的脉冲进行计数,十进制计数器具有计数使能、清零控制和进位扩展输出。用于计数的时间间隔(计数允许周期T)由闸门控制模块的控制信号发生器所产生的使能信号来控制,使能十进制计数器的计数允许周期T可由闸门控制模块中的量程选择输入来决定。这样允许用户选择所希望的被测频率范围,并有效地确定读出数据中十进制小数点的位置

6、。(1)、十进制计数器元件cnt10的设计十进制计数器既可采用QuartusII的宏元件74160,也可用VHDL语言设计,本设计采用VHDL编写,其源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY cnt10v ISPORT(clr:IN STD_LOGIC; clk:IN STD_LOGIC; cout:OUT STD_LOGIC; en:IN STD_LOGIC; cq:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END cnt10v;ARCHI

7、TECTURE example1 OF cnt10v ISBEGIN PROCESS(clr,clk,en)VARIABLE cqi:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF clr='1' THEN cqi:=(OTHERS=>'0');ELSIF CLK'EVENT AND clk='1' THENIF EN='1' THENIF cqi<9 then cqi:=cqi+1;ELSE cqi:=(OTHERS=>'0');END IF;END IF;EN

8、D IF;IF cqi=9 THEN cout<='1'ELSE cout<='0'END IF;cq<=cqi;END PROCESS;END ;在源程序中cout是计数器进位输出;cq3.0是计数器的状态输出;clk是时钟输入端;clr是复位控制输入端,当clr=1时,cq3.0=0;en是使能控制输入端,当en=1时,计数器计数,当en=0时,计数器保持状态不变。 在项目编译仿真成功后,将设计的十进制计数器电路设置成可调用的元件cnt10.bsf,用于以下的4位十进制计数器的顶层设计。(2)、计数器的顶层设计该顶层设计可以用原理图输入的方

9、法完成。在QUartusII中,新建一个原理图编辑窗,从当前的工程目录中调出4片十进制计数器元件cnt10,并按图所示的4位十进制计数器的顶层原理图完成电路连接,如图3.2所示。图3.2:计数模块电路图(3) 分频模块的设计根据设计要求,最小一档的周期是10ms,即100Hz。选用10MHz的晶振作为EPM7128的时针,为得到1000Hz的信号需要100分频,可知用2个cnt10级联就可以实现,图3.3是其电路图。图3.3:分频模块电路图 2、闸门控制模的设计闸门控制模块主要根据输入的控制时钟脉冲,首先要产生一个锁存信号LOAD,用其上升沿控制锁存器将之前的计数结果存入锁存器中,并由显示模块

10、将其显示出来,设置锁存器是为了让显示稳定,不会因为周期性清零信号使得显示的数值不断闪烁。锁存之后须有一清零信号CLR_CNT将计数器清零,为了下一秒的计数操作做准备。闸门控制模块的VHDL源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY TESTCTL ISPORT(clk,fin:IN STD_LOGIC; clr_cnt:OUT STD_LOGIC; tsten:OUT STD_LOGIC; load:OUT STD_LOGIC);END;ARCHITECTURE on

11、e OF TESTCTL IS SIGNAL a:STD_LOGIC; SIGNAL count:STD_LOGIC_VECTOR (1 downto 0); BEGIN PROCESS(clk) BEGIN IF clk'EVENT AND clk='1' THEN a<=not a; END IF; END PROCESS;PROCESS(fin) BEGIN IF fin'EVENT AND fin='1' THEN IF a='0' then IF count="11" then load<

12、='0'clr_cnt<='1' ELSE load<='1'count<=count+1;clr_cnt<='0' END IF; ELSE count<="00"load<='0'clr_cnt<='0' END IF; END IF; END PROCESS; tsten<=a;END; 闸门控制模块的仿真波形如图3.4所示,图中clk是输入的时针信号,tesen是clk的二分频。图中还有fin时针,它的频率要远小于clk,作

13、用是作为一个计数器的时针,当tsten为低电平且计数器值不为3时,load等于1。而当tsten为低电平且计数值为3时,产生一个清零信号CLR_CNT。3、可自动换挡基准时钟模块的设计本设计通过控制基准时钟信号来时现量程的自动转换。如果一个周期为0.1s的信号作为时钟信号通过一个进制计数器,从十进制计数器的进位输出端将会得到一个周期为1s的信号。因此,频率计的三档位可以通过计数器相级联来实现,如图3.5所示:CLK1KO4EN 图3.5 :可自动换挡基准计时模块图:图中3选1的选择器可以根据十进制计数器模块的溢出情况来作为选择标准。先使可自动变换档的基准计时模块工作在0挡,若被测频率高于0挡的

14、范围。则会使4位十进制计数器模块产生溢出,用这个溢出信号来使自动换挡基准时钟模块工作在一档;同理,如果被测频率还是高出一挡的测量范围,就在自动换为二档。若被测频率任高于二档的测量范围,则输出一报警信号。可自动换挡基准计时模块的VHDL源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux3 ISPORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); y:OUT STD_LOGIC; o:OUT STD_LOGIC; input0:in STD_LOGIC;input1:in STD_LOGIC;input2:i

15、n STD_LOGIC);END mux3;ARCHITECTURE example5 OF mux3 ISBEGIN PROCESS(input0,input1,input2,a)BEGIN CASE a IS WHEN"0000"=>y<=input0;o<='0' WHEN"0001"=>y<=input1;o<='0' WHEN"0010"=>y<=input2;o<='0' WHEN"0011"=>

16、y<='0'o<='1' WHEN OTHERS=>null;END CASE;END PROCESS;END;图中将所有计数器的清零信号接地,因为清零信号为高电平有效,接地信号一直保持低电平,这样保证计数器不会被清零,一直正常工作。所有计数器的使能端需要一个高电平信号EN使其一直保持正常工作。最后一个计数器并不属于实现基准信号换挡功能的计数器组,它直接为三选一选择器mux3服务,统计来自4位十进制计数器模块的最高位进位信号的个数。Y输出端输出已经调整了的适合于被测频率的基准时钟信号。4、锁存模块的设计锁存模块的功能是将4个十进制计数器的数据,

17、在LOAD信号有效时(LOAD=1)锁存到寄存器中,其VHDL源程序如图所示:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG16 ISPORT(DIN0:IN STD_LOGIC_VECTOR(3 DOWNTO 0); DIN1:IN STD_LOGIC_VECTOR(3 DOWNTO 0); DIN2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); DIN3:IN STD_LOGIC_VECTOR(3 DOWNTO 0); LOAD:IN STD_LOGIC; DOUT0:OUT STD_LOGIC_VECTOR(3

18、DOWNTO 0); DOUT1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END REG16;ARCHITECTURE one OF REG16 ISBEGINPROCESS(LOAD) BEGIN IF LOAD'event and LOAD='1'THEN DOUT0<=DIN0; DOUT1<=DIN1; DOUT2<=DIN2; DOUT3<=DIN3;

19、END IF; END PROCESS;END one;5、 译码显示模块的设计与实现 数字逻辑系统中常用的显示器件是数码管,半导体是数码管的外形和等效电路如图6-27所示,其每一个字段都是一个发光二级管(Light Emitting Diode,LED), 因而也称之为LED数码管或LED显示器。LED数码管用7段发光二极管(带小数点时为8段)来显示数字,每一段都是一个发光二极管,一般把所有段的相同一端相连,连接到地(共阴极接法)或者是连接到电源(共阳极接法)。共阴级LED数码管的公共端连接到地,另一端分别接一个限流电阻后再接到控制电路的信号端,当信号端为高电平时,该段即被点亮,否则不亮。共

20、阳极接法则相反,公共端连接到电源,另一端分别接一个限流电阻后再接到控制电路的信号端,只有信号端为低电平时才被点亮,否则不亮。数码管的扫描方式有两种:静态扫描和动态扫描。静态扫描方式简单,动态扫描方式节约资源。从资源角度出发,这里采用动态扫描方式。采用扫描方式来实现LED数码管动态显示,控制好数码管之间的延时是相当重要。根据人眼视觉暂留原理,LED数码管每秒的导通16次以上,人眼就无法分辨LED数码管短暂的不亮,认为是一直点亮的(其实LED数码管是以一定频率在闪动的)。但是,延时(导通频率)也不是越小越好,因为LED数码管达到一定亮度需要一定时间。如果延时控制的不好则会出现闪动,或者亮度不够。据

21、经验,延时0.005秒可以达到满意的效果。另外,显示的字符有变化时,可在延时到达后送一个低电平(共阴极数码管)让LED数码管先短暂熄灭,再显示下一个字符,可使在视觉上字符的变化更清晰。 7段数码显示译码器的VHDL设计该模块将显示寄存器的四位BCD数字符译成7段码,其VHDL源程序如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity dec7s isport(din:in bit_vector(3 downto 0); dout:out bit_vector(6 downto 0);end;architecture example2 of dec

22、7s isbegin process(din) begin case din is when"0000"=>dout<="0111111" when"0001"=>dout<="0000110" when"0010"=>dout<="1011011" when"0011"=>dout<="1001111" when"0100"=>dout<="11

23、00110" when"0101"=>dout<="1111101" when"0110"=>dout<="0111111" when"0111"=>dout<="0000111" when"1000"=>dout<="1111111" when"1001"=>dout<="1101111" when"1010&quo

24、t;=>dout<="1110111" when"1011"=>dout<="1111100" when"1100"=>dout<="0111001" when"1101"=>dout<="1011110" when"1110"=>dout<="1111001" when"1111"=>dout<="1100001&

25、quot; when others=>null; end case; end process;end example2;程序中,din是09的BCD码输入,dout为译码后的7段数据信号,SEL是数码管的位选信号。 一位进制的源程序如下:library IEEE;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt16v isport(clk:in std_logic;-cout:out std_logic;-en:in std_logic;cq:out std_logic_vector(1 down

26、to 0);end cnt16v;ARCHITECTURE examplel of cnt16v isbegin process(clk)variable cqi:std_logic_vector(1 downto 0);beginif clk 'event and clk='1' thenif cqi<3 then cqi:=cqi+1;else cqi:=(others=>'0');end if;end if;-if cqi=15 then cout<='1'-else cout<='0'-en

27、d if;cq<=cqi;end process;end examplel ;:四选一选择器的的源程序如下LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux41 ISPORT(a:IN STD_LOGIC_VECTOR(1 DOWNTO 0); y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); input0:in STD_LOGIC_VECTOR(3 DOWNTO 0);input1:in STD_LOGIC_VECTOR(3 DOWNTO 0);input2:in STD_LOGIC_VECTOR(3 DOWNT

28、O 0);input3:in STD_LOGIC_VECTOR(3 DOWNTO 0);END mux41;ARCHITECTURE example6 OF mux41 ISBEGIN PROCESS(input0,input1,input2,input3,a)BEGIN CASE a IS WHEN"00"=>y<=input0; WHEN"01"=>y<=input1; WHEN"10"=>y<=input2; WHEN"11"=>y<=input3; WHEN

29、OTHERS=>null;END CASE;END PROCESS;END example6;library ieee;use ieee.std_logic_1164.all;entity choose_decoder isport(sel:in std_logic_vector(1 downto 0); choose:out std_logic_vector(3 downto 0);end choose_decoder;architecture rtl of choose_decoder isbeginprocess(sel)begincase sel iswhen "00&

30、quot;=>choose<="0001"when "01"=>choose<="0010"when "10"=>choose<="0100"when "11"=>choose<="1000"when others=>choose<="ZZZZ"end case;end process;end rtl;由于实验时没有的量程,所以我们选用的量程用分频器实现实验的要求,且分频器的的

31、源程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity div isport(clk:in std_logic; rst:in std_logic; divclk:out std_logic);end div;architecture behavioral of div issignal divcounter:std_logic_vector(20 downto 0);signal div_clk:std_logic;be

32、ginprocess(clk,rst)beginif (rst='1') thendivcounter<="000000000000000000000"div_clk<='0'elsif(rising_edge(clk) thendivcounter<="000000000000000000000"div_clk<=not div_clk;elsedivcounter<=divcounter+1;end if;end if;end process;divclk<=div_clk;end behavioral;6、 频率计电路顶层原理图的设计(1)、频率计主体电路顶层原理图设计在成功完成低层单元电路模块设计仿真后,可根据测频原理框图,可完成图3.7所示的频率计电路顶层原理图的设计文件。该电路中定时信号模块、控制信号发生器模块、4位十进制计数器模块、寄存显示模块为前面设计低层单元电路模块。clk为系

温馨提示

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

评论

0/150

提交评论