FPGA中的时钟相移的那些事

最近想清楚了一个困扰很久的问题,这里算是写一下感悟小记。做过一些高速外设控制的朋友应该知道,比如sdram这种在高速场景下,FPGA总是会有两个时钟,一个时钟是用于FPGA内部控制的时钟,一个是实际发送给高速外设的时钟,这两个时钟的频率相同,他们两个的主要作用是一个是用于FPGA内部逻辑控制,另一个是实际发送给高速外设用于外部的控制。按照常理来说,这两个时钟不应该有区别,因为他们的作用实际上都是一样的,都是用于同步外部高速外设所发送的数据,只不过一个是给外部,一个是用于FPGA内部。

但是在实际的参考代码中,你往往可以看到发送给外部的时钟永远是要比内部的时钟的相移提前90°(其他的度数也可以,主要看板子)。如果不信的话可以看看野火中的sdram的代码,它实际发送给sdram的控制时钟是要比FPGA内部的时钟相移提前30°的。这个问题实际上困扰了我许久,但是我还真从没认真思考过这个问题,觉得参考代码怎么做我就怎么做把,但是在我最近做一个高速外设的项目中,总会发现读取的数据就是有时候会出错,我一开始以为是时序没有优化好,导致了这样的问题,可是当我把能加上的时序约束都加上之后,结果发现还是有问题。

然后我就看着那份没有错误路径的timing report陷入了沉思,因为我已经验证过逻辑是肯定没问题,但是时序也没问题,这就有点难搞了。后来我想到了sdram中有个时钟位移的操作,也就是实际发给外设的时钟实际要比FPGA内部的时钟相移提前30°的,后来我试了一下果真可以,至此问题解决。

后来我想了一下为什么这个方法能解决问题,实际上是这样的。就是外设的时钟是由FPGA内部进行发送,由于外设距离FPGA有一段距离,那么当时钟传递到外设时实际上已经比原来的时钟要向后位移一段距离了,PCB走线越长则位移越大,接收到时钟的上升沿后发出数据,而数据传输到FPGA又需要经过一段距离,那么又会有一段延时,那么假设外设的时钟是由FPGA内部控制时钟是没有相位移动的,那么在理想情况下,在FPGA内部的时钟本来应该在外设时钟从FPGA内部出发的那一刻起就应该收到来自外设的数据,可是由于多了一段外设时钟从FPGA到达外设,数据从外设到达FPGA的距离,导致了数据无法在FPGA内部时钟为上升沿的那一刻就到达,从而导致FPGA内部的时钟采集不到正确的数据。

那么如何解决这个问题呢?还是设想理想情况,最理想的情况就是FPGA内部的时钟能够在上升沿这一刻接收到来自外设的数据,那么也就是说外设数据其实要提早到达才行,那么就让实际发送给外设的时钟提前一定的时间就可以,那么也就是实际发送给外设的时钟提早一定的相位即可。当然从另一个角度来说,也可以让FPGA的时钟比实际发送给外部的时钟往后位移一定的相位也可以。这里自己画个时序图应该更好理解,就画控制外设的时钟从FPGA出发,再到外设,外设再返回数据回到FPGA的这个过程,最后画一下FPGA内部的时钟时序即可。

在这里也就说明了为什么在高速外设控制的时候需要时钟相移的问题,在这里还想到了这也可以解释为什么高速外设需要PCB线等长了。假设高速外设的时钟是由FPGA提供,那么当FPGA需要从外部读取数据,也就是和我们上面说的这个情况相同。那么如果外设的数据线的PCB不等长,那么此时给外部的时钟的向前位移的相位就需要以最长的线为参考,假如相移不以这个最长的线为参考那么FPGA取到的数据就是错位的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值