VHDL的语句常见错误分析
2012-06-21王延斌冯光升马春光
赵 靖,王延斌,冯光升,马春光
(1.哈尔滨工程大学计算机学院,黑龙江 哈尔滨 1500012.哈尔滨工业大学机电学院,黑龙江 哈尔滨 150001)
在“VLSI及硬件描述语言”课程中,用VHDL语言描述系统硬件行为时,按语句执行顺序对其进行分类,可以分为顺序(Sequential)描述语句和并发(Concurrent)描述语句。顺序描述语句只能再现在进程(Process)或子程序(Subprogram)中,由它定义进程或子程序所执行的算法[1,2]。并发描述语句执行没有先后顺序,定义相互关联的模块和进程从而描述设计的行为或结构,但是它不能出现在上述的两处[2]。
教师对这两种描述语句进行讲解的过程中,常会只偏重介绍各种语句的用法,却忽视了其应用场所。笔者认为,在对变量和信号的教学中,除了强调变量赋值的立即性外,还要重视其初始化的方法与时刻。在循环体中涉及到对信号和变量的赋值情况,对信号进行多次赋值,只有最后一次生效。
1 顺序与并发描述语句
如果顺序与并发描述语句的书写格式正确但位置出错,则会出现语句错用的情况。将顺序描述语句书写在 architecture里,将并发描述语句书写在process里。我们在教学中以三八译码器为例,用选择语句可以实现对三八译码器的描述。程序一使用并发描述语句WITH SELECT实现。程序二使用顺序描述语句CASE实现。关键点在于,顺序描述语句书写在process内部,且其有相应的敏感变量。
Process的重要应用就是用来描述寄存器,即以时钟为敏感变量且进行上升/下降沿判断。若不进行时序功能的描述(如本例中的三八译码器),则在process内部的顺序描述语句CASE和并发描述语句WITH SELECT在功能上是完全相同。学生在实践过程中,经常忽视顺序和并发描述语句的书写位置,只注意到各种描述语句功能。经常发生的误用情况(ModelSim编译提示):将并发描述语句书写到顺序单元中,错误程序一的编译提示:Illegal sequential statement,如图1所示;将顺序描述语句书写到并发单元中,错误程序二的编译提示:Illegal concurrent statement,见图2所示。
图1 错误程序一的编译提示
图2 错误程序二的编译提示
因此在教学中要强调这两种描述语句的适用范围。下面是源程序和经常遇到的错误程序。程序一和程序二是源程序,在程序二及以后的错误程序中,省去了对实体的描述部分和结构体中语句重复部分的描述。
[程序一]
2 变量的初始化
在变量的声明处可以指定变量的初始化值,但初始化值只在process启动前有效。正确的描述方法如程序三所示:用全0来初始化变量 indata,在process开始处对indata赋值。图3是3-8译码器编译通过的正确输出,3-8译码器有3个二进制输入端和8个译码输出端。对输入的值进行译码,就可以确定输出端的哪一个输出端变为有效(低电平),从而达到译码的目的。
图3 3-8译码器编译通过的正确输出
错误程序三试图用变量来实现三八译码器,但其将变量indata的初始值指定为c&b&a。此处有两个错误:用信号量对变量进行初始化;认为在process激活时对变量进行初始化。对于这种实现方式,ModelSim输出三条警告,见图4的编译提示:Initial value of“indata”depends on value of signal“c”,Initial value of“indata”depends on value of signal“b”,Initial value of“indata”depends on value of signal“c”。虽然只是警告,但在功能描述是不正确的。在仿真中,indata的值为X,y的值为Z。在实际电路中,indata的值为随机值,y的值也为随机值。
图4 错误程序三的编译提示
在对变量的教学中除了强调赋值的立即性外,还要重视其初始化的方法与时刻。
[错误程序三]
3 信号和变量区分
在Loop循环语句中,若在一个循环体内需要对某一个数据进行多次操作,则必须用变量。因为对信号的多次赋值只有最后一次会生效。例如,程序5用变量实现1到9的累加计算,如果程序5的sum用信号进行多次赋值,只有最后一次生效,也就是说只有在i=9时候才生效,最后的结果是Sum=9。
4 结语
并发描述语句与顺序描述语句、信号与变量是VHDL中的重要组成部分。本文对VHDL教学中,学生经常遇到的混淆问题从而编程出现错误进行了详细的解释。我们应该在今后的教学中注意:除了讲解其功能特性外,还要加强对其适用场合的说明。
[1]侯伯亭,顾新.VHDL硬件描述语言与数字逻辑电路设计.西安:西安电子科技大学出版社(修订版),1997年9月第1版
[2]IEEE Standard VHDL Language Reference Manual.New York:The Institute of Electrical and Electronics Engineers,1988