utopia_xu

阻塞赋值与非阻塞赋值

0
阅读(980)

(1)在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;

 (2)在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。

原因:这是因为要使综合前仿真和综合后仿真一致的缘故。


 1,阻塞赋值操作符用等号(即 = )表示。“阻塞”是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量。例如:

 005Sm3Gxzy79IawEJEw84&690.jpg

当执行“x=next_x;”时,x会立即的到next_x的值。而下一句“y=x;”必须等到“x=next_x;”执行完毕才能被执行。由于这两条语句都没有延迟(相当于导线),导致他们的等价语句为“y=next_x;”。
赋值是实时的,计算完右面的马上赋值给左边的,然后再执行下一句,操作时串行的,且在一个alway内完成。
 2、非阻塞赋值操作符用小于等于号 (即 <= )表示。“非阻塞”是指在进程语句(initial和always)中,当前的赋值语句不会阻断其后的语句。非阻塞语句可以认为是分为两个步骤进行的:

 ①计算等号右边的表达式的值,(我的理解是:在进入进程后,所有的非阻塞语句的右端表达式同时计算,赋值动作只发生在顺序执行到当前非阻塞语句那一刻)。

 ②在本条赋值语句结束时,将等号右边的值赋给等号左边的变量。

例如:

005Sm3Gxzy79IaISAUK9e&690.jpg

当执行“x<=next_x;”时,并不会阻断语句“y<=x;”的执行。因此,语句“y<=x;”中的x的值与语句“x<=next_x;”中的x的值不同:语句“y<=x;”中的x是第一个D触发器的初值(Q0)。而语句“x<=next_x;”中的x的值是D触发器经过一个同步脉冲后的输出值(Q1)。基于此这个进程产生了与阻塞赋值进程截然不同的结果,即:产生了移位寄存器的效果。

  简单理解就是,阻塞赋值是按需执行,非阻塞赋值是并行执行。