这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » 采用等精度测频原理的频率计的程序

共2条 1/1 1 跳转至

采用等精度测频原理的频率计的程序

菜鸟
2009-10-14 20:12:23     打赏

采用等精度测频原理的频率计的程序

--文件名:PLJ.vhd。
--功能:4位显示的等精度频率计。
--最后修改日期:2009.3.10。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity PLJ is
port(clk:in std_logic; --基准时钟(10KHz)
tclk:in std_logic; --被测信号
start:in std_logic; --复位信号
alarm0,alarm1:out std_logic; --超量程,欠量程显示
dian:out std_logic_vector(3 downto 0); --小数点
data1:out integer range 0 to 9999); --频率数据
end PLJ;
architecture behav of PLJ is
signal q:integer range 0 to 9999; --预置闸门分频系数
signal q1:integer range 0 to 10000; --被测信号计数器
signal q2:integer range 0 to 20000; --基准信号计数器
signal en,en1:std_logic; --预置闸门,实际闸门
signal qq,qqq:integer range 0 to 200000000; --运算器
signal data0:integer range 0 to 9999; --频率数据中间信号

begin
process(clk) --此进程得到一个预置闸门信号
begin
if clk'event and clk='1' then
if start='1' then q<=0;en<='0';
elsif q=9999 then q<=9999;en<='0';
else q<=q+1;en<='1';
end if;
end if;
end process;

process(tclk) --此进程计被测信号脉冲数,和得到一个实际闸门信号
begin
if tclk'event and tclk='1' then
if start='1' then q1<=0;en1<='0';
elsif en='1' then q1<=q1+1;en1<='1';
else en1<='0';
end if;
end if;
end process;

process(clk) --此进程完成在实际闸门时间内,计基准脉冲数
begin
if clk'event and clk='1' then
if start='1' then q2<=0;
elsif en1='1' then
if q2=20000 then q2<=20000;
else q2<=q2+1;
end if;
end if;
end if;
end process;

process(clk) --此进程完成等精度频率计的运算
begin
if clk'event and clk='1' then
if start='1' then data0<=0;dian<="0000";alarm0<='0';alarm1<='0';qqq<=0;qq<=00;
elsif en1='0' then
if q1>=1000 then qq<=q1*10000; --根据q1的大小来判断小数点的位置
if qqq<qq then qqq<=qqq+q2;data0<=data0+1;dian<="0000"; --完成数据运算
elsif data0>=10000 then alarm0<='1'; --超量程显示
else data1<=data0;
end if;
elsif q1>=100 then qq<=q1*100000;
if qqq<qq then qqq<=qqq+q2;data0<=data0+1;
elsif data0>=10000 then data1<=1000;dian<="0000";
else data1<=data0;dian<="0010";
end if;
elsif q1>=10 then qq<=q1*1000000;
if qqq<qq then qqq<=qqq+q2;data0<=data0+1;
elsif data0>=10000 then data1<=1000;dian<="0010";
else data1<=data0;dian<="0100";
end if;
elsif q1>=1 then qq<=q1*10000000;
if qqq<qq then qqq<=qqq+q2;data0<=data0+1;
elsif data0>=10000 then data1<=1000;dian<="0100";
else data1<=data0;dian<="1000";
end if;
end if;
elsif q2>19999 then alarm1<='1'; --欠量程显示
else alarm1<='0';
end if;
end if;
end process;
end behav;

 




关键词: 采用     精度     测频     原理     频率计     程序     data0         

高工
2009-10-15 14:56:45     打赏
2楼
我以前用DSP2812做过这样的一个频率计,效果还不错,有时间探讨下。。。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]