数字频率计是直接用十进制数字来显示被测信号频率的一种测量装置。它不仅可以测量正弦波、方波、三角波、尖脉冲信号和其他具有周期特性的信号的频率,而且还可以测量它们的周期。经过改装,可以测量脉冲宽度,做成数字式脉宽测量仪;可以测量电容做成数字式电容测量仪;在电路中增加传感器,还可以做成数字脉搏仪、计价器等。因此数字频率计在测量物理量方面应用广泛。本设计用VHDL在CPLD器件上实现数字频率计测频系统,能够用十进制数码显示被测信号的频率,能够测量正弦波、方波和三角波等信号的频率,而且还能对其他多种物理量进行测量。具有体积小、可靠性高、功耗低的特点。数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。采用VDHL编程设计实现的数字频率计,除被测信号的整形部分、键输入部分和数码显示部分以外,其余全部在一片FPGA芯片上实现,整个系统非常精简,而且具有灵活的现场可更改性。在不更改硬件电路的基础上,对系统进行各种改进还可以进一步提高系统的性能。该数字频率计具有高速、精确、可靠、抗干扰性强和现场可编程等优点。
关键字:FPGA芯片、VHDL语言、数字频率计、数字频率计原理图、Max+plusII软件、EDA技术
第1章 概述…………………………………………………………………1
第2章 频率计的技术性能指标……………………………………………2
第3章 频率计测量频率和周期的设计原理及方框图……………………2
第4章 频率计的模块设计…………………………………………………3
4.1 计数模块………………………………………………………………4
4.1.1 十进制计数器设计及元件符号图………………………………5
4.1.2 四位十进制计数器仿真波形及元件符号图……………………7
4.2 控制模块………………………………………………………………7
4.2.1 闸门信号仿真波形及元件符号图………………………………13
4.2.2 控制信号发生器电路图…………………………………………13
4.2.3 控制信号发生器仿真波形及元件符号图………………………14
4.3 分频模块………………………………………………………………15
4.3.1 分频电路图的设计………………………………………………17
4.3.2 分频电路仿真波形及元件符号图………………………………18
4.4 译码模块………………………………………………………………18
4.4.1 寄存器程序设计及元件符号图…………………………………19
4.4.2 动态扫描电路程序设计及元件符号图…………………………20
4.4.3 七段数码管驱动电路程序设计及元件符号图…………………22
4.4.4 译码电路图设计…………………………………………………24
4.4.5 译码电路仿真波形及元件符号图………………………………24
4.5 量程自动切换模块……………………………………………………25
4.5.1 量程自动切换电路图设计………………………………………26
4.5.2 量程自动切换仿真波形及元件符号图…………………………27
第5章 频率计测量频率的电路图和仿真波形……………………………28
第6章 频率计测量周期的设计……………………………………………29
6.1 分频模块………………………………………………………………29
6.1.1 分频电路图………………………………………………………31
6.1.2 分频电路仿真波形及元件图……………………………………32
6.2 控制模块………………………………………………………………32
6.2.1 控制电路图………………………………………………………33
6.2.2 控制电路仿真及元件符号图……………………………………33
6.3 量程切换模块…………………………………………………………33
6.3.1 量程切换电路图…………………………………………………35
6.3.2 量程切换仿真波形及元件符号图………………………………36
6.6 频率计测量周期顶层电路设计………………………………………36
6.6.1 频率计测量周期原理图和仿真波形……………………………37
第7章 下载调试……………………………………………………………38
7.1编译和管脚配置………………………………………………………38
7.2编程下载和测试………………………………………………………38
7.3心得体会………………………………………………………………38
结束语…………………………………………………………………………39
致谢……………………………………………………………………………39
参考文献………………………………………………………………………39
第1章.概述
所谓频率,就是周期性信号在单位时间(1s)里变化的次数。
本频率计设计测量频率的基本原理是,首先让被测信号与标准信号一起通过一个闸门,然后用计数器计数信号脉冲的个数,把标准时间内的计数的结果,用锁存器锁存起来,最后用显示译码器,把锁存的结果用LED数码显示管显示出来。
根据数字频率计的基本原理,本文设计方案的基本思想是分为五个模块来实现其功能,即整个数字频率计系统分为分频模块、控制模块、计数模块、译码模块和量程自动切换模块等几个单元,并且分别用VHDL对其进行编程,实现了闸门控制信号、计数电路、锁存电路、显示电路等。
本频率计设计还可以测量周期性信号,其基本原理与测量频率的基本原理基本一样,首先让被测信号与标准信号一起通过一个闸门,然后用计数器计数信号脉冲的个数,把被测信号一个周期内标准基准信号的脉冲计数的结果,用锁存器锁存起来,最后用显示译码器,把锁存的结果用LED数码显示管显示出来,显示管的读数就是被测信号以标准信号的周期为单位乘积的周期。
第2章.技术性能指标
能够测量正弦波、三角波、锯齿波、矩形波等周期性信号的频率;
能直接用十进制数字显示测得的频率;
频率测量范围:1HZ~10KHZ切量程能自动切换;
输入信号幅度范围为0.5~5V,要求一起自动适应;
测量时间:T〈=1.5S;
6)用CPLD/FPGA可编程逻辑器件实现;
第3章.频率计的设计原理
1.频率计测量频率的设计原理
(1)频率计测量频率的原理
频率计测量频率需要设计整形电路使被测周期性信号整形成脉冲,然后设计计数器对整形后的脉冲在单位时间内重复变化的次数进行计数,计数器计出的数字经锁存器锁存后送往译码驱动显示电路用数码管将数字显示出来,需要设计控制电路产生允许计数的门闸信号、计数器的清零信号和锁存器的锁存信号使电路正常工作,再设计一个量程自动转换电路使测量范围更广。
(2)频率计测量频率的原理图
频率计测量频率的原理图如下:
2.频率计测量周期的原理
(1)频率计测量周期的原理
频率计测量周期需要设计整形电路使被测周期性信号整形成脉冲,然后设计计数器对基准信号在被测信号一个周期内重复变化的次数进行计数,计数器计出的数字经锁存器锁存后送往译码驱动显示电路用数码管将数字显示出来,需要设计控制电路产生允许计数的使能信号、计数器的清零信号和锁存器的锁存信号使电路正常工作,再设计一个量程自动转换电路使测量范围更广。
(2)频率计测量周期的原理图
频率计测量周期的原理土如下:
第4章.频率计测量频率的层次化设计方案
1.4位十进制计数器模块
4位十进制计数器模块包含4个级联十进制计数器,用来对施加到时钟脉冲输入端的待测信号产生的脉冲进行计数,十进制计数器具有集束使能、清零控制和进位扩展输出的功能。使能信号和清零信号由闸门控制模块的控制信号发生器所产生来对4个级联十进制计数器周期性的计数进行控制。
(1)十进制计数器元件的设计
十进制计数器的程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity jishu10 is
port(clk,rst,en:in std_logic;
cq:out std_logic_vector(3 downto 0);
cout:out std_logic);
end jishu10;
architecture behav of jishu10 is
begin
process(clk,rst,en)
variable cqi:std_logic_vector(3 downto 0);
begin
if rst='1' then cqi:=(others=>'0');
elsif clk'event and clk='1' then
if en='1' then
if cqi<9 then cqi:=cqi+1;
else cqi:=(others=>'0');
end if;
end if;
end if;
if cqi=9 then cout<='1';
else cout<='0';
end if;
cq<=cqi;
end process;
end behav;
在源程序中COUT是计数器进位输出;CQ[3..0]是计数器的状态输出;CLK是始终输入端;RST是复位控制输入端,当RST=1时,CQ[3..0]=0;EN是使能控制输入端,当EN=1时,计数器计数,当EN=0时,计数器保持状态不变。编译成功后进行仿真,其仿真波形如下:
在项目编译仿真成功后,将设计的十进制计数器电路设置成可调用的元件jishu10.sym,用于以下的顶层设计。
(2)4位十进制计数器的顶层设计
新建一个原理图编辑窗,从当前的工程目录中凋出4个十进制计数器元件jishu10.sym,并按如图所示的4位十进制计数器的顶层原理图完成电路连接。
完成4位十进制计数器的原理图编辑以后,即可进行仿真测试和波形分析,其仿真输出波形如图所示,当RST=0、EN=1是其计数值在0到9999之间循环变化,COUT为计数进位输出信号,作为后面的量程自动切换模块的输入脉冲。
因此仿真结果正确无误,可将以上设计的4位十进制计数器设置成可调用的元件jishu10_4.sym,以备高层设计中使用,其元件符号图如下图所示。
2.控制模块设计
1)闸门信号的设计
频率计电路工作时先要产生一个计数允许信号(即闸门信号),闸门信号的宽度为单位时间,如1S。在闸门信号有效时间内,对被测信号计数,即为信号的频率。该频率计电路的精度取决于闸门信号T。
本设计中选取的基准信号频率为750khz,为了得到1s高电平的周期性闸门信号,本设计采用对频率为750khz基准信号先进行75分频,再进行3个10分频,最后进行11分频,再用非门对分频出的信号进行取非变换,这样得到的门闸信号高电平为1秒钟。
(1)75进制计数器的程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity jishu75 is
port(clk,rst,en:in std_logic;
cq:out std_logic_vector(7 downto 0);
cout:out std_logic);
end jishu75;
architecture behav of jishu75 is
begin
process(clk,rst,en)
variable cqi:std_logic_vector(7 downto 0);
begin
if rst='1' then cqi:=(others=>'0');
elsif clk'event and clk='1' then
if en='1' then
if cqi<74 then cqi:=cqi+1;
else cqi:=(others=>'0');
end if;
end if;
end if;
if cqi=74 then cout<='1';
else cout<='0';
end if;
cq<=cqi;
end process;
end behav;
编译成功后生成元件图如下:
(2)11进制计数器的程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity jishu11 is
port(clk,rst,en:in std_logic;
cq:out std_logic_vector(3 downto 0);
cout:out std_logic);
end jishu11;
architecture behav of jishu11 is
begin
process(clk,rst,en)
variable cqi:std_logic_vector(3 downto 0);
begin
if rst='1' then cqi:=(others=>'0');
elsif clk'event and clk='1' then
if en='1' then
if cqi<10 then cqi:=cqi+1;
else cqi:=(others=>'0');
end if;
end if;
end if;
if cqi=10 then cout<='1';
else cout<='0';
end if;
cq<=cqi;
end process;
end behav;
编译成功后生成元件图如下:
3).D触发器的设计
其程序如下:
library ieee;
use ieee.std_logic_1164.all;
entity reg_2 is
port(clk,d:in std_logic;
q:out std_logic);
end reg_2;
architecture behav of reg_2 is
signal q1:std_logic;
begin
process(clk)
begin
if clk'event and clk='1' then
q1<=d;
end if;
end process;
q<=q1;
end behav;
编译成功后生成如下元件图:
将生成的75进制计数器、11进制计数器、10进制计数器和非门按下图连接来得到1S高电平门闸信号。
将其电路图进行仿真,其仿真波形如下:
对照其仿真波形,其输出门闸信号高电平为1S,符合设计,将其电路生成如下元件图,以便顶层调用。
2).控制信号发生器模块
该模块主要根据输入高电平的1S闸门信号,产生计数允许信号EN,该信号的高电平的持续时间即计数允许时间,与输入的门闸控制时钟脉冲周期相同;产生清零信号RST,在计数使能前对计数器先清零;产生存储信号LOAD,在计数结束后,利用上升沿把最新的频率测量值保存在显示寄存器中。
为了产生清零信号RST,使能信EN和存储信号LOAD。不失一般性,控制信号发生器用74161构成4分频计数器,用一个与非门,一个或非门和一个异或门实现3种译码状态,与闸门模块按下图连接。
编译成功后进行仿真,其仿真波形如下:
该功能正确无误后生成的元件符号图如下图所示。
3.分频模块的设计
当被测频率超出量程时,设计分频模块对被测频率进行分频衰减,单位上升,从而扩大测量频率的范围。
1).四选一数据选择器
四选一数据选择器的程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity si_xuan_1 is
port(a,b,c1,c2,c3,c4:in std_logic;
y:out std_logic);
end si_xuan_1;
architecture behav of si_xuan_1 is
signal x:std_logic_vector(1 downto 0);
begin
process(a,b)
begin
x<=b&a;
case x is
when"00"=> y<=c1;
when"01"=> y<=c2;
when"10"=> y<=c3;
when"11"=> y<=c4;
when others=>null;
end case;
end process;
end behav;
编译成功后进行仿真,其仿真波形如下图:
其仿真波形真确无误后生成元件符号图如下图所示。
2)分频电路的设计
将生成的四选一数据选择、74139译码器、D触发器和3个十进制计数器按下图连接。
编译成功后进行仿真,起仿真波形如下图:
如图所示,此电路图实现了将被测信号进行分频功能,通过四选一数据选择器的控制按不同的BA二进制数值时输出被测信号的1分频、10分频、100分频、1000分频,通过二四译码器按不同的BA二进制数值时输出四个档次p0、p1、p2、p3,分别代表1hz、10hz、100hz、1000hz为单位,其功能正确无误后生成可调用的元件图如下:
4.译码模块
译码模块是对计数出的数进行译码显示出来,该部分由寄存器、动态扫描电路和译码驱动电路组成。
1).寄存器设计
寄存器是在计数结束后,利用触发器的上升沿把最新的频率测量值保存起来,这样在计数过程中可不必一直看着数码管显示器,显示器将最终的频率读数定期进行更新,其输出将作为动态扫描电路的输入。4位寄存器的VHDL源程序如下。
library ieee;
use ieee.std_logic_1164.all;
entity reg_4 is
port(load:in std_logic;
din:in std_logic_vector(3 downto 0);
dout:out std_logic_vector(3 downto 0));
end reg_4;
architecture behav of reg_4 is
begin
process(din)
begin
if load’event and load='1' then
dout<=din;
end if;
end process;
end behav;
在源程序中LOAD 是锁存信号,上升沿触发;din[3..0]是寄存器输入;dout[3..0]
是寄存器输出。编译仿真后生成元件图如下图,以便顶层模块的调用。
2).动态扫描电路
本设计采用扫描方式来实现LED数码管动态显示,控制好数码管之间的延迟时间相当重要。根据人眼视觉暂留原理,LED数码管每秒导通16次以上,人眼就无法LED数码管短暂的不亮,认为是一直点亮的(其实LED数码管是以一定频率在闪动的)。但是,延时(导通频率)也不是越小越好,因为LED数码管达到一定亮度需要一定时间。如果延时控制的不好则会出现闪动,或者亮度不够,根据经验,延时0.005S可以达到满意的效果。另外,显示的字符有变化时,可在延时到达后送一个地电平(共阴极数码管)LED数码管先短暂熄灭,再显示一个字符,可使在视觉上字符的变化更清楚。
动态扫描显示的VHDL源程序如下。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity xu_dynamic is
port(clk,reset:in std_logic;
din1:in std_logic_vector(3 downto 0);
din2:in std_logic_vector(7 downto 4);
din3:in std_logic_vector(11 downto 8);
din4:in std_logic_vector(15 downto 12);
shift:out std_logic_vector(1 downto 0);
bus4:out std_logic_vector(3 downto 0));
end xu_dynamic;
architecture one of xu_dynamic is
signal scan_clk:std_logic_vector(1 downto 0);
begin
p1:process(clk,scan_clk,reset)
variable scan:std_logic_vector(17 downto 0);
begin
if reset='1' then
scan:="000000000000000000";
scan_clk<="00";
elsif clk'event and clk='1' then
scan:=scan+1;
end if;
scan_clk<=scan(1 downto 0);
end process p1;
p2:process(scan_clk,din1,din2,din3,din4)
begin
case scan_clk is
when"00"=>bus4<=din1;shift<="11";
when"01"=>bus4<=din2;shift<="10";
when"10"=>bus4<=din3;shift<="01";
when"11"=>bus4<=din4;shift<="00";
when others=>bus4<=din1;shift<="11";
end case;
end process p2;
end one;
程序中,CLK是扫描时钟;RST为复位信号,当RST=1时对位选信号复位,shitf为4个数码管的位选信号,高电平有效;din1、din2、din2、din3、din4为输入的锁存信号,bus4为选中的信号输出。
编译成功后生成元件图如下图:
3).七段数码管驱动电路的VHDL设计
library ieee;
use ieee.std_logic_1164.all;
entity decl7s is
port(a:in std_logic_vector(3 downto 0);
led7s:out std_logic_vector(6 downto 0));
end decl7s;
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。