3.4.2 VHDL编码常见问题
1.信号或变量赋初值
对大多数综合工具而言,信号或变量定义时所赋的初值在综合时会被忽略掉,可能造成设计错误,因此不要使用这样的语句,如:
SIGNAL cnt:INTEGER RANGE 0TO 15:=0;
2.错误使用INOUT
在上面这段描述中,cnt既是输出,又是计数器的内部反馈信号,因此在ENTITY定义里面,想当然地采用了INOUT模式。然而INOUT一般是用来表示双向端口电路,其结构如图3-28所示。
图3-28 INOUT模式端口结构
为了避免异意,我们一般不采用上面的描述方式,而是在结构体中定义一个信号来处理,在端口定义时还是定义为OUT模式,最后将信号的值赋给端口。上面的代码可以修改如下:
3.产生不必要的锁存器
在处理组合逻辑电路时,初学者经常犯如下错误:
这样描述的结果是a、b、c都成为了锁存器,为了避免产生锁存器,应该在IF语句的每个分支对每个信号进行处理,正确的描述是:
同样,在使用CASE语句时,每种情况下所有的信号都必须处理到,或者在CASE语句之前对所有的信号赋一个初值,例如:
4.同一个信号在两个或两个以上的进程中赋值
除了三态输出信号,其他信号不允许在不同的进程(Process)中分别赋值,否则综合器会报“多重驱动(Multiple Drivers)”的错误。
5.错误地使用变量或信号
变量只能在进程语句、函数语句和子程序结构中使用,它是一个局部量,变量的赋值是立即生效的;信号是电路内部硬件连接的抽象,信号的赋值在进程结束后才进行。信号的赋值与顺序无关,变量赋值与顺序有关。如果在一个进程中对信号多次赋值,只有最后的值有效,变量的赋值立即生效,变量在赋新值前保持原来的值。
下面的VHDL实例显示了一个设计分别使用信号和变量的综合结果,从图3-29和图3-30中我们可以看出信号与变量的差别。
图3-29 使用信号综合后电路
图3-30 使用变量综合后电路
例1 组合逻辑中使用信号:
例2 组合逻辑中使用变量。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。