关于 VHDL 的信号和变量

前几天做课设,要用 VHDL 这种怪异的硬件语言。我的经验是:对于 VHDL 不能按照常规的编程语言的执行方式来理解。这篇日志就算是我对已经会其他编程语言的人写 VHDL 程序的一点经验总结。

 

环境是 IspLever5 。

 

1. 理解信号(signal):在一个进程(process)的一次执行中,信号的值只会改变一次(不管被赋了几次值)。而且,对信号的赋值不是立即生效,而是在进程结束后才生效。输入(in)、输出(out)和 buffer 端口默认都是信号。

 

所以设计思路应该是这样的:在进程的所有执行分支中,每个输出信号都应该赋值,不要假定信号可以保存之前的值(尽管手册上是这么写的)。

 

可以这么想象:在一个电路中,输出端口总有电流通过,所以信号总是需要赋值的。

 

2. 进程实际上类似于回调函数,应该是可重入的(http://zh.wikipedia.org/zh-cn/可重入)。随时应该想到硬件固有的并行性。

 

3. 如果需要在进程中修改一个信号,而且后面马上就要用的修改之后的值,那么你应该使用变量(variable):

count: process (x) variable cnt : integer := -1; begin cnt:=cnt+1; end process;

这里的变量就跟我们的通常的编程语言里的变量有着同样的行为:赋值语句会立即生效,前后顺序执行(信号赋值是前后顺序执行的吗?我对此持怀疑态度。。。)。

 

变量的可见域是一个进程,但生命周期是整个结构体(architecture)。按照手册上说的,下次进程执行的时候,变量会具有之前的值,但我在实际运行程序的时候,这一点并不一定能保证。 

 

Links:
http://www.eefocus.com/iamfrankie/blog/07-11/76178_480a7.html
http://www.gmvhdl.com/variable.htm

你可能感兴趣的:(关于 VHDL 的信号和变量)