量程自动转换数字式频率计的设计.docx
《量程自动转换数字式频率计的设计.docx》由会员分享,可在线阅读,更多相关《量程自动转换数字式频率计的设计.docx(20页珍藏版)》请在冰豆网上搜索。
量程自动转换数字式频率计的设计
EDA课程设计
〔量程自动转换数字式频率的设计〕
题目:
数字频率计的设计
学院:
班级:
学号:
姓名:
指导教师:
提交时间:
一.设计要求
二.设计方案
1,频率计的工作原理
2,频率计的系统框图
三.详细设计
1,4位十进制计数模块
〔1〕十进制计数器元件t10v的设计
〔2〕计数器的顶层设计
〔3〕分频模块的设计
2.闸门控制模的设计
3.可自动换挡基准时钟模块的设计
4.锁存模块的设计
5.译码显示模块的设计与实现
七段数码显示译码管的VHDL设计
6.频率计电路顶层原理图的设计
7.实验数据和误差分析
四.总结
五.参考文献
数字频率计的设计
摘要:
数字频率计是一种能够测量被测信号频率的数字测量仪器。
它被广泛应用于航天、航空、电子、自动化测量、测控等领域。
本文利用测频原理,设计一个量程自动转换数字式频率计,主要硬件电路由Altera公司生产的复杂可编程逻辑〔CPLD〕EPM7128构成。
复杂可编程逻辑器件CPLD芯片EPM7128SLC84-15完成各种时序逻辑控制、计数功能。
在QUARTUSII平台上,用VHDL语言编程完成了CPLD的软件设计、编译、调试、仿真和下载。
由于本系统采用了先进的EDA技术,不但大大缩短了开发研制周期,而且使本系统具有构造紧凑、体积小,可靠性高,测频围宽、精度高等优点。
关键词:
频率计;可编程逻辑器件;VHDL
一、设计要求
1.频率计的测量围为1
,量程分10
、100
和1000
三档〔最大读数分别为9.99
、99.9
、999
〕。
2.要求量程可根据被测量的大小自动转换。
即当计数器溢出时,产生一个换档信号,让整个计数时间减少为原来的1/10,从而实现换档功能。
3.要现溢出报警功能。
即当频率高于999
时,产生一报警信号,点亮LED灯,从而实现溢出报警功能。
二、设计方案
1、频率计的工作原理
常用的测量频率的方法有两种,一个是测周期法,一个是测频率法。
测周期法需要有基准系统时钟频率
在待测信号一个周期
,记录基准时钟频率的周期数
,那么被测频率可表示为:
=
/
测频率法就是在一定的时间间隔
,得到这个周期信号重复变化的次数
,那么被测频率可表示为
=
/
本设计采用的是直接测频率的方法。
2、频率计的系统框图
频率计的系统设计可以分为4位10进制计数模块、闸门控制模块、锁存器模块、译码显示模块和可自动换档基准时钟模块,其系统框图如图2.1所示。
其中,可自动换档模块为闸门控制模块提供3个档也就是3个测量围的基准时钟信号,通过计数器的最高位溢出情况来判定工作在第几档。
闸门控制模块根据基准时钟信号产生基准时钟信号周期2倍的周期使能信号,随后为锁存器产生一周期性地锁存信号,再然后为计数模块产生一周期性地清零信号。
4位10进制计数模块在使能信号和清零信号的控制下对被测信号的波形变化进展计数,假设产生溢出那么为自动换档模块输出一换档信号。
译码显示模块负责不闪烁的显示被测信号的频率以及数字频率计目前工作的档位。
三、详细设计
1、4位十进制计数器模块
4位十进制计数器模块包含4个级联十进制计数器,用来对施加到时钟脉冲输入端的待测信号产生的脉冲进展计数,十进制计数器具有计数使能、清零控制和进位扩展输出。
用于计数的时间间隔〔计数允许周期T〕由闸门控制模块的控制信号发生器所产生的使能信号来控制,使能十进制计数器的计数允许周期T可由闸门控制模块中的量程选择输入来决定。
这样允许用户选择所希望的被测频率围,并有效地确定读出数据中十进制小数点的位置。
〔1〕、十进制计数器元件t10V的设计
十进制计数器既可采用QuartusII的宏元件74160,也可用VHDL语言设计,本设计采用VHDL编写,其源程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYt10vIS
PORT(clr:
INSTD_LOGIC;
clk:
INSTD_LOGIC;
cout:
OUTSTD_LOGIC;
en:
INSTD_LOGIC;
cq:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDt10v;
ARCHITECTUREexample1OFt10vIS
BEGIN
PROCESS(clr,clk,en)
VARIABLEcqi:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFclr='1'THENcqi:
=(OTHERS=>'0');
ELSIFCLK'EVENTANDclk='1'THEN
IFEN='1'THEN
IFcqi<9thencqi:
=cqi+1;
ELSEcqi:
=(OTHERS=>'0');
ENDIF;
ENDIF;
ENDIF;
IFcqi=9THENcout<='1';
ELSEcout<='0';
ENDIF;
cq<=cqi;
ENDPROCESS;
END;
在源程序中cout是计数器进位输出;cq[3..0]是计数器的状态输出;clk是时钟输入端;clr是复位控制输入端,当clr=1时,cq[3..0]=0;en是使能控制输入端,当en=1时,计数器计数,当en=0时,计数器保持状态不变。
在工程编译仿真成功后,将设计的十进制计数器电路设置成可调用的元件t10V.bsf,用于以下的4位十进制计数器的顶层设计。
〔2〕、计数器的顶层设计
该顶层设计可以用原理图输入的方法完成。
在QUartusII中,新建一个原理图编辑窗,从当前的工程目录中调出4片十进制计数器元件t10V,并按图所示的4位十进制计数器的顶层原理图完成电路连接,如图3.2所示。
图3.2:
计数模块电路图
(3)分频模块的设计
根据设计要求,最小一档的周期是10ms,即100Hz。
选用10MHz的晶振作为EPM7128的时针,为得到1000Hz的信号需要100分频,可知用2个t10级联就可以实现,图3.3是其电路图。
图3.3:
分频模块电路图
2、闸门控制模的设计
闸门控制模块主要根据输入的控制时钟脉冲,首先要产生一个锁存信号LOAD,用其上升沿控制锁存器将之前的计数结果存入锁存器中,并由显示模块将其显示出来,设置锁存器是为了让显示稳定,不会因为周期性清零信号使得显示的数值不断闪烁。
锁存之后须有一清零信号CLR_T将计数器清零,为了下一秒的计数操作做准备。
闸门控制模块的VHDL源程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYTESTCTLIS
PORT(clk,fin:
INSTD_LOGIC;
clr_t:
OUTSTD_LOGIC;
tsten:
OUTSTD_LOGIC;
load:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFTESTCTLIS
SIGNALa:
STD_LOGIC;
SIGNALcount:
STD_LOGIC_VECTOR(1downto0);
BEGIN
PROCESS(clk)
BEGIN
IFclk'EVENTANDclk='1'THEN
a<=nota;
ENDIF;
ENDPROCESS;
PROCESS(fin)
BEGIN
IFfin'EVENTANDfin='1'THEN
IFa='0'then
IFcount="11"thenload<='0';clr_t<='1';
ELSEload<='1';count<=count+1;clr_t<='0';
ENDIF;
ELSEcount<="00";load<='0';clr_t<='0';
ENDIF;
ENDIF;
ENDPROCESS;
tsten<=a;
END;
闸门控制模块的仿真波形如图3.4所示,图中clk是输入的时针信号,tesen是clk的二分频。
图中还有fin时针,它的频率要远小于clk,作用是作为一个计数器的时针,当tsten为低电平且计数器值不为3时,load等于1。
而当tsten为低电平且计数值为3时,产生一个清零信号CLR_T。
3、可自动换挡基准时钟模块的设计
本设计通过控制基准时钟信号来时现量程的自动转换。
如果一个周期为0.1s的信号作为时钟信号通过一个进制计数器,从十进制计数器的进位输出端将会得到一个周期为1s的信号。
因此,频率计的三档位可以通过计数器相级联来实现,如图3.5所示:
CLK1K
O4
EN
图3.5:
可自动换挡基准计时模块图:
图中3选1的选择器可以根据十进制计数器模块的溢出情况来作为选择标准。
先使可自动变换档的基准计时模块工作在0挡,假设被测频率高于0挡的围。
那么会使4位十进制计数器模块产生溢出,用这个溢出信号来使自动换挡基准时钟模块工作在一档;同理,如果被测频率还是高出一挡的测量围,就在自动换为二档。
假设被测频率任高于二档的测量围,那么输出一报警信号。
可自动换挡基准计时模块的VHDL源程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux3IS
PORT(a:
INSTD_LOGIC_VECTOR(3DOWNTO0);
y:
OUTSTD_LOGIC;
o:
OUTSTD_LOGIC;
input0:
inSTD_LOGIC;
input1:
inSTD_LOGIC;
input2:
inSTD_LOGIC);
ENDmux3;
ARCHITECTUREexample5OFmux3IS
BEGIN
PROCESS(input0,input1,input2,a)
BEGIN
CASEaIS
WHEN"0000"=>y<=input0;o<='0';
WHEN"0001"=>y<=input1;o<='0';
WHEN"0010"=>y<=input2;o<='0';
WHEN"0011"=>y<='0';o<='1';
WHENOTHERS=>null;
ENDCASE;
ENDPROCESS;
END;
图中将所有计数器的清零信号接地,因为清零信号为高电平有效,接地信号一直保持低电平,这样保证计数器不会被清零,一直正常工作。
所有计数器的使能端需要一个高电平信号EN使其一直保持正常工作。
最后一个计数器并不属于实现基准信号换挡功能的计数器组,它直接为三选一选择器mux3效劳,统计来自4位十进制计数器模块的最高位进位信号的个数。
Y输出端输出已经调整了的适合于被测频率的基准时钟信号。
4、锁存模块的设计
锁存模块的功能是将4个十进制计数器的数据,在LOAD信号有效时〔LOAD=1〕锁存到存放器中,其VHDL源程序如下图:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYREG16IS
PORT(DIN0:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DIN1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DIN2:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DIN3:
INSTD_LOGIC_VECTOR(3DOWNTO0);
LOAD:
INSTD_LOGIC;
DOUT0:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
DOUT1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
DOUT2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
DOUT3:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDREG16;
ARCHITECTUREoneOFREG16IS
BEGIN
PROCESS(LOAD)
BEGIN
IFLOAD'eventandLOAD='1'THEN
DOUT0<=DIN0;
DOUT1<=DIN1;
DOUT2<=DIN2;
DOUT3<=DIN3;
ENDIF;
ENDPROCESS;
ENDone;
5、译码显示模块的设计与实现
数字逻辑系统中常用的显示器件是数码管,半导体是数码管的外形和等效电路如图6-27所示,其每一个字段都是一个发光二级管〔LightEmittingDiode,LED〕,因而也称之为LED数码管或LED显示器。
LED数码管用7段发光二极管〔带小数点时为8段〕来显示数字,每一段都是一个发光二极管,一般把所有段的一样一端相连,连接到地〔共阴极接法〕或者是连接到电源〔共阳极接法〕。
共阴级LED数码管的公共端连接到地,另一端分别接一个限流电阻后再接到控制电路的信号端,当信号端为高电平时,该段即被点亮,否那么不亮。
共阳极接法那么相反,公共端连接到电源,另一端分别接一个限流电阻后再接到控制电路的信号端,只有信号端为低电平时才被点亮,否那么不亮。
数码管的扫描方式有两种:
静态扫描和动态扫描。
静态扫描方式简单,动态扫描方式节约资源。
从资源角度出发,这里采用动态扫描方式。
采用扫描方式来实现LED数码管动态显示,控制好数码管之间的延时是相当重要。
根据人眼视觉暂留原理,LED数码管每秒的导通16次以上,人眼就无法分辨LED数码管短暂的不亮,认为是一直点亮的〔其实LED数码管是以一定频率在闪动的〕。
但是,延时〔导通频率〕也不是越小越好,因为LED数码管到达一定亮度需要一定时间。
如果延时控制的不好那么会出现闪动,或者亮度不够。
据经历,延时0.005秒可以到达满意的效果。
另外,显示的字符有变化时,可在延时到达后送一个低电平〔共阴极数码管〕让LED数码管先短暂熄灭,再显示下一个字符,可使在视觉上字符的变化更清晰。
7段数码显示译码器的VHDL设计
该模块将显示存放器的四位BCD数字符译成7段码,其VHDL源程序如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entitydec7sis
port(din:
inbit_vector(3downto0);
dout:
outbit_vector(6downto0));
end;
architectureexample2ofdec7sis
begin
process(din)
begin
casedinis
when"0000"=>dout<="0111111";
when"0001"=>dout<="0000110";
when"0010"=>dout<="1011011";
when"0011"=>dout<="1001111";
when"0100"=>dout<="1100110";
when"0101"=>dout<="1111101";
when"0110"=>dout<="0111111";
when"0111"=>dout<="0000111";
when"1000"=>dout<="1111111";
when"1001"=>dout<="1101111";
when"1010"=>dout<="1110111";
when"1011"=>dout<="1111100";
when"1100"=>dout<="0111001";
when"1101"=>dout<="1011110";
when"1110"=>dout<="1111001";
when"1111"=>dout<="1100001";
whenothers=>null;
endcase;
endprocess;
endexample2;
程序中,din是0~9的BCD码输入,dout为译码后的7段数据信号,SEL是数码管的位选信号。
一位16进制的VHDL源程序如下:
libraryIEEE;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityt16vis
port(
clk:
instd_logic;
--cout:
outstd_logic;
--en:
instd_logic;
cq:
outstd_logic_vector(1downto0));
endt16v;
ARCHITECTUREexampleloft16vis
begin
process(clk)
variablecqi:
std_logic_vector(1downto0);
begin
ifclk'eventandclk='1'then
ifcqi<3thencqi:
=cqi+1;
elsecqi:
=(others=>'0');
endif;
endif;
--ifcqi=15thencout<='1';
--elsecout<='0';
--endif;
cq<=cqi;
endprocess;
endexamplel;
:
四选一选择器的VHDL的源程序如下
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux41IS
PORT(a:
INSTD_LOGIC_VECTOR(1DOWNTO0);
y:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
input0:
inSTD_LOGIC_VECTOR(3DOWNTO0);
input1:
inSTD_LOGIC_VECTOR(3DOWNTO0);
input2:
inSTD_LOGIC_VECTOR(3DOWNTO0);
input3:
inSTD_LOGIC_VECTOR(3DOWNTO0));
ENDmux41;
ARCHITECTUREexample6OFmux41IS
BEGIN
PROCESS(input0,input1,input2,input3,a)
BEGIN
CASEaIS
WHEN"00"=>y<=input0;
WHEN"01"=>y<=input1;
WHEN"10"=>y<=input2;
WHEN"11"=>y<=input3;
WHENOTHERS=>null;
ENDCASE;
ENDPROCESS;
ENDexample6;
libraryieee;
useieee.std_logic_1164.all;
entitychoose_decoderis
port(sel:
instd_logic_vector(1downto0);
choose:
outstd_logic_vector(3downto0));
endchoose_decoder;
architecturertlofchoose_decoderis
begin
process(sel)
begin
caseselis
when"00"=>choose<="0001";
when"01"=>choose<="0010";
when"10"=>choose<="0100";
when"11"=>choose<="1000";
whenothers=>choose<="ZZZZ";
endcase;
endprocess;
endrtl;
由于实验时没有1000HZ的量程,所以我们选用3MHZ的量程用分频器实现实验的要求,且分频器的VHDL的源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitydivis
port(clk:
instd_logic;
rst:
instd_logic;
divclk:
outstd_logic);
enddiv;
architecturebehavioralofdivis
signaldivcounter:
std_logic_vector(20downto0);
signaldiv_clk:
std_logic;
begin
process(clk,rst)
begin
if(rst='1')then
divcounter<="000000000000000000000";
div_clk<='0';
elsif(rising_edge(clk))then
if(divcounter="101101110001101011111")then
divcounter<="000000000000000000000";
div_clk<=notdiv_clk;
else
divcounter<=divcounter+1;
endif;
endif;
endprocess;
divclk<=div_clk;
endbehavioral;
6、频率计电路顶层原理图的设计
〔1〕、频率计主体电路顶层原理图设计
在成功完成低层单元电路模块设计仿真后,可根据测频原理框图,可完成图3.7所示的频率计电路顶层原理图的设计文件。
该电路中定时信号模块、控制信号发生器模块、4位十进制计数器模块、存放显示模块为前面设计低层单元电路模块。
clk为系统基准输入信号;FIN为待测频率信号,本设计测试中用3个发光二级管表示量程状态显示;OVER是进位扩展信号,用于超量程提示功能,在超出目前量程档次时发出报警信号,驱动LED发光报警。
在QuartusII利用原理图输入对频率计电路顶层原理图TOP.qpf编译仿真正确无误后,即可生成如下图图3.9所示。
需要说明的是图中的输出LOAD并不需要,是为了便于仿真而添加的。
图:
量程自动转换数字式频率计的顶层设计图
7.实验数据和误差分析
输入值〔HZ〕
测量值〔KHZ〕
误差〔%〕
750000
760
1.3
65556
66.4
1.32
16384
16.384
0
256
0.26
1.56
64
0.061
4.68
16
0.015
6.25
4
0.004
0
四、总结
经过一个多星期的课程设计,通过对各种资料的查阅,我发现了自己动手的乐趣。
以前所学的知识都被局限于课本之中,这次通过课程设计我体会到了,只要勇于探索和吸收,知识是无边无境的。
在做课程设计的过程中也遇到了很多问题,比方如何使用QUARTUSII软件,
如何组织那种专业语言,上网、到图书馆查找相关的资料