图3.1 数字频率计的电路原理框图
3.3、设计思路及解决方案
设计方案自顶向下设计,底层模块分时基产生与测评时序控制电路模块、待测信号脉冲计数电路模块、译码显示与锁存控制电路模块。 (1)时基产生与测评时序控制电路模块:
设计频率记得关键是设计一个测频率控制信号发生器(即时基产生与测评时序控制电路模块),产生测量频率 控制时序。控制时钟信号clk取为1Hz,二分频后即可产生一个脉宽为1s的时钟control-en ,以此作为计数闸门信号。当control-en为高电平时,允许计数;当control-en的下降沿时,应产生一个锁存信号,将计数值保存起来;锁存数据后,在下一个control-en上升沿到来之前对计数器清零,为下次计数做准备。 (2)待测信号脉冲计数电路模块
待测信号脉冲计数电路模块就是计数器,计数器以待测信号作为时钟,在清零信号clr到来时,异步清零;使能信号en为高电平时允许计数,为低电平时禁止计数。
(3)锁存与译码显示控制电路模块
锁存器在control-en下降沿到来时,将计数器的计数值锁存,这样就不会因为周期性的清零信号而不断闪烁了。
译码显示电路将计数器测得的BCD码数字转换为七段晶体管LED显示(0——9),显示出十进制的数字结果。
4.分层次方案设计及代码描述
4.1.底层程序源码
1、时基产生与测频时序控制电路模块的VHDL源程序
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity control is
port (clk:in std_logic; --定义输入 rst,ena: out std_logic); --定义输出 end control;
architecture behv of control is begin
process (clk) --clk为敏感信号 variable cqi :std_logic_vector(2 downto 0); begin
if clk'event and clk='1' then --时钟上升沿 if cqi <1 then cqi:=cqi+1;ena<='1';rst<='0'; elsif cqi=1 then cqi :=(others =>'0'); ena<='0';rst<='1'; end if; end if;
end process; --进程结束 end behv;
2、待测信号脉冲计数电路模块的VHDL源程序
(1)10进制计数器:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entityt10 is
port (rst,fx,ena:in std_logic; --rst,fx,ena为输入端口 cout: out std_logic;
outy :out std_logic_vector(3 downto 0)); endt10;
architecture behv oft10 is begin
process (rst,ena,fx) --rst,fx,ena为敏感信号 variable cqi :std_logic_vector(3 downto 0); begin
if rst='1' then cqi :=(others =>'0'); --执行清零 elsif fx'event and fx='1' then --fx上升沿 if ena ='1' then --如果使能信号为1 if cqi < 9 then cqi:=cqi+1;cout<='0'; elsif cqi=9 then cqi :=(others =>'0'); cout<='1'; end if;
elsif ena='0' then cqi:=(others =>'0'); --使能信号为0 end if; end if; outy <=cqi;
end process; --进程结束 end behv;
(2)4位10进计数器:
library ieee;
use ieee.std_logic_1164.all; entityt10_4 is
port(fx,rst,ena:in std_logic; --定义输入
d:out std_logic_vector(15 downto 0)); --定义输出
end entity;
architecture one oft10_4 is componentt10
port (rst,fx,ena:in std_logic; cout: out std_logic;
outy :out std_logic_vector(3 downto 0)); end component;
signal e:std_logic_vector(3 downto 0); begin --元件例化
u1:cnt10 port map(fx=>fx,rst=>rst,ena=>ena,cout=>e(0),outy=>d(3 downto 0));
u2:cnt10 port map(fx=>e(0),rst=>rst,ena=>ena,cout=>e(1),outy=>d(7 downto 4));
u3:cnt10 port map(fx=>e(1),rst=>rst,ena=>ena,cout=>e(2),outy=>d(11 downto 8));
u4:cnt10 port map(fx=>e(2),rst=>rst,ena=>ena,cout=>e(3),outy=>d(15 downto 12));
end architecture one;
(3)锁存器的VHDL源程序
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity latch4 is
port(d:in std_logic_vector(15 downto 0); --d,ena,clk为锁存器输入 ena,clk:in std_logic;
q:out std_logic_vector(15 downto 0)); --q为锁存器输出 end latch4;
architecture one of latch4 is begin
process(clk,ena,d) --ck,d,,ena为敏感信号 variable cqi:std_logic_vector(15 downto 0); begin
if ena='0' then cqi:=cqi;
elsif clk'event and clk='1' then cqi:=d; end if; q<=cqi;
end process; --进程结束 end one;
(4)译码显示电路的VHDL源程序
library ieee ;
use ieee.std_logic_1164.all;