基于FPGA的TDC(数字时间转换)设计
额,老师让做一个TDC的计时模块用FPGA,那就做呗。。。
首先说一句,我在做的过程中发现有些人说vivado不太可以做TDC的后仿,我自己试着发现是可以的,当然也许我其实是错的 哈哈哈 先不管了。
首先上一张后仿的图
大家不要在意我的傻吊命名。我设置的起始和结束信号之间的差值是21ns,那我最后的结果是多少呢
(5-1)*4+(37+27)*76/1000=20.864ns 我不知道精度算不算高。论文说分辨率达到50ps左右 我表示信号的延时的差可能都不止50ps。。。
其中5是粗计时,reg3是37代表起始时刻细技术和reg3_stop代表结束时刻细技术。76为一个进位链的延迟(大概哈)
我的方法是这样的:
假设上图第一个信号是时钟信号,第二个是我们所要求的测量时间,我们可以把它分为如下的测距形式:
这也就解释了为什么我后仿的公式粗技术要减1了吧。
那么细技术怎么计,有很多方法,什么相移法啊,游标法啊。。。这个大家看看论文就知道了。FPGA的话还是要用进位链来做,利用将进位链收尾相连实现计时。
以xilinx为例,进位链如下:
一个slice里有一个carry4,起始原理很简单,通过位选择器mux赋予一定的控制信号,使得我们的计时信号的走向为
然后co3信号接下一片的cin信号,以此往复。这样每一个进位输出CO变会间隔一定的延时,而这个延时便是信号在走线+位选择器的逻辑延时,可以近似看成相等。如果以一整个carry作为一级延时,可以得到更好的延时一致性但会牺牲精度。这个大家可以取舍。
由于我只是进行了后仿所以对实际结果并不是很确定,暂时先更到这,也有可能就是错的也不一定哈哈哈,疫情结束回去看看结果。
不过总结一下给需要的小伙伴:
1.信号的走线延时很关键
2.进位链的布局,以及后续D触发器的布局很关键,影响延时和一致性
3.进位链的原理要明白,起始输入信号一定要接CYINT接口因为是第一片
4.inputdealy要充分考虑