在FPGA的设计当中,时序约束的重要性不言而喻。这也是要做好FPGA设计必须掌握的一门基本功。但是我发现,很多初学者甚至有一两年设计经验的已经入门的工程师(包括本尊..汗),并不重视这一基本技能。
归根到底原因可能有以下几个方面:1.没有遇到问题,代码写完后编译通过了,板测功能实现就OK啦。2.感觉有点无从下手,没有很系统的资料,有些概念难以理解,公式又多,并且sdc文件里面的相关约束语法比较陌生,所以干脆先放下,等以后遇到问题再说。在这里,我想说得是,出来混,早晚得还滴。首先,编写完代码,系统能跑起来只是完成设计中的一小部分,调试才是花比较多的时间。有好几次调试我都感觉我不是在调试板子,而是被板子调戏…….
正是因为走过前面的这么多坑,所以我下定决心,务必要拿下一这块。然后网上各种查阅前辈的分享经验,啃官网手册,花了将近一个多月的时间,慢慢消化,转化为自己的知识点。然后才有了这篇博客。
再开篇之前,我想声明以下两点:
1.时序约束重要。这话说得是时序很重要,好的时序是设计出来的,不是约束出来的。一个好的设计,良好的代码习惯才是最重要的。
2.高速信号。通常有人会说,我的时钟才几MHz,不用约束啦。我觉得这话有点不妥。高速信号通常来说可以分为两类,一种是高频信号,另外一种是上升时间很快的信号。信号的带宽与上升时间有个估算公式,即BW=0.35/上升时间,BW单位为Hz,上升时间单位为秒,所以就算频率很低的数字信号也有可能是高速信号。
时序约束这一个知识点,我打算分成两篇来介绍,第一篇介绍一下基本概念,先有个概念嘛,要不然后面都有点不知所云啦;第二篇是介绍常用的一些指令以及约束的流程。通过这两篇博客把自己这段时间的收获记录下来,有理解不对的地方希望大家指正,要是能够帮助到一些正在学习这块的童鞋,那就更好啦。哈哈….
言归正传,下面正式进入正文:
时序约束基本概念:
启动沿(launch)与锁存沿(latch)
这对概念就比较简单了,能用图说话的就不用文字,一目了然。