十五年FPGA老牛谈FPGA时序设计

互联网对FPGA时序分析、时序约束和时序收敛已经有很丰富的解释和说明,这里我讲讲我自己对FPGA时序设计的理解,核心是“时序是设计出来的,不是约束出来的”。

一、什么是时钟?

时钟是FPGA内部用于同步数字电路操作的定时信号,相当于数字系统的“心跳”。其本质是通过专用布线网络分发的电信号,控制寄存器在特定时刻采样数据。可以理解为“时钟(心跳)”每跳动一下,做一次事情。

那么,同一厂家同一批次的两个100MHz的晶振同时接到一块FPGA上,可以把这两个时钟当成一个同一个100MHz时钟用吗?不能,原因一:99.9999MHz和100.0001MHz晶振,只要满足±ppm都是100MHz晶振。预想一下,用100.0001MHz的时钟向FIFO一直充数,用99.9999MHz的时钟一直从FIFO中读数,总有某个时刻FIFO会被充满。原因二:时钟抖动不一样。就算都是准确的100MHz时钟,用其中一个100MHz时钟去采样另一个100MHz时钟产生的信号,因为时钟抖动不一样,采样会错误。

二、时钟资源

地球的资源是有限的,FPGA的时钟资源也是有限的。FPGA有哪些时钟资源可以查看FPGA芯片手册。

三、时钟限高

FPGA的时序是建立在FPGA芯片自身条件的基础上,所以并不是我们想它跑多高的频率它就能跑多高的频率,只能我们去适应它。如果时钟频率高于FPGA芯片本身的能力,那么对不起跑不了就是跑不了。

四、时钟域

在布局布线时,以某一个时钟为驱动的区域。那么,信号从一个时钟域传送到另一个时钟域,即跨时钟域。

设计中出现跨时钟域的情况时需要采用跨时钟域的处理方法。如用BLOCK_RAM或者FIFO进行隔离。

五、同源时钟

同源时钟,顾名思义由一个时钟衍生出的另外的时钟,我把这个时钟和所有衍生时钟理解为同源时钟。如由时钟管理器产生的时钟或由时钟芯片产生的时钟(常见于ADC+FPGA+DAC)的架构。同源时钟不存在第一点中提到的FIFO被充满问题,因为有一个时钟产生,要快都快,要慢都慢。

六、理解所有电路都要花时间的

要能理解所有电路都是要花时间的,而不是功能仿真(现在FPGA设计很少做后仿了)时看到数据和时钟沿严格对齐的假象。

例如,你用时钟上升沿产生一个信号,那么信号生成的时刻肯定是在这个时钟上升沿后的。以读取BLOCK_RAM的数据为例,当BLOCK_RAM的时钟上升沿采集到地址信号后,会从内存中提取相应地址数据送到输出数据线上。那么,输出数据出现的时刻肯定在采样地址信号的时钟上升沿后。

七、建立时间和保持时间

你想用某个时钟的上升沿采集某个信号,那么这个信号在时钟上升沿采集的那段时间就必须是稳定的,否则信号就会产生不确定态。采集时刻之前需要稳定多长时间就是建立时间,采集时刻之后需要稳定多长时间就是保持时间。如果不满足,就会产生时序违例。

八、时序设计原则

第一条:能少则少,即如果一个时钟能实现的电路,不用两个时钟;

第二条:确定一个主时钟作为大部分电路的时钟,其他接口时钟的设计尽量小,然后直接跨时钟域方法传输到主时钟域进行处理。例子可以参见我写的《玩转多接口图像处理项目的时序设计》。

第三条:主时钟使用FPGA全局时钟电路

九、时序违例的解决办法

1,组合逻辑耗时长

把组合逻辑分成适合的几段进行处理。

2,FANOUT过多

把FANOUT过多的信号手动复制,然后KEEP住。

3,时钟设计不好

遵照第八条的原则对FPGA时序进行重新设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值