可变量程数字频率计1.docx
- 文档编号:29832943
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:23
- 大小:442.31KB
可变量程数字频率计1.docx
《可变量程数字频率计1.docx》由会员分享,可在线阅读,更多相关《可变量程数字频率计1.docx(23页珍藏版)》请在冰豆网上搜索。
可变量程数字频率计1
现代电子学实验报告
实验题目:
可变量程数字频率计
姓名:
年级:
2012级
指导教师:
完成日期:
2015年7月14日
原创性声明
本人声明本实验报告涉及的电路图、程序代码均为自己设计,没有抄袭他人的成果。
特此声明!
声明人:
目录
1、实验目的-1-
2、实验要求-1-
3、实验原理及内容-1-
3.1实验的总体结构-1-
3.2实验的理论基础和原理-2-
3.3实验需要解决的关键问题-3-
4、实验设计与测试-3-
4.1硬件设计-3-
4.2硬件测试-5-
4.3软件设计-8-
4.4软件测试-19-
4.5总体测试-20-
5实验结论与测试-21-
参考文献-23-
1、实验目的
掌握现代大规模集成数字逻辑电路的应用设计方法,以及掌握利用计算机进行电子设计自动化(EDA)的基本方法。
2、实验要求
在实验板上构造一个五位数字频率计。
要求分成四档测量范围,×l、×10、×100和×l000。
在×l档,测量范围为1Hz到99999Hz,余此类推。
最高测量频率为99999ktiz(×1000档。
实际上受ispLSI1016器件限制,不可能测量如此高的频率)。
测量范围的选择由按键手控,但要有指示灯显示。
另外,输入频率大于实际量程要有溢出显示。
3、实验原理及内容
测频率法就是在一定时间间隔Tw(定义为闸门时间)内,测得被测信号重复出现的次数为Nx,则其频率可表示为:
Fx=Nx/Tw
3.1实验的总体结构
图1实验总体结构框图
3.2实验的理论基础和原理
频率计的主体部件是一个带门控计数端的计数器(测量计数器),输入信号经整形后由此计数器计数。
控制测量计数器的开门计数时间恰好为1秒,则测量计数器的计数值就是输入信号的频率。
可改变开门计数时间,即可改变频率计的量程。
如使开门时间为0.01秒,则频率计的量程为x100,以此类推。
这种频率计的测量精度取决于以下几个方面:
闸门时间的精度。
一般情况下,闸门脉冲是由石英晶体振荡器产生的。
②由于闸门与被测的信号不同步,在闸门的开启和关闭边沿,会造成多计或少计一个被测脉冲。
这是这种频率计的固有系统误差(±1个最低有效数字)。
尤其在测量较低频率信号时,这种误差的影响特别明显。
要减小这种误差,可以加大闸门时间。
但加大闸门时间降低了测量速度,而且在被测频率相当低时,实际上要单纯依靠加大闸门时间来提高精度几乎是不可能的。
例如测量低到数赫兹的信号,要保证4位有效数字,则闸门时间要长达10000秒,即三小时!
一个有效的解决办法是测量周期,即用被测信号作为闸门,而计数器对内部的一个高速基准信号进行计数。
这样由于该基准信号频率较高,相对来说计数值较大,所以闸门边沿造成的误差相对降低。
但这个方法也有其局限性,主要是由于器件的响应速度限制,基准信号的频率不可能无限升高。
因此该方法一般用于测量较低的频率。
例如,由于器件的速度限制,基准信号的最高频率为50MHz,要求保证有5位有效数字,则被测的信号最高频率大致为50MHz/100000=500Hz。
在上述方法中,要提高被测频率的上限可以采用改良的测量周期方案。
此方案采用若干个被测周期作为计数闸门,即先将输入信号分频再作为闸门脉冲。
这样,由于闸门时间相对增大,可测量的频率上限得以提高。
若输入分频系数为N,则被测信号的频率上限提高N倍。
除此之外,还有其他一些测量方法。
例如可以将上述两种方法(直接测频和测周期)相互结合。
在本次实验设计中,为简单直观体现实验结果,采用直接测频的方法。
3.3实验需要解决的关键问题
测量计数器及闸门计数器的设计,测量量程的改变。
4、实验设计与测试
4.1硬件设计
整体采用GW48-PK2实验箱。
(一)、测量计数器的设计
由于要求频率计为五位,所以测量计数器为一个五位十进制带计数控制端的计数器,实际使用了5个系统宏单元CDU14。
输入信号由CLK输入。
计数器的使能端EN接闸门脉冲。
另设一个溢出寄存器,当测量计数器溢出即最后一位产生进位时,该寄存器置1。
(二)、控制脉冲设计
控制测量计数器的开门计数时间即闸门脉冲的宽度,可改变频率计的量程。
为此,设计一个宽度可变(ls、0,1s、0.01s、0.001s)的闸门脉冲来控制测量计数器:
闸门打开时允许计数,否则禁止计数。
当闸门脉冲宽度为ls时,频率计的量程为×1,当闸门脉冲宽度为0.1s时,频率计的量程为×10,等等。
为了保证频率计有足够的显示时间,两次闸门脉冲之间应该有土定的显示间隔时间。
为了保证测量计数器每次从零开始计数,在闸门打开之前,要先发一个清零脉冲将测量计数器清零。
闸门脉冲、显示间隔、清零脉冲诸信号由闸门计数器产生。
(三)、闸门计数器的设计
首先将12Mhz的晶体振荡器的振荡信号进行12000分频(由二个12进计数器和3个十进计数器构成),得到1000Hz的基准脉冲信号。
将这个基准信号作为闸门计数器的CLK。
闸门计数器是一个带并行加载输入端的12位计数器(由3个二进计数器CBU34构成),共能计4096个数(O~4095)。
当闸门计数器计数到2048时,闸门计数器的最高位变l,利用这个最高位作为频率测量计数器的异步清零信号,同时作为闸门计数器的并行加载信号。
在下一个基准脉冲信号来到时,闸门计数器将被加载到某个初始计数值。
所以该闸门计数器的计数值是在初始计数值和2048之间循环。
量程的改变是依靠加载不同的初始计数值来实现的。
当量程为×1时,初始计数值为24(1024—1000=24)。
当量程为×10、×100、×1000时,相应的初始计数值为924、1014、1023。
这样,从初始计数值到L024的计数时间为闸门脉冲的宽度,×1为1000ms,×10为100ms,×100、×1000各为10ms和1ms。
从1024到2048为显示时间(共计1024ms)。
闸门计数为2048到初始计数值的1ms时间为频率测量计数器的清零时间。
闸门脉冲由闸门计数器的次高位输出,清零脉冲由闸门计数器的最高位输出。
闸门计数器的最高位和次高位输出信号波形见图4-2。
注意,图中计数闸门的宽度为1024减去初始计数值再加一(清零脉冲的宽度),但由于在测量计数器中,清零端的优先级高于计数端,实际计数时间仍然为1024减去初始计数值。
图中清零脉冲实际上也就是闸门计数器的同步加载信号。
这个脉冲的宽度为一个时钟脉冲的周期。
图1频率计闸门脉冲波形
(四)、量程改变与显示
量程改变信号由按键(KEY3)控制一个4进制计数器再加以译码,产生4个量程控制信号。
此4个信号送闸门计数器实现量程改变,并送发光二极管L4~L7显示量程。
由另3个发光二极管分别显示测量计数器溢出、闸门脉冲和清零脉冲。
4.2硬件测试
本次实验设计采用GW48-PK2实验箱,EP1C6Q240C8芯片。
如图2所示。
图2GW48-PK2实验箱
基准频率CLK0由实验箱右下方频率选择部分提供,按照设计参数,跳线帽接至50MHz,如图3所示
图3基准频率选择及接法
将实验箱模式切换至“模式0”,通过模式选择按键进行选择。
将实验箱控制拨码开关拨至图中所示位置。
如图4
图4实验箱模式选择
4.3软件设计
1、分频器部分设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYFPIS
PORT(CLK:
INSTD_LOGIC;
CLKOUT:
OUTSTD_LOGIC);
ENDENTITY;
ARCHITECTUREONEOFFPIS
BEGIN
PROCESS(CLK)
VARIABLEM:
STD_LOGIC_VECTOR(12DOWNTO0);
VARIABLEN:
STD_LOGIC;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFM="1011101101111"THEN
M:
=(OTHERS=>'0');
N:
=NOTN;
ELSE
M:
=M+1;
ENDIF;
ENDIF;
CLKOUT<=N;
ENDPROCESS;
ENDARCHITECTURE;
2、定时信号模块timer
为产生4种不同的闸门信号,可由3级模10计数器对12MHz信号进行分频,利用档位选择开关通过数据选择器MUX41选择出相应的时钟BCLK,原理图如图5
图5定时信号模块原理图
其中计数器CNT.vhd
LIBRARYIEEE;--分频
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYCNTIS
PORT(FIN:
INSTD_LOGIC;
FS:
OUTSTD_LOGIC);
ENDCNT;
ARCHITECTUREDIV_ARCOFCNTIS
BEGIN
PROCESS(FIN)
VARIABLECNT:
INTEGERRANGE0TO4;
VARIABLEX:
STD_LOGIC;
BEGIN
IFFIN'EVENTANDFIN='1'THEN
IFCNT<4THEN
CNT:
=CNT+1;
ELSE
CNT:
=0;
X:
=NOTX;
ENDIF;
ENDIF;
FS<=X;
ENDPROCESS;
ENDDIV_ARC;
3、控制信号发生器模块CONTROL
控制信号发生器模块在EN为高电平时,对待测信号Fx进行计数,此时寄存器的使能端LOAD为0;在EN跳变为低电平时,LOAD发生正跳变,寄存器锁存计数器的值;在EN和CLR同时为低电平时,计数器清零。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCONTROLIS
PORT(BCLK:
INSTD_LOGIC;
EN,CLR,LOAD:
OUTSTD_LOGIC);
ENDCONTROL;
ARCHITECTURECONTROL_ARCOFCONTROLIS
SIGNALDIV2BCLK:
STD_LOGIC;--DIV2BCLK为BCLK的二分频
SIGNALM:
STD_LOGIC;
BEGIN
PROCESS(BCLK)
BEGIN
IFBCLK'EVENTANDBCLK='1'THEN
DIV2BCLK<=NOTDIV2BCLK;
ENDIF;
ENDPROCESS;
PROCESS(BCLK,DIV2BCLK)
BEGIN
IFBCLK='0'ANDDIV2BCLK='0'THEN
CLR<='1';
ELSE
CLR<='0';
ENDIF;
ENDPROCESS;
EN<=DIV2BCLK;
LOAD<=NOTDIV2BCLK;
ENDCONTROL_ARC;
4、十进制计数器cnt10
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT10IS
PORT(CLK:
INSTD_LOGIC;--时钟输入端、清零端、使能端
CLR:
INSTD_LOGIC;
EN:
INSTD_LOGIC;
C:
OUTSTD_LOGIC;
Y:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
SSS:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
FLAG:
OUTSTD_LOGIC);
ENDENTITY;
ARCHITECTUREONEOFCNT10IS
BEGIN
PROCESS(CLK,EN,CLR)
VARIABLEM:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEN:
STD_LOGIC;
BEGIN
IFCLR='1'
THENM:
=(OTHERS=>'0');--计数器异步复位
ELSIFEN='1'--检测是否允许计数
THENIF
CLK'EVENTANDCLK='1'--检测时钟上升沿
THENIFM="1001"THEN
M:
="0000";
N:
='1';--等于9,输出进位信号
ELSE
M:
=M+1;--大于9,计数值清零
N:
='0';
ENDIF;
ENDIF;
ENDIF;
Y<=M;
C<=N;
ENDPROCESS;
ENDARCHITECTURE;
原理图:
5、寄存器模块REG
LIBRARYIEEE;--寄存器模块
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYREGIS
PORT(LK:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDREG;
ARCHITECTUREONEOFREGIS
BEGIN
PROCESS(LK,DIN)
BEGIN
IFLK'EVENTANDLK='0'THENDOUT<=DIN;--LK是锁存信号,下降沿触发
ENDIF;
ENDPROCESS;
ENDONE;
原理图:
6、量程切换(手动)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYKEYIS
PORT(CLK:
INSTD_LOGIC;
K:
INSTD_LOGIC;
C1:
OUTSTD_LOGIC;--X1
C2:
OUTSTD_LOGIC;--X10
C3:
OUTSTD_LOGIC;--X100
C4:
OUTSTD_LOGIC;--X1000
X1:
OUTSTD_LOGIC;
X2:
OUTSTD_LOGIC;
Y:
OUTSTD_LOGIC_VECTOR(9DOWNTO0);
SSS:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
FLAG:
OUTSTD_LOGIC
);
ENDENTITY;
ARCHITECTUREONEOFKEYIS
SIGNALM:
STD_LOGIC_VECTOR(9DOWNTO0);
SIGNALN:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALC10:
STD_LOGIC;
SIGNALC20:
STD_LOGIC;
SIGNALC30:
STD_LOGIC;
SIGNALC40:
STD_LOGIC;
SIGNALC50:
STD_LOGIC;
SIGNALC60:
STD_LOGIC;
SIGNALSSS1:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALFLAG1:
STD_LOGIC;
BEGIN
P1:
PROCESS(CLK,K)----
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFN="11"THEN
N<="00";
ELSE
N<=N+1;
ENDIF;
ENDIF;
IFK='1'THEN
N<="00";
ENDIF;
ENDPROCESSP1;
P2:
PROCESS(N)
BEGIN
CASENIS
WHEN"00"=>
C10<='1';C20<='0';C30<='0';C40<='0';M<="0000011000";
C50<='0';C60<='0';SSS1<="0001";FLAG1<='0';
WHEN"01"=>
C10<='0';C20<='1';C30<='0';C40<='0';M<="1110011100";
C50<='0';C60<='1';
WHEN"10"=>
C10<='0';C20<='0';C30<='1';C40<='0';M<="1111110110";
C50<='1';C60<='0';
WHEN"11"=>
C10<='0';C20<='0';C30<='0';C40<='1';M<="1111111111";
C50<='1';C60<='1';
WHENOTHERS=>
C10<='0';C20<='0';C30<='0';C40<='0';M<="1111111111";
C50<='0';C60<='0';
ENDCASE;
ENDPROCESSP2;
C1<=C10;C2<=C20;C3<=C30;C4<=C40;Y<=M;X1<=C50;X2<=C60;SSS<=SSS1;FLAG<=FLAG1;
ENDARCHITECTURE;
7、量程切换(自动)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYKEYIS
PORT(CLK:
INSTD_LOGIC;
K:
INSTD_LOGIC;
C1:
OUTSTD_LOGIC;--X1
C2:
OUTSTD_LOGIC;--X10
C3:
OUTSTD_LOGIC;--X100
C4:
OUTSTD_LOGIC;--X1000
X1:
OUTSTD_LOGIC;
X2:
OUTSTD_LOGIC;
Y:
OUTSTD_LOGIC_VECTOR(9DOWNTO0);
SSS:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
FLAG:
OUTSTD_LOGIC
);
ENDENTITY;
ARCHITECTUREONEOFKEYIS
SIGNALM:
STD_LOGIC_VECTOR(9DOWNTO0);
SIGNALN:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALC10:
STD_LOGIC;
SIGNALC20:
STD_LOGIC;
SIGNALC30:
STD_LOGIC;
SIGNALC40:
STD_LOGIC;
SIGNALC50:
STD_LOGIC;
SIGNALC60:
STD_LOGIC;
SIGNALSSS1:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALFLAG1:
STD_LOGIC;
BEGIN
P1:
PROCESS(CLK,K)----
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFN="11"THEN
N<="00";
ELSE
N<=N+1;
ENDIF;
ENDIF;
IFK='1'THEN
N<="00";
ENDIF;
ENDPROCESSP1;
P2:
PROCESS(N)
BEGIN
CASENIS
WHEN"00"=>
C10<='1';C20<='0';C30<='0';C40<='0';M<="0000011000";
C50<='0';C60<='0';SSS1<="0001";FLAG1<='0';
WHEN"01"=>
C10<='0';C20<='1';C30<='0';C40<='0';M<="1110011100";
C50<='0';C60<='1';
WHEN"10"=>
C10<='0';C20<='0';C30<='1';C40<='0';M<="1111110110";
C50<='1';C60<='0';
WHEN"11"=>
C10<='0';C20<='0';C30<='0';C40<='1';M<="1111111111";
C50<='1';C60<='1';
WHENOTHERS=>
C10<='0';C20<='0';C30<='0';C40<='0';M<="1111111111";
C50<='0';C60<='0';
ENDCASE;
ENDPROCESSP2;
C1<=C10;C2<=C20;C3<=C30;C4<=C40;Y<=M;X1<=C50;X2<=C60;SSS<=SSS1;FLAG<=FLAG1;
ENDARCHITECTURE;
4.4软件测试
在检查芯片和确认相关参数设置后,查GW48-PK2引脚表,进行引脚锁定,进行编译。
编译结果提示成功。
将PC与实验箱连接后,进行下载。
4.5总体测试
系统运行后将CLK2输入端接入不同频率输入,如接65536Hz
上方数码管显示为65538(近似于65536)
5实验结论与测试
实验中发现,在手动模式下,手动控制按键切换量程,对应上方显示数码管下LED等点亮,如最右侧灯亮表示×1档,以此类推,测量结果为五位数码管读数乘以对应档位精度值。
当测量的频率值较大时,误差较为明显。
手动模式实验现象明显。
在自动模式下,由系统根据输入信号自动切换测量量程,但对应量程的显示LED灯点亮部分存在一定的问题,测量计数能够正常显示。
误差分析:
若忽略晶振器发生频率产生的误差,用直接接测频法Fx=Nx/Tw,计数值Nx会产生一个正负1的误差,故对高频率信号,用本次设计的频率计测量效果较好,而对于低频信号,则本次设计的频率计测量会产生较大误差。
一种更精确的频率计是等精度测量频率计。
错误分析及解决方法:
初次编译时,出现错误:
InternalError:
Sub-system:
AMERGE,File:
/quartus/atm/amerge/amerge_kpt_op.cpp,Line:
220
cmp_merge_kpt_db
在查阅相关资料后,找到解决方法为
StackTrace:
Toworkaroundthisproblem,deletethedbandincremental_dbdirectoriesfromtheprojectdirectorybeforecompilingyourdesign.
即在工程文件夹的目录下把文件夹《db》《incremental_db》删除即可。
参考文献
[1]潘松,黄继业.EDA技术实用教程——VHDL版(第五版),北
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可变 量程 数字频率计