VHDL:理解信号与变量、并行语句与顺序语句

来源:互联网 发布:单机手游推荐 知乎 编辑:程序博客网 时间:2024/05/20 07:15
初学VHDL,对一些问题总是感到困惑。比如,同样的赋值语句,在什么场合是并行的,什么时候又是顺序的?信号与变量有什么区别,为什么在PROCESS 里,对信号赋值的结果要等到进程挂起才起作用,而变量赋值却立刻起作用?其实,从语句产生的电路这个角度,可以更深刻地理解这些问题,下面是我自己摸索的一些理解方法,有不妥之处请大虾们指正!

1、赋值语句。
    同样a <= b的赋值语句,会形成什么电路,起关键作用的是敏感信号。
    a) 如果a <= b是在进程之外,那么隐含的敏感信号就是b,那么,这个赋值语句就形成一条连线。
    b) 如果是在一个同步进程中,如if (rising_edge(CLK)) then a <= b,这时候,就会形成一个触发器,因为敏感信号是时钟边沿。
   c) 如果敏感信号是一个电平信号,那么会形成一个锁存器。如一个不完整的if条件:if (cond = '1') then a <= b;

2、并行语句和顺序语句。
    从形成的电路的角度,并行语句最终会有两种形式:
    a) 并联或不相联的逻辑门或组合电路。因为是并联或不相联的,当然是同时执行,这个好理解。
    b) 由同一个时钟边沿驱动的D触发器,不论D触发器之间是并联、串联或者不相连的。为什么呢?因为触发器是在同一个时钟边沿同时翻转的,也就是同时执行,所以本质上就是并行。
    顺序语句只有一种情况,就是形成串联的逻辑门或组合电路。

3、信号与变量有什么不同?为什么信号赋值要等到进程挂起生效,变量赋值却立刻生效?
    其实,了解了上一点并行语句和顺序语句所生成的电路,这个问题就好理解了。因为在同步进程里的并行语句,大多是形成b的情况,就是多个由同一时钟驱动的触发 器。由于从触发器的输入到翻转、输出需要一定的延时,这个延时基本就是进程执行完毕的时间,所以,触发器翻转后的输出在同一个时钟边沿中是看不到的,因为 它还没翻转过来呢。这就是信号赋值要等到进程挂起才生效的原因。
    那为什么变量赋值却能立刻生效呢?这是因为,变量其实是为了帮助在同步进程中生成一些逻辑门或组合电路用的。看一看代码:var1 := not i1; var2 := var1 and i2 ; sig <= var2; 生成的RTL,就会看到,两个变量赋值语句其实生成了一个非门、一个与门。而且,输入信号i1和i2到var2这段是个组合电路,是不受时钟边沿控制的, 而到信号赋值语句sig <= var2,才形成一个D触发器。所以,这两个变量赋值语句生成了一个串联的非门和与门,那当然var2取到的是var1赋值后的值了。
    最后顺便提一下为什么变量必须只能在进程内可见,我猜可能是为了防止在同步进程中输出异步信号,造成混乱吧。因为如果变量是外部可见的,如上面的 var2,那么var2的值就可以异步输出到进程外了。所以限制变量只能进程内可见后,要输出变量的值就只能赋值给一个信号,在同步进程中,就是加了一个 触发器了。 
 
原创粉丝点击