FPGA/CPLD开发所使用的代码,我们通常称之为硬件描述语言(Hardware Description Language),目前最主流的是VHDL和Verilog。VHDL发展较早,语法严谨;Verilog类似C语言,语法风格比较自由。IP核调用通常也是基于代码设计输入的基础之上,今天很多EDA工具的供应商都在打FPGA/CPLD的如意算盘,FPGA/CPLD的设计也在朝着软件化、平台化的方向发展,也许在不久的将来,越来越多的工程只需要设计者从一个类似苹果商店的IP核库中索取组件进行配置,最后像搭积木一样完成一个项目,或者整个设计都不需要见到一句代码。当然了,未来什么情况都有可能发生,但是底层的代码逻辑编写方式无论如何还是有其生存空间的,毕竟一个个IP核组件都是从代码开始的,所以对于初入这个行当的新手而言,掌握基本代码设计的技能是必须的。
我们不过多谈论VHDL和Verilog语言孰优孰劣,总之这两种语言是当前业内绝大多数开发设计所使用的语言,从二者对电路的描述和实现上看,有许多相通之处。无论是VHDL还是Verilog,建议初学者先掌握其中一门,至于到底先下手哪一门,则需要读者根据自身的情况做考量。对于没有什么外部情况限制的朋友,若之前有一定的C语言基础,不妨先学Verilog,这有助于加快对语法本身的理解。在将其中一门语言学精、用熟之后,最好也能够着手掌握另一门语言。虽然在单个项目中,很少需要大家“双语齐下”,但在实际工作中,还是很有可能需要去接触另一门语法所写的工程。网络上有很多很好的开源实例,若你只会Verilog,而参考实例却是VHDL的,那么就让你很尴尬了;忽然有一天A同事离职,老板把他写个半半的Verilog工程扔给只会VHDL的你维护,那你可就被动难堪了……所以嘛,对于VHDL和Verilog的取舍问题,建议先学精一门,也别忘了兼故另一门,无论哪一种语言,至少咱也要能看懂别人的设计。
HDL语言虽然和软件语言有许多相似之处,但由于其实现对象是硬件电路,所以他们之间的设计思想存在较大差异。尤其是那些做过软件编程的朋友,很喜欢用软件的顺序思想来驾驱HDL语言,岂不知HDL实现的硬件电路大都是并行处理的。也许就是这么个大弯转不过来,所以很多朋友在研究HDL语言所实现的功能时常常百思不得其解。对于初学者,尤其是软件转行过来的初学者,笔者的建议是不要抛开实际电路而研究语法,在一段代码过后,多花些精力比对实际逻辑电路,必要时做做仿真,最好能再找些直观的外设在实验板上看看结果。长此以往,若能达到代码和电路都心中有数,那才证明真真正正掌握HDL语言的精髓了。
HDL语言的语法条目虽多,但并非所有的HDL语法都能够实现到最终的硬件电路,由此进行划分,可实现为硬件电路的语法我们常称为可综合的语法,而不能够实现到硬件电路中,却常常可作为仿真验证的高层次语法我们则称之为行为级语法。很多朋友在初学语法时,抱着一本语法书晕头转向的看,最后实战的时候却常常碰到这语法不能用那语法不支持的报错信息,从而更加抱怨HDL不是好东西,学起来真困难。其实不然,可综合的语法是一个很小的子集,对于初学者,建议先重点掌握好这个子集,实际设计中或许靠着10来条基本语法就可以打天下了,怎么样?HDL语言一下变简单了吧。这么说一点不夸张,本书的重点就是要通过各种可实现到板级的例程让大家快速的掌握如何使用可综合的语法子集完成一个设计。后面一节我们会将常用的可综合语法子集逐一罗列并简单介绍。对于入了门的同学们,也不是说掌握了可综合的语法子集就万事大吉了,话说“革命尚未成功,同志还需努力”。行为级语法也非一无是处,都说“存在即是合理”,行为级语法也大有用处。一个稍微复杂的设计,若是在板级调试前不经过几次三番的仿真测试,一次性成功的概率几乎为零。而仿真验证也有自己的一套高效便捷的语法,如果再像底层硬件电路一样搭仿真平台,恐怕就太浪费时间了。行为级语法最终的实现对象不是FPGA/CPLD器件,而是咱手中的电脑,动辄上G甚至双核、四核的CPU可不愿做老牛拉破车的活,所以行为级语法帮助我们在仿真过程中利用好手中的资源,能够快速、高效的完成设计的初期验证平台搭建。因此,掌握行为级的语法,可以服务于我们在设计的仿真验证阶段的工作。说多了,大家不要晕,本书重点在可综合语法,也是初学者重点突击方向,行为级语法是更高层次设计的追求,作为初学者,咱可以缓一缓,话说“先会走路再学飞”嘛。
对于HDL语言的学习,笔者根据自身的经验,提几点建议。
首先,手中需要准备一本比较完整的语法书籍,这类书市场上已经是满天飞了,内容相差无几,初学者最好能在在开始FPGA/CPLD的学习前花些时间认真的看过一遍语法,尽可能的理解每条语法的基本功能和用法。当然了,只需要大家认真看过、理解过,做到相关语法心中有数就行,咱也不是为了应付考试,也没必要去死记硬背任何东西。语法的理论学习是必须的,能够为后面的实践打下坚实的基础。有些实在不好理解的语法,也不要强求,今后在遇到类似语法在实例中的参考用法时再掌握不迟。
其次,参考一些简单的例程,并且自己动手写写代码实现相同或相近的电路功能。这个过程中可能需要结合实际的FPGA/CPLD开发工具和入门级学习套件。FPGA/CPLD的开发工具前面章节已经有所介绍,主要是掌握Quartus II(Altera公司的器件使用)或ISE(Xilinx公司的器件使用)的使用,学会使用这些工具新建一个工程、编写代码、分配管脚、进行编译、下载配置文件到目标电路板中。入门级的学习套件,简单的说,就是一块板载FPGA/CPLD器件的电路板,这块电路板不需要有很多高级的外设,一些简单的常见外设即可(如蜂鸣器、流水灯、数码管、UART、IIC等);一条下载线和相关的连接线。通过开发工具我们可以进行工程的建立和管理;而通过学习套件,我们就可以直观的验证工程是否实现了既定的功能。在实践的过程中,大家一定要注意自己的代码风格,当然了,这很大程度上取决于参考例程的代码风格。至于什么样的学习套件配套的参考例程是规范的,倒也没有一个界定之说,在建议大家选择口碑较好的学习套件的同时,也非常推荐大家多去读读FPGA/CPLD原厂Altare(qts_qii5v1.pdf)或Xilinx(xst.pdf)的官方文档,在他们的一些文档手册中有各种常见电路的实现代码风格和参考实例。在练习的过程中,大家也要学会使用开发工具生产的各种视图,尤其是RTL视图。RTL视图是用户输入代码进行综合后的逻辑功能视图,这个视图很好的将用户的代码用逻辑门的方式诠释出来,初学者可以通过查看RTL视图的方式来看看自己写的代码所能实现的逻辑电路,以加深对语法的理解;反之,也可以通过RTL视图来检验当前所写的代码是否实现了期望的功能。
总之,HDL语言的学习,简单的归纳,就是需要初学者多看、多写、多思考、多比对。
本书限于篇幅和笔者的习惯,主要实验说明和例程将以Verilog语言为主,但也会给出相应的VHDL语言的例程。本章后面的基础语法部分内容也不会太详细的讲解,只是蜻蜓点水般带过——简单给出基本的用法模版,但是大家也别担心,我们会把重点放在后面的实例章节更深入的引领大家学以致用。当然了,语法本身总是枯燥乏味的,我们更建议大家在实例章节多回过头来细细品味语法。