【精品博文】做算法设计的FPGAer应该多用VHDL
VHDL似乎快被FPGA/ASIC界遗忘了。不说ASIC那几个工具本来就不待见VHDL,越来越多的高校也采用与C形似的verilog进行教学,各个论坛讨论群里常见的问题或者求助绝大多数也是以Verilog系列为主。偶尔几个VHDL语法帖子多半也是无人搭理。
纵然VHDL的类型转换让人崩溃,还是有很多优秀的特性。这些特性有一些被sv所借鉴,比如记录类型record、再比如signal数据类型。个人使用后的感觉是这些特性非常类似面向对象的编程思想,因而非常适合大规模复杂逻辑为主的算法建模。建议算法实现工程师可以多多使用VHDL。
下面举几个特性的例子说明一下。
1、使用record类型定义模块接口。VHDL的record类型类似C语言中定义的结构体。VHDL支持record数据类型作为模块的接口定义。对于厌倦了超级繁琐漫长繁复但没啥意义模块接口和变量说明的FPGAers,record类型简直神器。将大大减少代码量,同时使端口例化、互联变得容易。值得一提的是record类型体现了数据结构的特点。将同一模块下的信号量打包,如fifo的读写接口,有利于代码阅读和维护,更为了更大规模、更复杂逻辑的建模奠定基础。
2、package的应用。record类型的引入有了数据结构的影子,package则能看出面向对象编程中“类”的影子。结合record类型,把新定义的对record类型定义的变量的赋值、变换等常用操作,以function的形式打包到一个package中。在上层模块package中use进来,从下而上最终组成系统。各个package由于功能独立完全,可以很方便的继承、扩展,从而更容易代码复用。这种面向对象的编程思想,非常匹配一些复杂逻辑的算法硬件加速。
3、属性的应用。VHDL最被诟病的就是其及其严格的类型转换。但是VHDL完备的属性却使得代码对信号位宽具有更好的兼容性。这有啥用?这能让你的代码通用性更好。通用性更好有啥用?可以使你的模块独立性更好,从而在更小的改动下完成系统的搭积木操作。对类似a<= {Width{1'b1}}写法感到崩溃的盆友体会一下,a <= a'HIGH的简洁。当然有人说Verilog中可以把位宽定义成parameter,也很方便啊。那你可能没做过有符号数,在位宽参数化情况下的符号位扩展吧。
附以下是VHDL中预定义的可综合的数值类属性:
d’LOW –返回数组索引的下限值
d’HIGH –返回数组索引的上限值
d’LEFT –返回数组索引的左边界值
d’RIGHT –返回数组索引的右边界值
d’LENGTH –返回矢量的长度值
d’RANGE –返回矢量的位宽范围
。。。。。。 当然还有更多。
最后说几个VHDL的缺点平衡一下本文。强制类型转换就不说了,其断言语句比较弱,对FPGA综合器综合指令的支持更是太弱了。