特权同学

源同步接口时序分析与相移计算一例

0
阅读(2485)

源同步接口时序分析与相移计算一例

曾经有一次,一个朋友在那里感慨:做人真累,要结婚要生子、要买房……。做工程师也很累,有做不完的项目,一个接一个,所面对的问题也是一个接一个,真叫 没完没了。其实不然,做项目和做人本身没有太多牵连,只不过他们都需要当事人有所经历才会有所得,开花结果是我们所期盼的或者说经历这个过程最终的目标, 但过程却更应该是我们所要专注并能够真正让我们有所收获的环节。

在经历了断断续续长达一年的找房看房经历,最终步入买房流程,忽然感觉自己长大了很多。虽然走上工作岗位也有几个年头了,有时却是很多事情需要依靠长辈们 挂心,虽然有些事情经历得确有那么一些坎坷,但无论是抱着怎样的态度只要是经历过了,回头再看看,才会依稀感悟到其实我们在成长,因为每个人在不同的阶段 所面对的一些人事物都是自己人生阅历的一部分。也难怪在一些重大问题的考虑和决议上,姐夫总是劝我多和父母尤其是老爹(通常一家的男主人也许不敢说是独挡 一面,但基本是这个家对外露脸的主要窗口,所以他们的经历势必会更多一些)商量一下,因为到他们那个50来岁的年龄为人处世对各种问题的思考和态度肯定要 比我们年轻人稳重许多。

OK,回到技术话题来。时序问题在FPGA设计中是比较困扰设计者的大问题,经常我们是需要一步一步去经历那些大的小的问题后,再有一些总结和分析甚至需 要归纳出一些常见普遍的应对办法并应用到今后的设计中才能够逐步降低犯错的几率。其实时序问题是最让人琢磨不透,甚至有时候很难想象出现的现象本身居然和 时序有关。特权同学的这个现象确有几分怪异,可以说出现了好几种比较反常的现象,甚至难以解释到只有怀疑是时序问题。其实问题本身并没有什么大不了,说白 了就是时序不收敛,确切的说应该是在时序约束不到位的情况下收敛的时序导致了问题的发生,那说白了就是时序不收敛。

对于一款800*480的LCD,其数据通过一条24bit的RGB数据总线传输,配合着进行数据锁存和控制的是一条33.33MHz的时钟信号线和数据 使能信号DE。通常对于一些小分辨率的LCD时钟频率都较低,有时候即便确实存在一些时序设计不合理的问题,但并不容易甚至不会暴露出来,但是对于特权同 学当前提到的频率却有着较严格的时序要求。

出现的奇怪现象其实是多次了,在设计的不同阶段不同应用中都有过,而每次的现象都有些不同,这就是时序问题让人琢磨不透的原因。对于这里要说的例子,一张图一个表就足以代表LCD的时序,如截图的图1和图2所示。


图1


图2

简单的说,驱动LCD的时钟DCLK在下降沿锁存数据。也就是说,在DCLK的下降沿前的某段时间(即建立时间Tdsu)以及下降沿后的某段时间(即保持 时间Tdhd)数据和DE信号(如果使用HS和VS信号,也必须满足此要求)必须保持稳定。情况不复杂,就看设计中怎么去实现这个要求。

旧有的一个项目,用一片CPLD来驱动LCD,因为没有PLL等时钟产生单元,所以33.33MHz的时钟是FPGA内部和驱动LCD共用的。因为LCD 端要用下降沿锁存数据,那么FPGA内部就必须要上升沿来处理数据,因此通常这两个时钟同频同相好像就能够满足要求。而得到的效果通常必须用时序约束去保 证,这种方式的不可控性比较高,通常对固定器件有着碰运气的成分在里面,当然如果约束得好并且器件也“很给力”那就是可行的。而另一种方式,通常是 FPGA里有专门的时钟产生单元(如PLL、DLL之类),可以产生两个33.33MHz的时钟,通常可以设置他们同频不同相,即相位可调,那么要达到图 示的时序关系也显得比较容易。不过有时候愚夫即便有米也不一定有“炊”,还要看时序约束的功力,纯粹靠调整相位来达到时序收敛是有风险的,或者说没有时序 约束(没有看到时序报告)是无法定论这个设计时序是没有问题的。

插入说一句,LCD时序约束不收敛对于特权同学手头的项目手头的应用来看,会出现显示的图像扭曲、或者一个完整的图画时不时的闪烁,这两种现象不是同时出 现的。并且还有一个很有意思的状况:在基本全部深色的一幅图片中,上述两种现象出现的概率非常低,甚至于不显现问题,而在色彩对比强烈的图像中,问题尤其 突出。仔细想想,其实并不难解释原因,色彩丰富的图像数据电平跳变的较频繁,因为时序不收敛,所以发生误锁存的频率也就多,出现问题的概率也就大。

那么如何对其进行约束呢,特权同学不详细深入,只做个模型供大家参考消化。首先,我们明确时钟和信号之间的关系如图3所示。


图3

在理想状态下,要在LCD信号锁存端口得到图3的时序关系,如果FPGA Clock相位为0,那么取LCD Clock相位为0°即可。而实际情况却非如此简单,因为Signal Bus的众多信号在FPGA Clock上升沿后若干时间才会到达FPGA端口,并且不可能所有信号都同一时刻到达,会存在快的和慢的,即有一个时间段,这里姑且假设最快时间为 td1,最慢时间为td2。同样的,对于LCD Clock信号,虽然设置了0°的相位,但是实际上从PLL或DLL端口输出到达FPGA管脚也会有或多或少的一点时钟网络延时时间,这里假设最快为 tc1,最慢为tc2。同时我们假设LCD Clock相对于FPGA Clock的相位偏移不为0°,而是tshift,这是我们后面需要计算的值,通常情况下0°不会是最理想的相移。此外,我们已经知道的时序值有:时钟信 号周期tclk = 30ns,信号的建立时间tdsu = 8ns,保持时间tdhd = 8ns。

我们不考虑信号在PCB板上的走线延时,这些值相对较小,大多时候可以忽略。设计者也可以根据实际情况考虑进去。对于LCD Clock,其下降沿到达FPGA端口时间为(tc1~tc2)+tshift+(tclk/2)。对于Signal Bus,其到达FPGA端口时间为(td1~td2)。为了满足建立保持时间关系,必须满足如下不等式:

         建立时间:tc1+tshift+(tclk/2)-tdsu > td2

         保持时间:tc2+tshift+(tclk/2)+tdhd < tclk+td1

         代入当前已知值可得:

         建立时间:tshift > td2- tc1-7ns

         保持时间:tshift < td1+7ns-tc2

因此,要取最理想或者说最保险的tshift值,可以是前面两个不等式右端的中间值,即:

         Tshift = ((td2- tc1-7ns)+( td1+7ns-tc2))/2 = (td2+td1-tc1-tc2)/2

回头看看,其实这类时序也是非常典型的源同步接口,和SDRAM接口相比,SDRAM不仅有输出而且有输入,因此在时序分析考虑中,计算相移相对比较复杂;而LCD是单向的接口,只需要考虑输出后接收端的时钟沿对齐接口,因此更简单,时序收敛也容易些。