完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位做过FPGA的朋友相信都遇到过关于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是单向的接口,只需要考虑输出后接收端的时钟沿对齐接口,因此更简单,时序收敛也容易些。 |
|
相关推荐
|
|
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
518 浏览 0 评论
845 浏览 0 评论
1683 浏览 0 评论
454 浏览 0 评论
631 浏览 0 评论
1218 浏览 23 评论
5451 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-3 00:17 , Processed in 0.382872 second(s), Total 39, Slave 30 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号