数字频率计数显示器
一、功能与要求
该计数器的功能:对被测试信号进行计数,在1秒定时结束后,将计数器结果送锁存,同时将计数器清零,为下一次采样测量做好准备。要求如下:
1、用VHDL完成12位十进制数字频率计的设计及仿真。
2、频率测量范围:1HZ~10KHZ,分成两个频段,即1~999HZ,1KHZ~10KHZ,用三位数码管显示测量频率,用LED显示表示单位,如亮绿灯表示HZ,亮红灯表示KHZ。
3、具有自动校验和没理两种功能,即能用标准时钟检验、测量精度。
4、具有超量程度报警功能,在超出目前量程档的测量范围时,发出灯光和音响信号。
二、设计思路
图2.1是频率计数器的原理图。
图2.1频率计数器的原理图
1、基本原理:计算单位时间内待测信号的脉冲个数,各模块设计成process。
测量/检验选择模块(test meas)
测频控制信号发生器(二分频)(clk process)
计数器模块(cnt process)
送存选择、报警模块(tostore process)
锁存模块(store process)
扫描显示模块(cnt3 process,bus process,disp process)
2、各模块功能
测量/检验选择
test
meas CP1
select
图2.2测量检验选择
如图2.2为测量/检验选择模块,该模块的信号如下:
输入信号:选择信号selet,被测信号meas,测试信号test;
输出信号:CP1。
当selet=0时,为测量状态,CP1=meas;当selet=1时,为检验状态,CP1=test。
检验与测量共用一个电路,只是被测信号CP1不同而已。
图2.3测频控制信号发生顺(二分频)
如图2.3为测频控制信号发生器(二分频),该模块的信号如下:
输入信号:1HZ时钟信号;
输出信号:1秒定时信号(周期为2秒)。
图2.4计数器、送存选择、报警模块
1、如图2.4为计数器、送存选择、报警模块,模块的功能如下:
设置:量程控制开关K,单位显示信号Y,
当K=0时,为1-999HZ量程档,数码管显示的数值为被测信号频率值,unit显示绿色,即单位为HZ;
当K=1时,为1KHZ-10KHZ量程档被测信号频率值为数码管显示数值乘1000,unit显示红色,即单位为KHZ。
2、其中四级十进制计数模块(带进位C)模块功能如下:
输入信号:RD、CP,用于计数开始、清零、锁存
输出信号:Q4-Q1设置超出量程档测量范围示警信号alert。
若被测信号频率小于1KHZ(K=0),计数器只进行三级十进制计数,最大显示值999HZ;如果被测信号频率超过此范围,示警信号驱动灯光、扬声器报警;
若被测信号为1KHZ-10KHZ(K=1),计数器进行四位十进制计数,取高三位显示,最大显示值为9.99KHZ,如果被测信号频率超过此范围,报警。
3、送存选择、报警电路状态表如表1。
量程控制 | 计数器 | 锁存 | 小数点位置 | 报警信号 | |
K | Q04 | C | D3 D2 D1 | alert | |
0 0 1 1 | 0 1 X X | 0 0 0 1 | Q3 Q2 Q1 Q3 Q2 Q1 Q3 Q2 Q1 Q3 Q2 Q1 | 右第一位 右第一位 右第一位 右第一位 | 0 1 0 1 |
图2.5锁存、扫描显示模块
图2.5为锁存、扫描显示模块,该模块功能如下:
锁存器输入信号:D3-D1,LD;
输出信号:Q3-Q1,小数点单位显示unit。
图2.6扫描显示电路
如图2.6扫描显示电路,该模块包含两个模块:
七段显示译码器电路(DEC LED)
分时总线切换电路(SCAN)。
三、原理图说明
Clkscam led(8:1)
Clk1hz
Ms123(2:1)
K
Meas alert
Sel
Unit
test
图3.1频率计显示原理图
如图3.1,输入有扫描时钟clkscan,分频时钟clklhz,单位选择键K,被测信号meas,测试信号test,测试校验选择键sel。
输出有数码管信号led,数码管选择信号ms123,报警信号alert,单位显示信号unit。
四、源代码说明
--实体说明
library IEEE;
use IEEE.STD LOGIC 11.ALL;
use IEEE.STD LOGIC ARITH.ALL;
use IEEE.STD LOGIC UNSIGNED.ALL;
entity dig frq is
Port(clk1hz : in STD LOGIC;
clkscan : in std logic;
test : in STD LOGIC;
meas : in STD LOGIC;
sel : in STD LOGIC;
k : in STD LOGIC;
alert : out STD LOGIC;
unit : out STD LOGIC;
ms123 : out STD LOGIC VECTOR(2 downto 1);
led : out STD LOGIC VECTOR(8 downto 1);
end dig frq;
--结构体说明
Architecture Behavioral of dig frq is
signal cpl:std logic;
signal clk05hz:std logic;
signal cp:std logic;
signal rd:std logic:=’1’;
signal c:std logic;
signal q4,q3,q2,q1:std logic vector(4 downto 1):=”0000”
signal load:std logic:=’0’;
signal d3,d2,d1:std logic vector(4 downto 1) :=”0000”;
signal data3,data2,data1:std logic vector(4 downto 1) :=”0000”;
signal disp:std logic vector(4 downto 1) :=”0000”;
signal ns123 s:STD LOGIC VECTOR(2 downto 1);
begin
--时钟电路,1hz信号二分频产生0.5hz信号,1s高电平,1s低电平
clk process:process(clk1hz)
begin
if(clk1hz’event and clk1hz=’1’)then
clk05hz<=not clk05hz;
end if;
end process;
--测试、校验选择模块
test meas:process(sel,meas,test)
begin
if(sel=’1’)then-sel为1时cpl为测试信号
cpl<=meas;
else-sel为0时cpl为校验信号
cpl<=test;
end if;
end process;
--锁存的加载信号时load,当分频信号clk05hz上升沿时有效
load<=not clk05hz;
cp<=clk05hz and cpl;
--计数清零信号rd,当分频信号clk05hz为0时有效
rd<=clk05hz;
--四位bcd计数电路
cnt process:process(cp,rd)
variable q4 s,q3 s,q2 s,q1 s:integer range 0 to 9;
variable c s:integer range 0 to 1;
begin
if(rd=’0’)then
q4 s:=0;
q3 s:=0;
q2 s:=0;
q1 s:=0;
c s:=0;
elsif(cp’event and cp=’1’)then
if(q4 s=9 and q3 s=9 and q2 s=9 and q1 s=9 and c s=1)then
q4 s:=0;
q3 s:=0;
q2 s:=0;
q1 s:=0;
c s:=0;
elsif(q4 s=9 and q3 s=9 and q2 s=9 and q1 s=9)then
q4 s:=0;
q3 s:=0;
q2 s:=0;
q1 s:=0;
c s:=0;
elsif(q3 s=9 and q2 s=9 and q1 s=9)then
q4 s:= q4 s+1;
q3 s:=0;
q2 s:=0;
q1 s:=0;
elsif(q2 s=9 and q1 s=9)then
q3 s:= q3 s+1;
q2 s:=0;
q1 s:=0;
elsif(q1 s=9)then
q2 s:= q2 s+1;
q1 s:=0;
elsif
q1 s:= q1 s+1;
end if;
end if;
q4<=conv std logic vector(q4 s,4);
q3<=conv std logic vector(q3 s,4);
q2<=conv std logic vector(q2 s,4);
q1<=conv std logic vector(q1 s,4);
if(c s=0)then
c<=’0’;
else
c<=’1’;
end if;
end process;
--送锁存电路
tostore process:process(q4,q3,q2,q1,c,k)
begin
if(k=’0’)then--当计数单位选择k为0时,输出计数器的低三位
d3<=q3;
d2<=q2;
d1<=q1;
if(q4>”0000”or c>’0’)then--此时,当计数超过三位bcd数时,报警信号置1
alert<=’1’;
else
alert<=’0’;
end if;
elsif(k=’1’)then--当计数单位选择k为1时,输出计数器的高三位
d3<=q4;
d2<=q3;
d1<=q2;
if(c>’0’)then--此时,当计数超过四位bcd数时,报警信号置1
alert<=’1’;
else
alert<=’0’;
end if;
end if;
end process;
--锁存电路
stroe process:process(load,d1,d2,d3,k)
begin
if(load’event and load=’1’)then--加载信号load下降时,锁存数据
data3<=d3;
data2<=d2;
data1<=d1;
if(k=’0’)then--当单位选择键k为0时,单位unit置0,显示绿色
unit<=’0’;
else--当单位选择键k为1时,单位unit置1,显示红色
unit<=’1’;
end if;
end if;
end process;
--计数到3的计数器,产生数码管选择信号
cnt3 process:process(clkscan)
variable cnt:integar range 0 to 2:=0;
begin
if(clkscan’event and clkscan=’1’)then
if(cnt=2)then
cnt:=0;
else
cnt:=cnt+1;
end if;
end if;
ms123 s<=conv std logic vector(cnt,2);
end process;
--数码管信号选择电路
bus process:process(data3,data2,data1,clkscan,ms123 s)
begin
if(clkscan’event and clkscan=’1’)then
case ms123 s is
when”00”=>disp<=data2;
when”01”=>disp<=data3;
when”10”=>disp<=data1;
when others=>disp<=data1;
end case;
end if;
end process;
ms123<=ms123 s;
--四八译码电路
disp process:process(disp,k,ms123 s)
begin
case disp is
when”0000”=>led<=”00111111”;
when”0001”=>led<=”00000110”;
when”0010”=>led<=”01011011”;
when”0011”=>led<=”01001111”;
when”0100”=>led<=”01100110”;
when”0101”=>led<=”01101101”;
when”0110”=>led<=”01111101”;
when”0111”=>led<=”00000111”;
when”1000”=>led<=”01111111”;
when”1001”=>led<=”01101111”;
when others=>led<=”00111111”;
end case;
if(ms123 s=”00”and k=‘0’)then
led(8)<=’1’;
elsif(ms123 s=”10”and k=’1’)then
led(8)<=’1’;
else
led(8)<=’0’;
end if;
end process;
end Behavioral;
五、仿真结果及说明
1、二分频电路仿真结果
图5.1
clk1hz一个时钟产生一个clk05hz电平,clk05hz电平高低交替。
2、测试校验选择电路
图5.2
sel为0时,cp1为测试信号meas,sel为1时,cpl为校验信号test。
3、控制电路
图5.3
当clk05hz为1,被计数信号cp为cp1,当clk05hz为0,被计数信号cp为0;
当clk05hz为1,加载信号load为0,计数清零信号为1,当clk05hz为0,加载信号load为1,计数清零信号为0。
4、四位bcd计数电路
图5.4
当清零信号rd为0时,输出信号q4,q3,q2,q1置零,当清零信号rd为1时,q4,q3,q2,q1为cp的计数值。
5、送锁存,报警模块
图5.5
当键k为0时,对bcd计数的低三位输出,当计数超出999时,报警信号输出为1。
图5.6
当键k为1时,对bcd计数的高三位输出,当计数未超出999时,报警信号输出为0。
6、锁存电路
图5.7
当键k为0时,对bcd计数的低三位锁存;
当加载键load为1时,进行锁存。
7、显示电路
图5.8
ms123为0,1,2时分别显示个位,十位,百位,当单位选择键k为1时,单位显示unit为1(红灯),且,百位数据DB高位dot位为1。