这次把自己做过的一个频率计拿出来跟大家分享一下。
项目采用VHDL语言来编写。
一、功能介绍
对信号源输入信号的频率进行正确测量并显示
测量范围:0-9999Hz;
测量精度:1Hz;
测量误差:1Hz;
因为用的FPGA板只有四个数码管,所以就采用了测量范围为0-9999,后面你们可以根据情况来增加测量范围。项目框图如下:
实现的功能是将输入的信号频率测量出来并且通过开发板上面的四个数码管显示出来,采用计频法,测量单位时间的脉冲个数。这里的单位时间我采用一秒(方便测量信号频率),因为值比较小,所以误差范围为1Hz。这里的一秒信号由板子的自带的50Mhz信号分频得到。
二、作品原理
我的设计原理是先通过24999999分频模块得到一个高低电平各为0.5秒,周期为1秒的信号clkin,然后再设计一个标志位,当clkin信号为高电平时候使标志位为01(用来当一个闸门使用),然后当标志位为01时候,测量此期间的输入信号有几个上升沿,然后当我clkin信号出现上升沿并且clkin为0时候将测量出的上升沿数量输出给译码器并且将用来测量信号频率值的信号量置零,方便下次计数。原理是利用计频法来测量信号频率值(在一个特定信号周期内,我通过测量输入信号有多少个上升沿),这里我们采用一秒的周期,这样我们测量出一秒内有几个上升沿就可以得到输入信号的频率值。然后再通过四个数码管将四位频率值进行显示输出。
这里举例其中两个模块!!!
三、各模块设计
3.1分频模块设计
这里的分频模块是为了得到1Hz的信号,因为板子上面带的信号频率为50MHz,所以这里进行50MHz分频得到1Hz的信号,当做闸控信号。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity devide50m is
port(clkin:in std_logic;
clkout:buffer std_logic);
end;
architecture rtl of devide50m is
begin
process(clkin)
variable num:integer range 0 to 24999999; --定义一个变量,范围为0-49999999
begin
if clkin'event and clkin='1' then
if num<(24999999) then num:=num+1; --得到0.5秒的高电平
else num:=0;clkout<=not clkout; --得到0.5秒的低电平
end if;
end if;
end process;
end;
3.2译码显示模块设计
将测量出的频率值通过译码显示模块显示出来。
library ieee;
use ieee.std_logic_1164.all;
entity display is
port(data:in std_logic_vector(3 downto 0);
seg:out std_logic_vector(6 downto 0)); --输出七段
end;
architecture rtl of display is
begin
process(data)
begin
case data is
when "0000"=>seg<="1000000"; --根据不同的值选择不同的输出,如下同理
when "0001"=>seg<="1111001";
when "0010"=>seg<="0100100";
when "0011"=>seg<="0110000";
when "0100"=>seg<="0011001";
when "0101"=>seg<="0010010";
when "0110"=>seg<="0000010";
when "0111"=>seg<="1111000";
when "1000"=>seg<="0000000";
when "1001"=>seg<="0010000";
when others=>seg<="ZZZZZZZ";
end case;
end process;
end;
3.3顶层文件及文字说明
先是50MHz信号输入进来到分频器,经过分频器后输出1Hz的时钟信号,然后这个1Hz的信号连接到标志位产生模块和计数模块,作用是为了闸控作用,当我clkin出现上升沿时候产生一个标志位给后面的计算模块,然后计数模块接收到标志位开始计数输入信号的频率,然后当1Hz的信号从低电平变为高电平时候,将计数频率的值输送给译码模块显示出来。
项目资源包:https://download.csdn.net/download/OMGMac/18840555
本设计仅供借鉴学习,请勿用于商业用途!!!
本人水平有限,上述信息仅供参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~