天天看点

FPGA之道(73)设计方法学与FPGA程序设计的境界

文章目录

  • ​​前言​​
  • ​​设计方法学讨论​​
  • ​​FPGA程序设计的境界​​

前言

《FPGA之道》。

设计方法学讨论

当实现一个FPGA项目时,我们的主要工作其实不是敲击键盘编写出华丽丽的HDL代码,恰恰相反,思考如何编写出恰当的HDL代码会占用更多的时间。这就好比写作文前要先打草稿、先列大纲,写作过程中再对写作思路不断修正、斟字酌句一样,在开始FPGA项目的实现以及实现FPGA项目的过程中,也是少不了类似的过程。这一过程就是FPGA项目的设计过程。事实上,决定FPGA项目成败的主要因素就在于其设计的环节,因此,接下来,我们就来讨论一些基本的设计方法和思路。

第一、模块化设计。

模块化设计就像搭积木,每个模块相当于一个零件,通过将这些零件有机的组合在一起,就可以形成不同功能的产品。由于每个模块单独完成一项功能,因此,模块化的设计思路可以将复杂的问题划分为一系列简单的小问题来逐个解决,并且也利于今后的问题定位和修改。同时,一个模块可以用于产品A,也可以用于产品B,由此可见,模块化也是增强设计重用性的前提。

需要注意的是,在从FPGA项目中抽象出一个个具体的模块时,要尽量减小模块与模块之间功能的冗余度,同时一定要确定每个模块的接口方式和特性,这样每个模块在实现的时候就不需要顾及其它模块的实现策略,只要确保输入、输出接口符合设计时的约定即可,从而可以做到独立实现。

第二、层次化设计。

如果仅仅是进行模块化设计,那么当问题比较复杂时,可能会划分出成千上万个模块,这样的代码结构,非常不利于代码的阅读,且由于每个模块功能过细,很难看出该模块在整个FPGA项目中的作用。因此,为了提高代码的可理解性,我们在模块化设计的基础上再引入层次化设计。

层次化设计就好像我们看Google地图一样,先定位国家版图,再定位省、州级版图,然后再定位市、区级地图,最后定位到街道级地图,从而找到我们关心的饭馆、商店或加油站的具体位置。因此,引入了层次化设计方法的FPGA项目,在模块划分时,就会分为若干个层级。首先,粗划分,从宏观上将一个问题划分为几大单独功能模块。其次,细化分,对于粗划分得到的功能模块,进一步划分出子模块。最后,精划分,即经过了若干次细化分后,已经得到了一些功能相对比较单一的模块,无需继续划分也可简单实现。

通常来说,为了方便模块的定位和查找,在层次化设计FPGA项目时,建议层级最好不要超过5层,一般限定在3层左右为佳。

最后,层次化设计在进行模块抽象时,有三种思路——自顶向下、自底向上和中间相遇。自顶向下,即先粗划分、再细划分、精划分;自底向上,即先精划分,然后在通过多个子模块组合出功能更概括一些的父级模块,直至最后实现顶层模块;中间相遇,即兼顾使用自顶向下与自底向上两种思路,它们相遇之时便是层次化完成之日。总得来说,自顶向下的层次化设计思路最符合人们的思维,也是占据着当前EDA工具的主流思路,当完成层次化的模块划分之后,具体使用HDL编程实现模块时,则往往从最底层的模块开始。

第三、分析时钟频率。

一个FPGA项目对时钟频率的要求,很大程度上决定了整个FPGA设计时的侧重点。因为要想保证时序的正确性,对于高频时钟驱动的时序逻辑,我们必须设计小延迟的组合逻辑,而对于低频时钟驱动的时序逻辑,我们则可以设计大延迟的组合逻辑。

第四、思路调整。

此路不通,可以另辟蹊径。在FPGA设计的时候,也切忌钻牛角尖,一个思路长时间不能走通,不如换个思路,说不定会豁然开朗。

FPGA程序设计的境界

在这一小节,让我们来谈谈FPGA程序设计的心得。随着我们接触FPGA的时间越来越久,经验越来越丰富,我们对FPGA设计的感觉也会慢慢发生转变,接下来,就来谈谈笔者的一些体会。

首先,编写HDL代码时的想法会发生变化。最开始,写的是HDL代码,心中想到的也是HDL代码,还继续着软件的编程思路。慢慢的,写的是HDL代码,心中却能够潜在的抽象出大致的数字逻辑电路,这个时候,已经体会到硬件描述语言与软件编程语言的区别。再继续下去,写的是HDL代码,心中已经能够抽象出CMOS级别的电路结构图来,从而也更能理解一些时序方面的现象。最后,写的是HDL代码,心中已然全是查找表、时钟树、块存储等等实际的FPGA芯片硬件组成要素,这时,已经能够将HDL代码映射到具体的FPGA芯片硬件当中去,对FPGA设计的理解也进一步深入。

其次,HDL代码的抽象级别。最开始,由于受到软件编程思路的影响,因此偏爱使用具有一定抽象层级的语法进行代码描述。慢慢的,随着对硬件概念的理解深入,开始大面积使用最简单且绝对可综合的低抽象级别语法来进行代码描述。最后,随着经验的进一步积累,对各个语法对应的硬件结构及可综合性都比较了解,并且设计的规模也越来越大,因此对代码的驾驭能力也越来越强,且会在适当的时候采用一些高抽象级别的语法来进行代码描述。

第三,HDL语法的掌握、理解。最开始,由于没什么积累,对HDL语法比较陌生。慢慢的,由于只需要掌握一部分HDL语法,就能胜任绝大部分的FPGA设计开发,因此在今后较长的一段时间里,则主要熟悉和使用这一部分语法。最后,随着时间的积累,对语法的掌握也越来越全面,因此代码的描述手段也越来越丰富多彩。

第四,随着工作经验的一步步积累,我们可能慢慢的从最底层的HDL代码实现者,蜕变为FPGA方案的设计者,甚至最终成为硬件系统的设计者。也即从编写代码上升到设计算法、设计系统。

第五,代码的数量。最开始,经验有限,只能完成一些小的FPGA设计,因此代码量不会大。慢慢的,能力越来越强,也能够胜任一些较为复杂的设计,代码量逐渐增多。最后,明白代码量与代码质量并不成正比的道理,因此在今后的设计中,力求精简,同样一个功能往往追求用更简洁的思路、更简短的代码来实现。

第六,时空的概念。最开始,完全没有时空概念,因为还是软件的思路。慢慢的,具有一些时空概念,明白为什么功能和时序都要保证正确性。最后,具有较好的时空概念,面对实际问题游刃有余。