VHDL语言教学的几个关键问题探讨
2012-08-17张文婷
赵 航 张文婷
1.三江学院电子信息工程学院 江苏南京 210012
2.南京磐能电力科技股份有限公司 江苏南京 210061
VHDL(Very high speed intergated circuit Hardware Description Language)是指超高速集成电路硬件描述语言。它用软件编程的方式来描述电子系统的逻辑功能、电路结构和连接形式,与传统的门级方式相比,它更适合大规模系统的设计。因此很多高校的信息技术、计算机技术等专业都开出了VHDL设计课程[1]。笔者在教学过程中发现学生学习VHDL语言时会受到已经学习过的其他软件语言的影响,对VHDL语言作为硬件语言的一些特性和语法问题理解不够,往往会影响到对VHDL语言的灵活合理运用。本文结合多轮课程教学实践,针对学生最难掌握的几个问题做了深入探讨。
1 对VHDL作为硬件描述语言的特征的理解
学好VHDL的关键是充分理解VHDL语句和硬件电路的关系。 编写VHDL,就是在描述一个电路,我们写完一段程序后,应当对生成的电路有一些大体上的了解, 而不能用纯软件的设计思路来编写硬件描述语言[2]。
下面以四选一数据选择器的设计为例来加以说明。四选一数据选择器是一种常用的组合逻辑电路,用VHDL语言设计比较简单,可以用when_else语句实现,也可以用with_select语句实现,两者仿真结果相同,但综合的结果不同。具体情况如下:
【程序1】
使用Quartus II软件对程序1进行编译仿真,仿真结果如图1所示。
图1 程序1仿真结果
将程序1中的when_else语句实现改成with_select语句实现,修改后的部分程序如下:
【程序2】
同样使用Quartus II软件对程序2进行编译仿真,仿真结果与图1完全相同。说明程序1和程序2都能完成四选一数据选择器的功能,仿真结果一致。
但是如果对程序1和程序2进行综合,得出它们对应的RTL电路,分别如图2和图3所示。从图2和图3的比较看,电路差别比较大。根据四选一数据选择器的功能,应该是图3的电路更合适。
图2 程序1的RTL电路
图3 程序2的RTL电路
综合来看,虽然when_else语句和with_select_when语句都能实现四选一数据选择器功能,但是实现的硬件电路完全不同,这就告诉我们在设计某一功能的电路时要尽量使用合适的语句来表达,这样才能得到最优的结果,而不能仅仅满足于功能实现。因为这是硬件电路的设计,要考虑最后实现的电路的合理性。
2 组合电路和时序电路的区别
组合电路和时序电路是数字电路系统的两大种类,在设计中至少要用到它们中的一种或两种都会用到,这就要求正确掌握它们各自的设计要领。在VHDL语言中,组合电路和时序电路是以完整条件语句和不完整条件语句来区别的,如果在组合电路设计中使用了不完整条件语句,会使设计结果出现意想不到的问题,影响设计的正确性,设计时要加以注意[3]。比如程序3是一个数值比较器的设计,数值比较器属于组合电路,应该使用完整条件语句来描述,但是程序中if语句判断了a>b和a<b两种情况,漏掉了a=b的情况,因此构成不完整条件语句,所以其综合的结果比较复杂,如图4所示,电路包含多级逻辑电路和一个寄存器,使原本简单的数值比较变得复杂了,不利于电路的实现。而程序4只是对程序3进行了简单修改,使其成为完整条件语句,其综合的结果如图5所示。我们发现,经过这样的改变,电路被大大简化了,而且能够正确实现数值比较的功能。可见误用不完整条件语句会给电路设计带来很大的影响。同理,在时序电路中误用完整条件语句也是不合适的。
【程序3】
图4 程序3的RTL电路
【程序4】
图5 程序4的RTL电路
3 信号和变量的区别
在VHDL中,数据对象(Data objects)有3类:信号(signal)、变量(variable)和常量(constant)。变量和常量与软件语言中的变量和常量的含义相似,而信号则具有更多的硬件特征,是硬件描述语言所特有的数据对象。由于信号和变量在使用上有很多相似的地方,但又存在本质的区别,学生比较容易混淆,在设计中常常不注意区分它们的区别,造成错误[4]。在变量和信号的使用过程中,有时可以互换,有时候又不能互换。两者从形式上差别并不大,所以学生在没弄清其本质区别前往往按照例子生搬硬套,这样做有时候系统也能正常运转,但是在系统需要利用到变量和信号的根本特性时,错误地使用数据对象往往会导致系统的逻辑错误,使设计结果与预期有很大差距,而学生很难发现其中的错误。所以,如何使学生分清两者,并正确的使用,成为影响VHDL语言教学的关键问题之一。
为了更好地区分信号和变量,需要通过一定数量的实例分析,通过对比,使学生对两者之间的物理含义、使用范围及值代入的区别有较明确的认识。下面给出用中间变量和信号表达四选一数据选择器的VHDL源程序,从中可以看出信号、变量的定义和使用方法之间的不同以及它们对系统的影响。
【程序5】
程序5的仿真结果如图6所示。从图6中可以看出,输出信号q并没有得到预想的波形,而是未知数据,这是因为muxval在程序中被定义为信号,而信号的含义是电路的实际硬件连接,因此对信号赋值存在延时[5]。故此在case语句中根据muxval值去选择不同的信号进行输出时,muxval的值还没有产生,因此结果不对。为了产生正确的结果,对本程序,只需要把muxval的定义改为变量,其他地方做适当修改,则可得到如图7所示的正确仿真结果。
图6 程序5的仿真结果图
图7 仿真结果图
4 结束语
在VHDL设计课程教学中,笔者特别注意上述几个问题的讲解和举例说明,力求使学生对这些问题理解透彻,让学生真正认识到运用VHDL语言进行电路设计,不仅要熟悉VHDL语言的基本语法和常用语句,还要对硬件描述语言的本质有深刻的认识,对所设计的电路有深刻理解,在此基础上才能更好地使用掌握这门硬件描述语言进行电路设计。
[1]朱奕丹.VHDL设计课程教学改革实践[J].电气电子教学学报,2007,29(2):22-23
[2]潘松,黄继业.EDA技术与VHDL[M].北京:清华大学出版社,2009
[3]夏炎,师卫.硬件描述语言与数字电路设计[J].电力学报,2009,24(2):156-158
[4]杨丹,树林.VHDL中信号与变量的教学体会[J].电气电子教学学报,2006,28(3):30-35
[5]龚兰芳.VHDL硬件描述语言教学探讨[J].广东水利电力职业技术学院学报,2009(4):29-32.