VHDL语言设计数字频率计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字频率计的设计

一、频率计实现的功能

要设计的频率计的测量围为1MHz。为了提高测量的精度,量程分为三档,分别是:10kHz、100kHz、1MHz。并要求在测量频率大于或小于选择的量程时,频率计自动换档。

1、当读数大于999时,频率计处于超量程状态,下一次测量时,量程自动增加一档。

2、当读数小于009时,频率计处于欠量程状态,下一次测量时,量程自动减小一档。

3、当超出测量围时,显示错误。

4、在计数时不显示数据,计数完成后只显示测量结果。

5、小数点位置要自动移位。

二、频率计各部分的分析

在这个设计中,需要用计数器来进行计数,而且计数器在各个档位要被重复使用,在测量的过程中,计数允许时钟信号还要进行调整,故将计数器设计成一个单独的模块,提供计数值的输出。显示结果包括数值显示,档位显示及溢出标志显示。其中数值显示要用到三个数码管,实验箱上连在一起的三个数码管中,只有两个数码管部接有译码器,因此我们自己还要在程序中为那个没有译码器的数码管再加一段七段译码器程序来显示结果。档位标志由三个LED灯来显示,代替数码管上的小数点的功能。溢出标志由两个LED灯来显示,其中一个显示结果溢出,另一个显示输入信号在测量围之。

该频率计的顶层逻辑电路原理图如图(1)所示:

图(1)

三、频率计各部分的设计和实现

从上面的分析可以知道,频率计可以由三个模块来组成。下面对各个模块的设计方法和实现方法进行详细说明。

1、时基进程的设计和实现

在实际使用时,输入的信号是随意的,没有办法预知输入的频率。因此选取频率计的时基是非常重要的。在设计要求中,将量程分为三档,在某一档进行测量时,需要提供该档的

时基。在10kHz档,该档最大读数为9.99kHz,最小读数为0.01 kHz,所以要提供的时基是频率为0.01 kHz的脉冲。同理,在100 kHz档上,要提供的时基应该是频率为0.1 kHz 的脉冲。在1 MHz档上,要提供的时基是频率为1 kHz的脉冲。这三种脉冲信号从输入信号中提取,可以采用分频的方法来产生。将输入信号先进行分频产生1 kHz的脉冲信号,然后将分频后的1 kHz信号通过一个10倍的分频器,产生0.1 kHz的脉冲信号,同时使用一个100倍分频器对1 kHz的信号分频产生0.01 kHz的脉冲信号。

在测量频率时,采用输入信号作为时基,以输入信号为时钟,用一个计数器测量在一个时基周期里输入的信号的周期数,这样就可以得到输入信号的频率。产生一个高电平为时基信号周期的脉冲信号作为时基,使得能够在程序中以“如果时基信号为1”作为判断条件,如果满足条件则计数器开始计数。同理,在设计中还要产生高电平为时基信号周期的1/10和1/100的脉冲信号作为时基。

这三种时基采用有限状态机来实现。状态机采用1kHz的脉冲信号触发,由于还要产生高电平为10ms和1ms的脉冲信号,故采用100个状态的有限状态机。要产生高电平为1ms 的脉冲信号,只要在状态99的时候产生高电平,状态100的时候恢复到低电平即可。要产生高电平为10ms的脉冲信号,只要在状态90的时候产生高电平,在状态100的时候恢复到低电平即可。需要产生哪一个时基就根据此时频率计所在的档位作为判断条件进行控制。在100个状态中,很多状态的功能是相同的,可以将它们合并在一起。

2、计数器的设计和实现

为了计数方便,将计数器定义成一个整型信号。只要使用“计数器<=计数器+1;”就可以。这个计数值要作为显示输出,就要将这个计数器用个位、十位、百位分开表示,并且要遵循加法规则。这样可以直接通过七段译码器进行显示。在不同的档位,小数点的位置是不同的,可以用小数点的显示所在的档位为判断条件。由于实验箱上的数码管没有小数点的,故在实验板上用三个LED灯来代替小数点的现实。

计数器的VHDL语言描述如程序1所示。其中,reset为异步置位端口,sig_clk为时钟输入端口,en为信号输入端口,q1为计数值的个位输出端口,q2为计数值的十位输出端口,q3为计数值的百位输出端口。cou1为计数值的个位,cou2为计数值的十位,cou3为计数值的百位。ctrcou为控制计数功能的进程,outctr为控制计数值输出的进程。

程序1:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

entity counter is

port(reset:in std_logic;

sig_clk:in std_logic; --时钟输入端口

en:in std_logic; --信号输入端口

q1:out std_logic_vector(3 downto 0); --计数值的个位输出端口

q2:out std_logic_vector(3 downto 0); --计数值的十位输出端口

q3:out std_logic_vector(3 downto 0)); --计数值的百位输出端口

end;

architecture count of counter is

signal cou1:std_logic_vector(3 downto 0); --计数值的个位

signal cou2:std_logic_vector(3 downto 0); --计数值的十位

signal cou3:std_logic_vector(3 downto 0); --计数值的百位

begin

--控制计数功能的进程

ctrcou:process(reset,sig_clk)

begin

if reset='1' then

cou1<= "0000";

cou2<= "0000";

cou3<= "0000";

else

if sig_clk 'event and sig_clk = '1' then

if en ='1' then

if cou3 = "1010" then

cou3 <="1010";

elsif cou3 ="1001" and cou2 ="1001" and cou1 = "1001" then

cou1 <= "0000";

cou2 <= "0000";

cou3 <= "1010";

elsif cou1 ="1001" and cou2 ="1001" then

cou1 <= "0000";

cou2 <= "0000";

cou3 <=cou3+1;

elsif cou1 ="1001" then

cou1 <="0000";

cou2 <=cou2+1;

else

cou1<=cou1+1;

end if;

else

cou1 <= "0000";

cou2 <= "0000";

cou3 <= "0000";

end if;

end if;

end if;

end process ctrcou;

--控制计数值输出的进程

outctr: process(reset,en)

begin

相关文档
最新文档