频率计设计报告
题 目:
专 业:
班 级:
姓 名:
学 号:
指导教师:
2011年 12 月 21 日
武汉工程大学 制
一:内容摘要
本次设计的频率计是一个8位十进制数字频率计,它由1个测频控制信号发生器TESTCTL、8个有时钟使能的十进制计数器CNT10、8个HC4511译码器,一个32位锁存器REG32B组成。测频信号产生的信号作为使能信号来控制计数器和寄存器,八位十进制的计数器从左到右分别为个、十、百、、、、,32寄存器存放最终的频率读数,然后通过译码器译码输出,连接到数码管。
二:关键字
频率计、TESTCTL、CNT10、REG32B、HC4511、数码管
三:参考文献
1、《EDA技术及应用》王广君、杨志方编著;
2、《电子技术基础》康光华编著;
3、《单片机原理及应用》张毅刚编著。
四:正文
1. 频率计的组成
8位十进制数字频率计由一个测频控制信号发生器TESTCTL、8个有时钟使能的十进制计数器CNT10、8个74L4511译码器,一个32位锁存器REG32B组成。以下分别叙述频率计各逻辑模块的功能与设计方法。
2. 各个部件的设计与 VHDL源程序
1) 有时钟使能的十进制计数器的设计
源程序CNT10.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL; --有时钟使能的十进制计数器
ENTITY CNT10 IS
PORT (CLK:IN STD_LOGIC; --计数时钟信号
CLR:IN STD_LOGIC; --清零信号
END:IN STD_LOGIC; --计数使能信号
CQ:OUT INTEGER RANGE 0 TO 15; --4位计数结果输出
CARRY_OUT:OUT STD_LOGIC); --计数进位
END CNT10;
ARCHITECTURE ART OF CNT10 IS
SIGNAL CQI :INTEGER RANGE 0 TO 15;
BEGIN
PROCESS(CLK,CLR,ENA)
BEGIN
IF CLR= '1' THEN CQI<= 0; --计数器异步清零
ELSIF CLK'EVENT AND CLK= '1' THEN
IF ENA= '1' THEN
IF CQI<9 THEN CQI<=CQI+1;
ELSE CQI<=0;END IF; --等于9,则计数器清零
END IF;
END IF;
END PROCESS;
PROCESS (CQI)
BEGIN
IF CQI=9 THEN CARRY_OUT<= '1'; --进位输出
ELSE CARRY_OUT<= '0';END IF;
END PROCESS;
CQ<=CQI;
END ART;
原理图如下:
2) 32位锁存器的的设计
设置锁存器的好处是,显示的数据稳定,不会由于周期性的清零信号而不断闪烁。若已有32位BCD码存在于此模块的输入口,在信号LOAD的上升沿后即被锁存到寄存器REG32B的内部,并由REG32B的输出端输出,然后由实验板上的7段译码器译成能在数码管上显示输出的相对应的数值。
源程序REG32B.VHD
LIBRARY IEEE; --32位锁存器
USE IEEE.STD_LOGIC_11.ALL;
ENTITY REG32B IS
PORT(LOAD:IN STD_LOGIC;
DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0);
DOUT:OUT STD_LOGEC_VECTOR(31 DOWNTO 0));
END REG32B;
ARCHITECTURE ART OF REG32B IS
BEGIN
PROCESS ( LOAD, DIN )
BEGIN
IF LOAD 'EVENT AND LOAD= '1' THEN DOUT<=DIN; --锁存输入数据
END IF ;
END PROCESS;
END ART;
3) 测频控制信号发生器的设计
频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。这就要求TESTCTL的计数使能信号TSTEN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。当TSTEN高电平时,允许计数;低电平时,停止计数,并保持其所计的数。在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进32位锁存器REG32B中,并由外部的7段译码器译出并稳定显示。锁存信号之后,必须有一清零信号CLR_CNT对计数器进行清零,为下1秒钟的计数操作作准备。测频控制信号发生器的工作时序如图6.6所示。为了产生这个时序图,需首先建立一个由D触发器构成的二分频器,在每次时钟CLK上沿到来时其值翻转。
其中控制信号时钟CLK的频率取1 Hz,而信号TSTEN的脉宽恰好为1 s,可以用作闸门信号。此时,根据测频的时序要求,可得出信号LOAD和CLR_CNT的逻辑描述。在计数完成后,即计数使能信号TSTEN在1 s的高电平后,利用其反相值的上跳沿产生一个锁存信号LOAD,0.5 s后,CLR_CNT产生一个清零信号上跳沿。
源程序TESTCTL.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL; --测频控制信号发生器
USE IEEE.STD_LOGIC_UNSIGNED.ALL
ENTITY TESTCTL IS
PORT (CLK:IN STD_LOGIC; --1 Hz测频控制时钟
TSTEN:OUT STD_LOGIC; --计数器时钟使能
CLR_CNT:OUT STD_LOGIC; --计数器清零
LOAD:OUT STD_LOGIC); --输出锁存信号
END TESTCTL;
ARCHITECTURE ART OF TESTCTL IS
SIGNAL Dvi2CLK :STD_LOGIC;
BEGIN
PROCESS ( CLK )
BEGIN
IF CLK'EVENT AND CLK= '1' THEN --1 Hz时钟二分频
Div2CLK<=NOT Div2CLK;
END IF ;
END PROCESS;
PROCESS ( CLK,Div2CLK )
BEGIN
IF CLK= '0' AND Div2CLK = '0' THEN --产生计数器清零信号
CLR_CNT<= '1';
ELSE CLR_CNT<= '0' ; END IF;
END PROCESS;
LOAD<=NOT Div2CLK; TSTEN<=Div2CLK;
END ART;
4)HC4511译码器的设计:
分别将寄存器的输出端DATA(0至3),DATA(4至7)............,,DATA(28至31)对应接到各个译码器的输入端口datain,然后将各个译码器的输出端啊,a,b,c,d,e,f,g接到数码管的a,b,c,d,e,f,g。
程序设计如下:
library ieee;
use ieee.std_logic_11.all;
entity HC4511 is
port(datain:in std_logic_vector(3 downto 0);
a:out std_logic;
b:out std_logic;
c:out std_logic;
d:out std_logic;
e:out std_logic;
f:out std_logic;
g:out std_logic);
end entity;
architecture ART of HC4511 is
begin
process(datain)
begin
case datain is
when "0001" =>
a<='0';b<='1';c<='1';d<='0';e<='0';f<='0';g<='0';
when "0010" =>
a<='1';b<='1';c<='0';d<='1';e<='1';f<='0';g<='1';
when "0011" =>
a<='1';b<='1';c<='1';d<='1';e<='0';f<='0';g<='1';
when "0100" =>
a<='0';b<='1';c<='1';d<='0';e<='0';f<='1';g<='1';
when "0101" =>
a<='1';b<='0';c<='1';d<='1';e<='0';f<='1';g<='1';
when "0110" =>
a<='0';b<='0';c<='1';d<='1';e<='1';f<='1';g<='1';
when "0111" =>
a<='1';b<='1';c<='1';d<='0';e<='0';f<='0';g<='0';
when "1000" =>
a<='1';b<='1';c<='1';d<='1';e<='1';f<='1';g<='1';
when "1001" =>
a<='1';b<='1';c<='1';d<='1';e<='0';f<='1';g<='1';
when others =>
a<='1';b<='1';c<='1';d<='1';e<='1';f<='1';g<='0';
end case;
end process;
end architecture ART ;
5) 数字频率计的源程序FREQ.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
ENTITY FREQ IS
PORT(FSIN:IN STD_LOGIC;
CLK:IN STD_LOGIC;
a0,b0,c0,d0,e0,f0,g0:out STD_LOGIC;
a1,b1,c1,d1,e1,f1,g1:out STD_LOGIC;
a2,b2,c2,d2,e2,f2,g2:out STD_LOGIC;
a3,b3,c3,d3,e3,f3,g3:out STD_LOGIC;
a4,b4,c4,d4,e4,f4,g4:out STD_LOGIC;
a5,b5,c5,d5,e5,f5,g5:out STD_LOGIC;
a6,b6,c6,d6,e6,f6,g6:out STD_LOGIC;
a7,b7,c7,d7,e7,f7,g7:out STD_LOGIC);
END FREQ;
ARCHITECTURE ART OF FREQ IS
COMPONENT CNT10 --待调用的有时钟使能的十进制计数器端口定义
PORT(CLK,CLR,ENA:IN STD_LOGIC;
CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
CARRY_OUT:OUT STD_LOGIC);
END COMPONENT;
COMPONENT REG32B --待调用的32位锁存器端口定义
port(LOAD:in std_logic;
DIN:in std_logic_vector(31 downto 0);
DOUT:out std_logic_vector(31 downto 0));
END COMPONENT;
COMPONENT TESTCTL --待调用的测频控制信号发生器端口定义
port(clk:in std_logic;
tsten,clr_cnt,load:out std_logic);
END COMPONENT;
component HC4511
port(datain :in std_logic_vector(3 downto 0);
a:out std_logic;
b:out std_logic;
c:out std_logic;
d:out std_logic;
e:out std_logic;
f:out std_logic;
g:out std_logic);
end component;
SIGNAL TSTEN:STD_LOGIC;
SIGNAL CLR_CNT:STD_LOGIC;
SIGNAL LOAD:STD_LOGIC;
SIGNAL CARRY1:STD_LOGIC;
SIGNAL CARRY2:STD_LOGIC;
SIGNAL CARRY3:STD_LOGIC;
SIGNAL CARRY4:STD_LOGIC;
SIGNAL CARRY5:STD_LOGIC;
SIGNAL CARRY6:STD_LOGIC;
SIGNAL CARRY7:STD_LOGIC;
SIGNAL CARRY8:STD_LOGIC;
SIGNAL DIN:STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL DOUT:STD_LOGIC_VECTOR(31 DOWNTO 0);
BEGIN
U0:TESTCTL PORT MAP(CLK=>CLK,TSTEN=>TSTEN,
CLR_CNT=>CLR_CNT,LOAD=>LOAD);
U1:CNT10 PORT MAP(CLK=>FSIN,CLR=>CLR_CNT,ENA=>TSTEN,
CQ=>DIN (3 DOWNTO 0),CARRY_OUT=>CARRY1);
U2:CNT10 PORT MAP(CLK=>CARRY1,CLR=>CLR_CNT,ENA=>TSTEN,
CQ=>DIN (7 DOWNTO 4),CARRY_OUT=>CARRY2);
U3:CNT10 PORT MAP(CLK=>CARRY2,CLR=>CLR_CNT,ENA=>TSTEN,
CQ=>DIN (11 DOWNTO 8),CARRY_OUT=>CARRY3);
U4:CNT10 PORT MAP(CLK=>CARRY3,CLR=>CLR_CNT,ENA=>TSTEN,
CQ=>DIN (15 DOWNTO 12),CARRY_OUT=>CARRY4);
U5:CNT10 PORT MAP(CLK=>CARRY4,CLR=>CLR_CNT,ENA=>TSTEN,
CQ=>DIN (19 DOWNTO 16),CARRY_OUT=>CARRY5);
U6:CNT10 PORT MAP(CLK=>CARRY5,CLR=>CLR_CNT,ENA=>TSTEN,
CQ=>DIN (23 DOWNTO 20),CARRY_OUT=>CARRY6);
U7:CNT10 PORT MAP(CLK=>CARRY6,CLR=>CLR_CNT,ENA=>TSTEN,
CQ=>DIN (27 DOWNTO 24),CARRY_OUT=>CARRY7);
U8:CNT10 PORT MAP(CLK=>CARRY7,CLR=>CLR_CNT,ENA=>TSTEN,
CQ=>DIN (31 DOWNTO 28),CARRY_OUT=>CARRY8);
U9:REG32B PORT MAP(
LOAD=>LOAD,DIN=>DIN(31 DOWNTO 0),DOUT(31 DOWNTO 0)=>DOUT);
U10:HC4511 PORT MAP(
datain=>DOUT(3 DOWNTO 0),a=>a0,b=>b0,c=>c0,d=>d0,e=>e0,f=>f0,g=>g0);
U11:HC4511 PORT MAP(
datain=>DOUT(7 DOWNTO 4),a=>a1,b=>b1,c=>c1,d=>d1,e=>e1,f=>f1,g=>g1);
U12:HC4511 PORT MAP(
datain=>DOUT(11 DOWNTO 8),a=>a2,b=>b2,c=>c2,d=>d2,e=>e2,f=>f2,g=>g2);
U13:HC4511 PORT MAP(
datain=>DOUT(15 DOWNTO 12),a=>a3,b=>b3,c=>c3,d=>d3,e=>e3,f=>f3,g=>g3);
U14:HC4511 PORT MAP(
datain=>DOUT(19 DOWNTO 16),a=>a4,b=>b4,c=>c4,d=>d4,e=>e4,f=>f4,g=>g4);
U15:HC4511 PORT MAP(
datain=>DOUT (23 DOWNTO 20),a=>a5,b=>b5,c=>c5,d=>d5,e=>e5,f=>f5,g=>g5);
U16:HC4511 PORT MAP(
datain=>DOUT(27 DOWNTO 24),a=>a6,b=>b6,c=>c6,d=>d6,e=>e6,f=>f6,g=>g6);
U17:HC4511 PORT MAP(
datain=>DOUT(31 DOWNTO 28),a=>a7,b=>b7,c=>c7,d=>d7,e=>e7,f=>f7,g=>g7);
END ART;
6)仿真图如下: