FPGA TDC 进位链

 

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
CYCLONE IV的LE结构图:

可以看到里面有一个4输入的LUT,有一个3输入的LUT。

LE有两种模式,如果是普通模式,就只用到那个4输入的LUT,用来实现4输入的组合逻辑功能。

如果是算术模式,就是用来实现加法运算。这个时间一般DATA D输入为VCC或其他,反正不用。

DATA C选择使用CIN。4输入的LUT就用来实现DATA,DATAB,CIN的加法运算。3输入的LUT用来FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链

 

实现DATA,DATAB,CIN的进位运算。

进位链的输入必须来自上一个进位链的输出,进位链的输出只能输向进位链的输入。

进位链的延时是影响加法运算速度的关键:我是这样理解的,假设是4位+4位的加法运算,如果没有进位运算,那么4位+4位各自对应的位可以同时进行运算,但是在进位的运算上,第1位的进位要等待第0位的进位运算出来,第2位的进位要等待第1位的进位运算出来,第3位的进位要等第2位的进位运算出来,第3位再进行进位运算输出,有4进进位运算,是串行的,延时会增加,这个是多位加法运算成为时序瓶颈的原因。

还有一点要理解:

LUTMASK的理解:说拍了就是一个真值表,对于4输入,输出只有16种结果,所以LUTMASK是16位。每一位代表4输入的一种情况。

从LE结构中可以看出,其实里面有两个LUT,但是这里只有一种真值表。这个原因是:DATA D为1时,LUT MASK的高8位就是4输入 LUT的真值表,下面的3输入的LUT可以认为是DATA D为0时的情况,是LUT MASK的低8位。也就是4输入的LUT,根据DATA D的为1或者0,看作是两个3输入的LUT。

详细理解请看:http://bbs.ednchina.com/BLOG_ARTICLE_3013423.HTM

http://www.alteraforum.com.cn/showtopic-5644-1.aspx

 

LE的原语的出处:找QUARTUS的仿真库文件:FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链

其他的原语从这里找:

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
 

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
逻辑实现的例子:

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
这里一定要注意LUT MASK的使用:

如果设得不对:例如如果DATA 没有输入信号(是空的),但是根据 LUT MASK的真值表发现,在DATA 为1和为0的时候有两种值,那么显然这个真值表是与DATA A有关的,DATA A肯定应该有输入,这个时候编译是不通过的,会报错。如果LUMASK设置得不对,有时候虽然不会报错,但是进位链不会产生,因为根据LUMASK编译器判断输出根本与输入无关,所以就不会有进位链的电路产生。
 

cyclone iv:

    LCELL:LUT 从入到组合逻辑出 0.226ns

              LUT组合逻辑出到另一个相临LUT的入:0.127ns

    进位链:

    EP4CE30F23I7                                 0.278ns   实测:0.167ns(30级构成5ns)

   (

[root@TF /]# <0x0100>:0xaaaaaaa9

mcpset n r 101

[root@TF /]# <0x0101>:0xaaaaaaaa

mcpset n r 102

[root@TF /]# <0x0102>:0xaaaaaaaa

mcpset n r 103

<0x0103>:0xbaaaaaaa

 

 

<0x0100>:0xfffffffe

<0x0101>:0xffffffff

<0x0102>:0xffffffff

<0x0103>:0x0fffffff

)

    EP4SGX230KF40C4ES                     0.012ns 

    EP2S130F1508I4     0.041ns 

    EP2AGX260FF35I5   0.013ns

参考资料:

http://bbs.ednchina.com/BLOG_PERSONALCAT_100226_41415_1.HTM

http://www.alteraforum.com.cn/showtopic-5644-2.aspx

 

遇到的问题:

1.0.2,4,6,。。。  延时递增     1,3,5,7。。。延时递增

  0,1,2,3,4.。。。不是递增,0与1从sumout到bit_out_reg路径延时不同。

2.分析set_up,使用report false path,把时钟路径考虑进去,排序与实际的延时测量结果不同。

3.0-15路径延时不停在变,原因是set false path的路径没有包括路径bit_out_reg[0] - 3,我在想是不是全局时钟端可以加buf什么的?

 

 

曾经遇到的问题:

1.用AII芯片时,延时不固定:要固定全局是G7,还是G5...

                                             即使是同一个BUFG,如果设计改变了,扇出改变了,延时还是会变化,虽然全局的硬件走线并没有变化,但因为扇出增加,由于电容效应,延时会增加。

2.FIT发生错误:不能只固定一个延时链的位置,要全部都固定。

