电子测量与仪器检测实验报告.docx
- 文档编号:30111876
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:16
- 大小:43.60KB
电子测量与仪器检测实验报告.docx
《电子测量与仪器检测实验报告.docx》由会员分享,可在线阅读,更多相关《电子测量与仪器检测实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
电子测量与仪器检测实验报告
信息工程学院电子测量与仪器检测实验报告
题目:
等精度同步测频
班级:
学号:
姓名:
老师:
2012年6月4日
实验二等精度同步测频
一、实验目的
1、掌握等精度同步测频的工作原理。
2、掌握VHDL和Verilog硬件描述语言的用法。
3、掌握用硬件描述语言实现自己设计方案的方法。
4、了解QuartusII或是MaxplusII的使用方法。
5、学习用仿真工具调试硬件模块的方法以及用单片机访问FPGA的方法。
二、实验仪器
1、PC机一台。
2、函数发生器一台。
3、FPGA开发板一块。
4、JTAG下载线一条。
5、安装QuartusII或是MaxplusII软件。
三、实验电路及原理说明
1.实验原理图
图2-1多周期同步测频的原理方框图
2.工作波形图
图2-2多周期同步测频的工作波形图
3.工作原理
1、工作原理
图2-1给出了多周期同步测频率的原理方框图,图2-2是对应的工作波形图。
其工作过程是:
单片机预置一定宽度(如1s)的闸门脉冲信号,加至D触发器以形成同步闸门信号T;被测信号频率分两路加入,一路加至D触发器作为CP时钟,和预置闸门一起作用,在Q端形成同步闸门[见图2-2中T的波形],并分别加到主门1和主门2上,将主门1、2同时打开;这时,被测频率通过主门1进入计数器1,对进入的周期数进行计数,得计数值;同时,晶振标准频率通过主门2进入计数器,得计数值
,其波形如图2-2所示,由图可得:
因此:
2、误差分析
由以上工作过程和波形图可以看出,对被测信号
的计数是与闸门同步的,故不存在量化()误差。
这样,用该计数器测频,不管频率高低,其精度是相同的。
这时,误差仅发生在计数器2对的计数值
上,因为主门2与之间并无同步关系,故仍存在量化误差。
不过,通常,故误差相对小得多。
多周期同步计数器测频的误差为:
,N为T时间内晶振震荡的次数。
3、系统整体框图
图2-3等精度测频的系统总体框图
4、框图解释:
1、波形变换器用来将待测正弦波变换成同频率的方波,以便于后面的数字电路的处理,通常使用比较器或是施密特触发器来完成。
2、等精度测频器即是我们设计的核心单元,主要用来数出待测信号以及CLK_50M在一秒的定时内震荡的次数;里面包括两个32位的寄存器,这两个寄存器共用一组位置、读写、片选、数据总线,CPU可以通过这组总线来访问两个寄存器,从而便于CPU读取并计算出待测信号的频率。
3、CPU用来读取“等精度测频”模块中的两个计数值,再利用这两个计数值推算出待测信号的频率,并获取按键指令以及控制显示设备用来显示结果。
4、按键用来接收用户的输入,每按一个键就会产生一个中断,使CPU转而执行相应的中断服务程序,从而完成相应的工作。
5、显示设备可由led或是12864等简单、便宜的显示设备组成,通过CPU的控制把测得的数据(两个计数其中的值或是被测信号的频率)显示出来。
4)采用Verilog或者VHDL实现等精度测频的模块
等精度测频模块是本实验的核心模块,也是我们实验的主要内容,要求同学们用VHDL或是Verilog语言中的至少一种写出其功能,并用仿真工具进行时序仿真,验证模块的正确性。
有条件的可以采用任一款式的单片机访问该等精度的测频模块,直接使用函数发生器产生的方波作为待测信号,从而验证该模块的正确性。
等精度测频模块是由三个更小的子模块组成的,分别是:
异步秒脉冲模块、同步秒脉冲模块、计数器模块。
这三个模块的符号图如下所示:
Zhangfengying_Asyn_Sec_pulse_Module
图2-4异步秒脉冲模块
Zhangfengying_Syn_Sec_pulse_Module
图2-5同步秒脉冲模块
Zhangfengying_Counters
图2-6计数器模块
三个模块作用简介
1、异步秒脉冲模块:
用来产生接近一秒的正电平,系统正是通过计算这一秒内待测信号的振动次数以及CLK_50M的振动次数,再通过这两个次数算出待测信号的频率的。
之所以说是“异步秒脉冲”,这里的“异步”是相对于待测信号的步调的,也就是说,不与待测信号的上升沿或是下降沿同步,那么就是“异步的”。
2、同步秒脉冲模块:
根据异步秒脉冲模块产生的与待测信号同步的接近一秒的正电平,这里说的“同步”是相对于待测信号的,也就是说新生成的同步秒脉冲的起始时刻为待测信号的某一个上升沿(或下降沿),结束时刻也是待测信号的某一个上升沿(或下降沿)。
3、计数器模块:
用来数出同步秒脉冲的时间内CLK_50M震动的次数,比如说N1,同时也可以数出同步秒脉冲时间内待测信号的振动次数,比如说N2,那么待测信号的频率将会是:
N2/N1×50000000。
该模块的内部有两个计数器,分别是CNTR1_CLK50M和CNTR2_SigX,其中前者对50M的CLK进行计数,后者对待测信号X进行计数,具体程序见后面附录Counters.V中的内容。
一秒结束后计数的最终结果存放在reg_CLK50M_N和reg_SigX_N中。
该模块有4个以CPU打头的信号线:
CPU_CS,CPU_RD,CPU_Addr和CPU_RD_Data,它们正好和任何一款CPU的片选、读、位置和读数据总线连接起来,用来读取reg_CLK50M_N和reg_SigX_N这两个寄存器中的数据。
当CPU读出这两个寄存器中的数据之后就可以统计简单的计算得到待测信号的频率,并显示之。
具体程序见后面附录Counters.V中的内容。
三个模块之间的连接
上文所讲的三个模块必须通过的正确的连接,产生一个更大的顶层模块才能完成等精度测频的任务。
具体连接方式见附录。
四、实验过程
1、在电脑上安装QuartusII或MaxplusII,最好是安装QuartusII。
2、读懂本文所附的参考程序,在QuartusII中为每一个模块建立仿真激励文件,分别给三个子模块仿真,再对顶层模块进行仿真。
3*、将Verilog代码改写为VHDL的代码。
4*、有条件的同学可以使用开发板做成模块,再用单片机访问。
五、实验结果分析
Clk=50M,当输入的信号为1M时的仿真波形:
从图中可以看出reg_CLK50M_N=00000000000000000000000000110010即50
reg_SigX_N=0000000000000000000000000000001即1
计算可得输入信号的频率:
(reg_SigX_N/reg_CLK50M_N)*50000000.0=2500000.0(HZ)与实际输入相同。
Clk=50M,当输入的信号为5M时的仿真波形:
从图中可以看出reg_CLK50M_N=00000000000000000000000000000110即10
reg_SigX_N=0000000000000000000000000000001即1
计算可得输入信号的频率:
(reg_SigX_N/reg_CLK50M_N)*50000000.0=5000000.0(HZ)与实际输入相同。
。
六、思考题
1、为什么等精度测频比《电子测量与仪器》书上讲的“高频宜测频,低频宜侧周”要优越?
答:
《电子测量与仪器》书上讲的“高频宜测频,低频宜侧周”,可能会多测或少测一个脉冲这样的话,待测信号频率越高多测一个或少测一个的影响不大但是当待测频率较低时这种误差则是致命的。
而等精度测频法使测试的闸门脉冲与待测信号完成了同步这样就避免了多测一个和少测一个的误差,因此对几乎所有频率是一样的。
2、等精度测频原理中为什么能实现“等精度”,这个“等精度”是相对于哪个信号而言的“等精度”?
答:
是相对于待测信号的等精度。
七、程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY_Asyn_Sec_Pulse_ModuleIS
PORT(
CLK_50M:
instd_logic;
Asyn_Sec_Pulse:
outstd_logic);
END_Asyn_Sec_Pulse_Module;
ARCHITECTUREtranslatedOF_Asyn_Sec_Pulse_ModuleIS
SIGNALcnt:
std_logic_vector(31DOWNTO0);
SIGNALreg_Asyn_Sec_Pulse:
std_logic;
SIGNALAsyn_Sec_Pulse_xhdl1:
std_logic;
BEGIN
Asyn_Sec_Pulse<=Asyn_Sec_Pulse_xhdl1;
PROCESS
BEGIN
WAITUNTIL(CLK_50M'EVENTANDCLK_50M='1');
IF(cnt<"00000010111110101111000010000000")THEN
cnt<=cnt+"00000000000000000000000000000001";
ELSE
cnt<="00000000000000000000000000000000";
reg_Asyn_Sec_Pulse<=NOTreg_Asyn_Sec_Pulse;
ENDIF;
ENDPROCESS;
Asyn_Sec_Pulse_xhdl1<=reg_Asyn_Sec_Pulse;
ENDBehavioral;;
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY_Syn_Sec_Pulse_ModuleIS
PORT(
Sig_X_In:
INstd_logic;
Asyn_Sec_Pulse_In:
INstd_logic;
Syn_Sec_Pulse_Out:
OUTstd_logic);
ENDSyn_Sec_Pulse_Module;
ARCHITECTUREtranslatedOFSyn_Sec_Pulse_ModuleIS
SIGNALreg_Syn_Sec_Pulse_Out:
std_logic;
SIGNALSyn_Sec_Pulse_Out_xhdl1:
std_logic;
BEGIN
Syn_Sec_Pulse_Out<=Syn_Sec_Pulse_Out_xhdl1;
PROCESS
BEGIN
WAITUNTIL(Sig_X_In'EVENTANDSig_X_In='1');
IF(Asyn_Sec_Pulse_In='1')THEN
reg_Syn_Sec_Pulse_Out<='1';
ELSE
reg_Syn_Sec_Pulse_Out<='0';
ENDIF;
ENDPROCESS;
Syn_Sec_Pulse_Out_xhdl1<=reg_Syn_Sec_Pulse_Out;
ENDBehavioral;
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYzhangfengying_CountersIS
PORT(
Sig_X_In:
INstd_logic;
CLK_50M:
INstd_logic;
Syn_Sec_Pulse_In:
INstd_logic;
CPU_CS:
INstd_logic;
CPU_RD:
INstd_logic;
CPU_Addr:
INstd_logic;
CPU_RD_Data:
OUTstd_logic_vector(31DOWNTO0);
ENDCounters;
ARCHITECTUREtrandslatedOF_CountersIS
SIGNALreg_CPU_RD_Data:
std_logic_vector(31DOWNTO0);
SIGNALreg_CLK50M_N:
std_logic_vector(31DOWNTO0);
SIGNALreg_SigX_N:
std_logic_vector(31DOWNTO0);
SIGNALCNTR1_CLK50M:
std_logic_vector(31DOWNTO0);
SIGNALCNTR2_SigX:
std_logic_vector(31DOWNTO0);
SIGNALCPU_RD_Data_xhdl1:
std_logic_vector(31DOWNTO0);
BEGIN
CPU_RD_Data<=CPU_RD_Data_xhdl1;
PROCESS
VARIABLExhdl_initial:
BOOLENA:
=TRUE;
BEGIN
IF(xhdl_initial)THEN
CNTR1_CLK50M<="00000000000000000000000000000000";
CNTR2_SigX<="00000000000000000000000000000000";
xhdl_initial:
=FALSE;
ELSE
WAIT;
ENDIF;
ENDPROCESS;
PROCESS
BEGIN
WAITUNTTL(Syn_Sec_Pulse_IN'EVENTANDSyn_Sec_Pulse_In='0')OR(CLK50M'EVENTANDCLK50M='1');
IF(NOTSyn_Sec_Pluse_In='1')THEN
CNTR1_CLK50M<="00000000000000000000000000000000";
ELSE
CNTR1_CLK50M<=CNTR1_CLK50M+"00000000000000000000000000000001";
ENDIF;
ENDPROCESS;
PROCESS
BEGIN
WAIT_UNTIL(Syn_Sec_Pulse_In'EVENTANDSyn_Sec_Pulse_In='0');
reg_CLK50M_N<=CNTR1_CLK50M;
reg_SigX_N<=CNTR2_SigX;
ENDPROCESS;
PROCESS
BEGIN
WAIT_UNTIL(CLK50M'EVENTANDCLK50M='1');
IF((CPU_CS='1')AND(CPU_RD='1'))THEN
IF(CPU_Addr='0')THEN
reg_CPU_RD_Data<=reg_CLK50M_N;
ELSE
reg_CPU_RD_Data<=reg_SigX_N;
ENDIF;
ELSE
reg_CPU_RD_Data<="ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
ENDIF;
ENDPROCESS;
CPU_RD_Data_xhdl1<=reg_CPU_RD_Data;
ENDBehavioral;
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY_Test_Freq_Metor_TopIS
PORT(
Sig_X_In:
INstd_logic;
CLK_50M:
INstd_logic;
CPU_CS:
INstd_logic;
CPU_RD:
INstd_logic;
CPU_Addr:
INstd_logic;
CPU_RD_Data:
OUTstd_logic_vector(31DOWNTO0);
Test_Asyn_Sec_Pulse:
OUTstd_logic;
Test_Syn_Sec_Pulse:
OUTstd_logic);
END_Test_Freq_Metor_Top;
ARCHITECTUREtranslatedOF_Test_Freq_Metor_TopIS
SIGNALAsyn_Sec_Pulse:
std_logic;
SIGNALSyn_Sec_Pulse:
std_logic;
SIGNALCPU_RD_Data_xhdl1:
std_logic_vector(31DOWNTO0);
SIGNALTest_Asyn_Sec_Pulse_xhdl2:
std_logic;
SIGNALTest_Syn_Sec_Pulse_xhdl3:
std_logic;
BEGIN
CPU_RD_Data<=CPU_RD_Data_xhdl1;
Test_Asyn_Sec_Pulse<=Test_Asyn_Sec_Pulse_xhdl2;
Test_Syn_Sec_Pulse<=Test_Syn_Sec_Pulse_xhdl3;
U1:
_Asyn_Sec_Pulse_Module
PORTMAP(
CLK_50M=>CLK_50M,
Asyn_Sec_Pulse=>Asyn_Sec_Pulse);
U2:
_Syn_Sec_Pulse_Module
PORTMAP(
Sig_X_In=>Sig_X_In,
Asyn_Sec_Pulse_In=>Asyn_Sec_Pulse,
Syn_Sec_Pulse_Out=>Syn_Sec_Pulse);
U3:
_Counters
PORTMAP(
Sig_X_In=>Sig_X_In,
CLK_50M=>CLK_50M,
Syn_Sec_Pulse_In=>Syn_Sec_Pulse,
CPU_CS=>CPU_CS,
CPU_RD=>CPU_RD,
CPU_Addr=>CPU_Addr,
CPU_RD_Data=>CPU_RD_Data_xhdl1);
Test_Asyn_Sec_Pulse_xhdl2<=Asyn_Sec_Pulse;
Test_Syn_Sec_Pulse_xhdl3<=Syn_Sec_Pulse;
ENDBehavioral;
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtestIS
ENDtest;
ARCHITECTUREtranslatedOFtestIS
CONSTANTxhdl_timescale:
time:
=1ns;
COMPONENTTest_Freq_Metor_Top
PORT(
Sig_X_In:
INstd_logic;
CLK_50M:
INstd_logic;
CPU_CS:
INstd_logic;
CPU_RD:
INstd_logic;
CPU_Addr:
INstd_logic;
CPU_RD_Data:
OUTstd_logic_vector(31DOWNTO0);
Test_Asyn_Sec_Pulse:
OUTstd_logic;
Test_Syn_Sec_Pulse:
OUTstd_logic);
ENDCOMPONENT;
SIGNALSig_X_In:
std_logic;
SIGNALCLK_50M:
std_logic;
SIGNALCPU_CS:
std_logic;
SIGNALCPU_RD:
std_logic;
SIGNALCPU_Addr:
std_logic;
SIGNALCPU_RD_Data:
std_logic_vector(31DOWNTO0);
SIGNALTest_Asyn_Sec_Pulse:
std_logic;
SIGNALTest_Syn_Sec_Pulse:
std_logic;
BEGIN
U:
Test_Freq_Metor_Top
PORTMAP(
Sig_X_In=>Sig_X_In,
CLK_50M=>CLK_50M,
CPU_CS=>CPU_CS,
CPU_RD=>CPU_RD,
CPU_Addr=>CPU_Addr,
CPU_RD_Data=>CPU_RD_Data,
Test_Asyn_Sec_Pulse=>Test_Asyn_Sec_Pulse,
Test_Syn_Sec_Pulse=>Test_Syn_Sec_Pulse);
PROCESS
VARIABLExhdl_initial:
BOOLEAN:
=TRUE;
BEGIN
IF(xhdl_initial)THEN
CLK_50M<='0';
WHILE(TRUE)LOOP
WAITFOR1*xhdl_timescale;
CLK_50M<=NOTCLK_50M;
ENDLOOP;
xhdl_initial:
=FALSE;
ELSE
WAIT;
ENDIF;
ENDPROCESS;
PROCESS
VARIABLExhdl_initial:
BOOLEAN:
=TRUE;
BEGIN
IF(xhdl_initial)THEN
Sig_X_In<='0';
WHILE(TRUE)LOOP
WAITFOR100*xhdl_timescale;
Sig_X_In<=NOTSig_X_In;
ENDLOOP;
xhdl_initial:
=FALSE;
ELSE
WAIT;
ENDIF;
ENDPROCESS;
PROCESS
VARIABLExhdl_initial:
BOOLEAN:
=TRUE;
BEGIN
IF(xhdl_initial)THEN
CPU_CS<='0';
CPU_RD<='0';
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 测量 仪器 检测 实验 报告