TDC进位链

本次项目使用xc6slx45-3cg324l内部的slice分布共有6822个,触发器有54576;每一个slice有四个LUT和8个触发器以及两个独立进位链,3个数据选择器MUX;
1.进位链的j接口结构:
TDC进位链_第1张图片
CI:是上一个CARRY4的进位输出,位宽为1;
CYINT:是进位初始化,位宽为1
DI:数据的输入(两个加数的任意一个),位宽为4
SI:两个加数的异或,位宽为4
O:加法输出结果,位宽为4
CO:是进位输出,位宽是4
TDC进位链_第2张图片
carry4的原理如下:
初始的CYINIT=0,初始的CIN=0;假设两个数相加a=1000,b=1100,则最后输出为8+12=20;则S=0100,DI=1100(也可以是a),
TDC进位链_第3张图片
最后输出的{CO3,O3,O2,O1,O0},只有一个进位链进入到下一个级联中,一个carry对应4个触发器的最终输出;因此两个8bit数相加,则需要两个carry4级联,两个48bit数相加,则需要12个carry4级联。
2.carry4的参数设置
1)我们系统采用200M时钟,5ns一个周期,一个进位链假设为58ps,则需要86个进位链长度,由于carry4最大的长度为120,因此本模块设置120个进位链长度;
2)由于我们测试的是进位链的长度,因此CIN为激光脉冲的电平信号,carry4的D=1111,S=0000,这样才能保证在CIN=1的时刻产生进位为1。
3)本模块只需要一个进位链,因此一个carry4,对应一个触发器,讲解一下D触发器,FDR,FDRE,FDC,FDCE, FDS,FDSE,FDPE
TDC进位链_第4张图片
TDC进位链_第5张图片
TDC进位链_第6张图片
TDC进位链_第7张图片
TDC进位链_第8张图片
TDC进位链_第9张图片
TDC进位链_第10张图片
4)触发器的参数设置
在本模块中一个carry4对应一个FDCE触发器,当开始计数时使能为1,进位链上接收数据为1时使能为0禁止,清零为0,时钟为200M时钟,D为上一个carry4的进位链输出,Q为下一个carry4的进位链输入;因此carry4中CIN为激光脉冲的电平信号,carry4的D=1111,S=0000,当输入为0时,输出的进位为0,这样才能保证在CIN=1的时刻产生进位为1,这个时刻锁定D触发器的数据,延时时间=D触发器中为1时刻的数据长度*进位链延时时间。
5)编码解码过程
(1)编码:
将进位链和D触发器作为底层模块,例化在ctl模块中,用generate for循环生成120个D触发器数值;
gengerate具体参照
https://blog.csdn.net/Archar_Saber/article/details/103108861
generate语句的最主要功能就是对module,reg,assign,always,task等语句或者模块进行复制。
generate语句有generate_for,generate_if,generate_case三种语句。
1,generate_for语句
注意:
(1)必须使用genvar申明一个正整数变量,用做for循环的判断。(genvar是generate语句中的一种变量类型,用在generate_for中声明正整数变量)
(2)需要复制的语句必须写到begin_end语句里面。就算只有一句。
(3)begin_end需要有一个类似于模块名的名字。
TDC进位链_第11张图片
(2)120个进位链长度这样会使得逻辑延迟过大,容易造成时序不收敛。同时D触发器会出现亚稳态的现象。因此在解码之前先对原始数据进行去除亚稳态。
TDC进位链_第12张图片
TDC进位链_第13张图片
(3)解码:
第二步中将0和1分割开后,要从数据流层次解码。
TDC进位链_第14张图片
TDC进位链_第15张图片
先将预处理数据每8bit拆分为15段送入第一级编码模块
TDC进位链_第16张图片
编码模块:每16bit数据通过当前位置数据与上一个bit数据相与进行输出第一级8bit的延时时间输出
TDC进位链_第17张图片
TDC进位链_第18张图片
第一级编码模块又将15段数据每24bit分为5段送入第二级编码模块
TDC进位链_第19张图片
第二级编码模块输出最终的8bit数据
TDC进位链_第20张图片
参考的论文中的解释如下
TDC进位链_第21张图片
(6)测试方法TDC
TDC进位链_第22张图片由于器件的工艺,温度电压的变化存在一定的差异性,因此需要上板子测试其真实的进位链长度。我们采用大量的随机信号输入TDC测量电路,测量包含所有脉冲位置编码,统计出最大的频率为23,则5ns/23=217ps.

你可能感兴趣的:(fpga开发,单片机,嵌入式硬件)