3.使用了电路:将start,stop转化为一个脉冲。电路的up,down寄存器的清零信号接到了clk_en端,在assign中添加约束auto clock enable replacement ,清零信号连到了清零端。FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链

原因及解决方法:譬如延时链是从0-63,但是对寄存器位置的约束只约束了0-47,或者约束了0-63,而且位置也是对的,只是40(随便一个)忘了写约束,漏了,就会报这个错误。个人推测,基本意思:不能将一个延迟链割裂,如果没有把每个延迟链约束完整,就算是割裂了。

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
 

在算术模式下:

Combout = F1(dataa, datab, datac or cin) & datad + F0(dataa, datab, datac or cin) & ! datad

Cout = F0(dataa, d a tab, cin)

通常,datad是连接到VCC,那么,combout是由F1查找表决定(输入是dataa,datab,datac或cin),cout是由F0查找表决定(输入是dataa,datab,cin),如果datad是连接到0,那么,combout的查找表也是F0(输入是data,datab,datac或cin,具体是datac还是cin,是由例化的参数决定的)。

使用MODELSIM可以看到仿真模型的源代码。

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
 

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链

 

 

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
 

 

按照上面的图来构建进位链,代码如下图:

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
仿真是没有问题的,当然仿真的时候,为了显示延时效果,比如说CARRY_IN的COUT端到CARRY_0的CIN端信号,要加个软延时,否则看不到效果,比如说

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链

但是发现一个问题,从构造进位链的LUT_MASK可以看出,CARRY_0的COUT = CIN,但是在后端却发现,是取反过的,COUT=!CIN(查看CARRY_MASK),还有combout的输出(看SUM_MASK)是0,这与原来代码中并没有使用CARRY_IN到CAYYR_4的comb_out有关,所以被优化掉了,所以如果代码中将comb_out用起来,comb_out的sum_mask就对了。但是carry_mask还是不对,这也是软件优化的结果,因为预计到后级的进位链有取反操作,所以在这一级就提前取反了,但是我们并不希望有这样的动作,因为,我们要在特定的时间有特定的翻转,而不是简单的关注最后一级进位链的最终输出,本来想通过调整编译选项,能禁止这个优化,或者加(*keep*),或者(*preserve*),都不能达到此目的。最终采取此方式解决:DATAD的输入设为0,这样,comb_out与cout的输出就一致了,发现后端的综合结果保持了不变。

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链

 

 

 

 

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
 

有如下发现:

在进位链延时上,如果CIN-COUT没有取反操作,那么,FF - FF延时固定是147PS  RR-RR延时固定是278PS,

如果有取反操作 RR - RF,FF-FR是67PS。

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
下面是组合逻辑输出被优化的结果:

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
 

 

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
 

做进位链时遇到的问题:

1.根据WAVE UINON的设计,在寄存器端应该能看到两个上升沿,实际去发现,经常看不到两个上升沿,还是只有1个上升沿,实际原因是下降沿的传播速度远快于上升沿的传输速度,前面那个上升沿与下降沿之间的脉冲宽度,随着逐级传递,这个宽度会越来越小,直至下降沿超过上升沿,脉冲完全消失,导致看不到第1个沿。
TDC思路1:

1.构建延时链,通过查看下升沿或者下降沿的位置,确定当前时延值。下降沿的延时链细分更长一些。

2. WUA  原来的上升沿,变成1个包含两个上升沿的序列,以这个序列在延时链中进行传播,这样可以防止上升沿落在超宽延时单元中这个问题,不可能两个沿都落在超宽延时单元之中。

3.WUB 输入电平为0时,进位链输出都为0.输入变以1之后,进位链输出变以周期信号,周期是大约为1个周期,实现多次测量,提高测量精度。

4.WUC 输入电平为0时,减肥舞输出为全0,输入变以1以后,进位链输出变位周期信号,周期略大于超宽延时单元,即1个延时链之中,会有多个信号周期,再加上最后一个发射单元的余值。这种方法的好处是,测量精度只取决于发射器单元各延时值准不准确,与后面延时链的精度无关,只要关心有几个周期,只需要将发射单元校准好,校准方法是,弄2倍延时链长度,用后一延时链测得的值减去前1个延时链测的值,就是1个周期的值,除以等效的发射单元的延时单元数(这里是假设发射的延时单元是等延时的)

5.

 

下降沿标定的进位链延时:

 

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
上升沿标定的进位链延时

FPGA <wbr> <wbr>TDC <wbr> <wbr> <wbr> <wbr>进位链
 

http://blog.sina.com.cn/s/blog_48fd99310102vigx.html

 

 

 

 

  • 1
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值