前两篇分别介绍了TDC-GPX2的使用详情以及FPGA控制代码,本文将会该处测量精度以及操作过程
测试平台
由于目前没有高精度时间间隔测量的仪器在身边(之前还有过一台SR620,现在没有了),所以将会采用FPGA自身产生两个可控的时间间隔,最后将测量的结果通过ILA打印出来。
启动测量
开始测量之前,我们先检查硬件连接,确保通信引脚(SCK MOSI MISO SSN INTERRUPT)、参考时钟引脚(CLK)、脉冲触发引脚(STOP1)顺利连接到FPGA的引脚上,之后启动VIVADO,生成BIT流文件之后下载到芯片中,此时ILA的显示界面如下所示:
目前所有的值都是初始值,然后我们按下启动测试按键,再来看看ILA的界面:
此时状态已经跳到状态5(等待状态),数据校验值和预期的一致,目前结果值还没有,因为还没有给STOP脉冲。下面我们给出STOP脉冲,根据程序中所给的stop脉冲间距是10个时钟周期(如下所示):
stop_test #(
.stop_time(4'd10), //脉冲间隔
.stop_continue(4'd3) //每个脉冲高电平所持续的时间
) u1_stop_test(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.stop_en(key2_value),
.stop_pulse(stop_pulse3)
);
所以时间间隔应该是(1s/50M)×10=200ns,下面我们给入STOP信号,ILA显示如下:
上述结果第一个参数表示REFID,结果相差1,说明两个STOP脉冲处于相邻的两个时钟周期内,在分析第二个参数,STOP1为00efc2,用十进制表示就是61378ps=61.378ns,STOP2为00ef85,用十进制表示就是61317ps=61.317ns,按照前文所述的计算公式,得到的时间间隔就是:200-61.378+31.317=199.939,测量误差为199.939-200=0.061ns=61ps,下面我们多测几组数据如下所示:
(时间间隔:200ns)
上图中的误差为13ps;
上图中的误差为10ps;
上图中的误差为23ps;
接下来我们更改时间间隔为35个时间间隔,代码如下所示:
stop_test #(
.stop_time(16'd35),
.stop_continue(16'd3)
) u1_stop_test(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.stop_en(key2_value),
.stop_pulse(stop_pulse3)
);
测量结果如下所示:
(时间间隔700ns)
上图所测的时间间隔为:700.096ns,误差96ps。
上图所测的时间间隔为:700.130,误差130ps。
上图所测的时间间隔为:700.056,误差56ps。
思考
上面的第二组数据明显误差增大,甚至达到百ps级别,我想这个和基准频率源有关,因为FPGA采用晶振作为时钟源,当周期数提高后,对应的误差也会增大,这就是误差的主要来源。其次,FPGA的DCM时钟管理单元是否可靠还有待考究。
结语
本次实验介绍就到此结束了,如果大家有更好的建议或者本文档写的不到之处,欢迎评论区指出。
以下是本实验的工程链接,
CSDN资源链接:
FPGA控制TDC_GPX2时间间隔测量
百度网盘链接:
链接:https://pan.baidu.com/s/1vWyToTMimA1mgutUf7LGkw?pwd=1146
提取码:1146