这是大规模数字集成电路在系统可编程领域的经典课程设计。
数字频率计是近代电子技术领域的重要测量工具之一,同时也是其他许多领域广泛应用的测量仪器。数字频率计是在规定的基准时间内把测量的脉冲数记录下来,换算成频率并以数字形式显示出来。数字频率计用于测量信号(方波,正弦波或其他周期信号)的频率,并用十进制数字显示,它具有精度高,测量速度快,读数直观,使用方便等优点。
一个用VHDL语言实现的实例如下:
-- Project Name: 恒精度频率计
-- Target Devices: FPGA or CPLD
-- Revision 0.01 - File Created
-- Comments: clk--系统工作时钟,2MHz
-------------reset--系统复位信号,高电平有效
-------------Fx--为待测信号
-------------FreqNx--为待测信号的计数值
-------------FreqNs--为标准信号的计数值
-------------Freq--为待测信号的频率
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
----------------------------------------------------------
entity Cymometer is
generic(clk_freq : integer := 2000000);--系统工作时钟频率
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
Fx : in STD_LOGIC; ----待测信号
FreqNs : out natural;
FreqNx : out natural);
--Freq : out natural);
end Cymometer;
----------------------------------------------------------
architecture Behavioral of Cymometer is
----------------------------------------
signal start : STD_LOGIC;--此信号为高电平时计数器开始计数
signal CTRL : STD_LOGIC;--CTRL信号为待测信号和门控信号产生的计数器启动信号
signal CNTx : natural;--待测信号计数器
signal CNTs : natural;--标准信号计数器
----------------------------------------
begin
--***************************************--
--产生一个门控信号,高电平有效
GateCtrl : process(clk)
---------------------------
variable CNT0 : integer range 0 to 2_097_152;--门控信号计数器
---------------------------
begin
if rising_edge(clk) then
if reset='1' then
CNT0 := 0;
else
CNT0 := CNT0 + 1;
end if;
---------
if reset='1' then
start <= '0';
elsif CNT0 < (clk_freq*3/4) then
start <= '1';
else
start <= '0';
end if;
end if;
end process GateCtrl;
--***************************************--
--产生CTRL信号,由待测信号和门控信号产生的计数器启动信号
CtrlGen : process(Fx)
begin
if rising_edge(Fx) then
if reset='1' then
CTRL <= '0';
else
CTRL <= start;
end if;
end if;
end process CtrlGen;
--***************************************--
--用两个计数器分别对标准信号clk和待测信号signal计数
----------------------------------
--计数标准信号,CTRL高电平期间有效
CountS : process(clk)
begin
if rising_edge(clk) then
if reset='1' then
CNTs <= 0;
elsif CTRL='1' then
CNTs <= CNTs + 1;
else
CNTs <= 0;
end if;
end if;
end process CountS;
----------------------------------
--计数待测信号,CTRL高电平期间有效
CountX : process(Fx)
begin
if rising_edge(Fx) then
if reset='1' then
CNTx <= 0;
elsif CTRL='1' then
CNTx <= CNTx + 1;
else
CNTx <= 0;
end if;
end if;
end process CountX;
--***************************************--
--CTRL下降沿将技术结果和测量值输出
CountOut : process(CTRL)
begin
if falling_edge(CTRL) then
if reset='1' then
FreqNs <= 0;
FreqNx <= 0;
-- Freq <= 0;
else
FreqNs <= CNTs;
FreqNx <= CNTx;
-- Freq <= (clk_freq / CNTs * CNTx);
end if;
end if;
end process CountOut;
end Behavioral;
下面是为上面的模块编写的测试平台,在Modelsim下仿真通过,因为数据量较大,建议不要使用Altera及ISE仿真。
--------------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;
ENTITY tb IS
END tb;
ARCHITECTURE behavior OF tb IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT Cymometer
PORT(
clk : IN std_logic;
reset : IN std_logic;
Fx : IN std_logic;
FreqNs : OUT natural;
FreqNx : OUT natural;
Freq : OUT natural
);
END COMPONENT;
--Inputs
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal Fx : std_logic := '0';
--Outputs
signal FreqNs : natural;
signal FreqNx : natural;
-- signal Freq : natural;
-- Clock period definitions
constant clk_period : time := 500ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: Cymometer PORT MAP (
clk => clk,
reset => reset,
Fx => Fx,
FreqNs => FreqNs,
FreqNx => FreqNx,
-- Freq => Freq
);
-- Clock process definitions
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
--产生待测信号
Fx_process : process
begin
Fx <= '0';
wait for 2*clk_period;
Fx <= '1';
wait for 2*clk_period;
end process;
-- Stimulus process
stim_proc: process
begin
-- hold reset state for 100ms.
wait for clk_period*10;
reset <= '0';
-- insert stimulus here
wait;
end process;
END;
参考原理M/T测频法。
第1节 引言 2
1.1 数字频率计概述2
1.2 频率测量仪的设计思路与频率的计算2
1.3 基本设计原理3
第2节 数字频率计(低频)的硬件结构设计4
2.1系统硬件的构成4
2.2系统工作原理图4
2.3AT89C51单片机及其引脚说明 5
2.4信号调理及放大整形模块7
2.5时基信号产生电路7
2.6显示模块8
第3节 软件设计12
3.1 定时计数 12
3.2 量程转换 12
3.3 BCD转换12
3.4 LCD显示15
第4节 结束语 16
参考文献 20
附录 汇编源程序代码28
数字频率计是一种基本的测量仪器。它被广泛应用与航天、电子、测控等领域。它利用VHDL硬件描述语言进行设计,并在EDA(电子设计自动化)工具的帮助下,用大规模可编程器件(CPLD)实现数字频率计的设计原理及相关程序。通过了Max+plusⅡ软件进行仿真、硬件调 ... 你可以去这个网 址看看
一、 实验目的
1、 熟悉数字式频率计的基本工作原理。
2、 熟悉数字频率计中计数显示及控制等部分的综合设计及调试方法。
二、实验原理
数字频率计是测量电信号频率的仪器之一,其原理图如下所示:
......
被测信号经过放大整形成为脉冲信号,作为计数器的计数脉冲,计数器受控制门(闸门)的控制,闸门开启,计数器开始对输入的脉冲信号计数,若闸门开启的时间为1秒,则计数器累计的脉冲数就是被测信号的频率。在闸门关闭后,停止计数,计数器的状态写入锁存器,并通过译码器驱动数码管显示出测量值。这样,当再次测量(计数)时,数码管可以保持上一次的测得的数据。
三、 实验要求
1、 利用555定时器设计标准秒脉冲发生器电路。
2、 译码显示电路用实验箱中的四路数码管显示电路。
四、设计思路
根据实验原理框图,做如下设计:信号的放大部分可以用三极管放大电路来完成,而整形部分可用施密特触发器来完成,为简单起见,可用555来做。控制门用一个与门即可实现。两个单稳态触发器完全一样,均可用555来做。计数器用74LS160来完成,免去了接十进制计数器的麻烦(若用74LS161)。锁存电路用四路锁存器74LS75来完成。其输出可直接接到数电箱上的74LS247译码电路,进而显示结果。
在这次实验中,设计四位频率计,故需用四个74LS160和四个74LS75。
五、 实验器件
555定时器 74LS160 74LS75 74LS04 74LS00 电阻、电容若干
六、设计思路
这里主要说明一些参数的选择。
对施密特触发器只涉及到一个外接小电容,典型值为0.01uF。