5.10 采用测频法的数字频率计程序设计与仿真实验
1.实验目的
掌握测频法数字频率计的基本原理,设计VHDL程序实现其基本功能。 2.实验原理
系统组成的框图如图5.10.1所示,图中从左至右包括时基产生与测频时序控制电路模块,以及待测信号脉冲计数电路和锁存与译码显示控制电路模块。
FPGA 基准时钟 分频 闸门 复位信号 十进制 计数器
数据 锁存 动态 显示 译码 显 示 图5.10.1 系统组成框图
(1)控制模块
控制十进制计数器的计数及锁存器的工作,当计数器计数时,锁存器锁存前一次的计数状态,当计数器停止计数则锁存器接收计数器的计数数据,因此控制模块控制计数器与锁存器交替工作。
(2)计数器
由于需要使用LED显示频率,所以采用的是10进制可清零、使能功能的计数器模块 (3)锁存模块
接收四个计数器传输的信号进行锁存。 (4)译码显示模块
一共有6个LED需要显示,所以需要6个译码模块。 3.实验内容
(1)完成各基本模块的设计,并对各模块进行功能仿真,得到仿真波形。
(2)设计顶层文件,将各模块结合在一起,构成频率计整体,并进行仿真,检查程序功能是否完善。 (3)对设计进行引脚配置并下载。 4.实验预习与思考
(1)了解测频原理
197
(2)锁存模块在该系统的必要性。 (3)编写顶层设计文件时应当注意的问题。 5.程序设计与仿真 (1)程序设计
①顶层文件(freq_top.vhd)源程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity freq_top is
Port (CLKIN,RESET,QING1: IN STD_LOGIC; --控制信号
DQ1,DQ2,DQ3,DQ4 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);
--4位十进制数输出
COUTT : OUT STD_LOGIC);--进位输出 end freq_top;
architecture Behavioral of freq_top is
COMPONENT TESTCTL —元件说明 PORT ( rst, clkk : in std_logic;
cnt_en, rst_cnt, load : out std_logic); END COMPONENT;
COMPONENT CNT10
PORT ( CLK,RST,EN : IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC ); END COMPONENT; COMPONENT REG4B
Port ( load, QING : in std_logic;
din : in std_logic_vector(3 downto 0); dout : out std_logic_vector(3 downto 0)); END COMPONENT;
COMPONENT DECL7S
PORT (A : IN STD_LOGIC_VECTOR(3 DOWNTO 0); LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ); END COMPONENT;
--定义中间信号SIGNAL N : STD_LOGIC_VECTOR (24 DOWNTO 0); --秒分频 SIGNAL M : STD_LOGIC_VECTOR (11 DOWNTO 0); --被测信号
198
SIGNAL FIN,F1HZ,EN_S,RST_S,LOAD_S : STD_LOGIC;
SIGNAL CQ1,CQ2,CQ3,CQ4 : STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL COUT1,COUT2,COUT3 : STD_LOGIC;
SIGNAL DOUT1,DOUT2,DOUT3,DOUT4 : STD_LOGIC_VECTOR (3 DOWNTO 0);
begin
PROCESS(CLKIN,RESET) BEGIN
IF RESET='1' THEN N<=(OTHERS=>'0'); M<=(OTHERS=>'0'); ELSIF(CLKIN'EVENT AND CLKIN='1')THEN N<=N+1; M<=M+1; END IF; END PROCESS; F1HZ<=N(24); FIN<=M(11);
--元件例化
U1:TESTCTL PORT MAP (RST=>RESET,CLKK=>F1HZ,CNT_EN=>EN_S,
RST_CNT=>RST_S, LOAD=>LOAD_S);
U2 : CNT10 PORT MAP (FIN, RST_S, EN_S, CQ1, COUT1); U3 : CNT10 PORT MAP (COUT1, RST_S, EN_S, CQ2, COUT2); U4 : CNT10 PORT MAP (COUT2, RST_S, EN_S, CQ3, COUT3); U5 : CNT10 PORT MAP (COUT3, RST_S, EN_S, CQ4, COUTT); U6 : REG4B PORT MAP (LOAD_S, QING1, CQ1, DOUT1); U7 : REG4B PORT MAP (LOAD_S, QING1, CQ2, DOUT2); U8 : REG4B PORT MAP (LOAD_S, QING1, CQ3, DOUT3); U9 : REG4B PORT MAP (LOAD_S, QING1, CQ4, DOUT4); U10 : DECL7S PORT MAP (DOUT1, DQ1); U11 : DECL7S PORT MAP (DOUT2, DQ2); U12 : DECL7S PORT MAP (DOUT3, DQ3); U13 : DECL7S PORT MAP (DOUT4, DQ4);
end Behavioral;
②十进制计数器模块(cnt10.vhd)源程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity cnt10 is
Port (CLK,RST,EN : IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC ); end cnt10;
199
architecture Behavioral of cnt10 is
begin
PROCESS(CLK, RST, EN)
VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0):=\ BEGIN
IF RST = '1' THEN CQI := (OTHERS =>'0'); ELSIF CLK'EVENT AND CLK='1' THEN IF EN='1' THEN
IF CQI < \ ELSE CQI :=(OTHERS=>'0'); END IF; END IF; END IF;
IF CQI = \ ELSE COUT<= '0'; END IF; CQ <= CQI; END PROCESS;
end Behavioral;
③四位锁存器模块(reg4b.vhd)源程序如下: library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity reg4b is
Port ( load : in std_logic; qing : in std_logic; din : in std_logic_vector(3 downto 0); dout : out std_logic_vector(3 downto 0)); end reg4b;
architecture Behavioral of reg4b is
begin
process(load,qing,din) begin
if qing = '1' then dout <= \
elsif load'event and load = '1' then dout <= din ; end if ; end process;
200
end Behavioral;
④控制模块(testctl.vhd)源程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity testctl is
Port ( rst, clkk : in std_logic;
cnt_en, rst_cnt, load : out std_logic); end testctl;
architecture Behavioral of testctl is signal div2clk : std_logic; begin
process( clkk ,rst) begin
if rst = '1' then div2clk <= '0' ;
elsif clkk'event and clkk = '1' then div2clk <= not div2clk; end if; end process;
process ( clkk, div2clk ) begin
if clkk = '0' and div2clk='0' then rst_cnt <= '1'; else rst_cnt <= '0';
end if; end process;
load <= not div2clk; cnt_en <= div2clk;
end Behavioral; (2)仿真
① 四位锁存器仿真结果如图5.10.2所示。由图中可知,当qing=1时清零,即输出dout=0000,而
当qing=0时,将输入din的信号锁存,即输出信号与输入信号相同。
图5.10.2四位锁存器模块仿真波形
② 顶层文件仿真结果如图5.10.3所示。图中的仿真结果仅用于表明程序设计正确,是经过调小程序
201
EDA技术-VHDL-5.10 采用测频法的数字频率计程序设计与仿真



