返回首页

阻塞赋值和非阻塞赋值有什么本质的区别

来源:www.muyeseed.com   时间:2023-01-28 01:04   点击:261  编辑:admin   手机版

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

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

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

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

当执行“x=next_x;”时,x会立即的到next_x的值。而下一句“y=x;”必须等到“x=next_x;”执行完毕才能被执行。由于这两条语句都没有延迟(相当于导线),导致他们的等价语句为“y=next_x;”。

赋值是实时的,计算完右面的马上赋值给左边的,然后再执行下一句,操作时串行的,且在一个alway内完成。

2、非阻塞赋值操作符用小于等于号 (即 <= )表示。“非阻塞”是指在进程语句(initial和always)中,当前的赋值语句不会阻断其后的语句。非阻塞语句可以认为是分为两个步骤进行的:

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

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

例如:

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

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

阻塞赋值和非阻塞赋值的本质的区别:

1、阻塞赋值是按需执行,非阻塞赋值是并行执行;

2、两种赋值语句对应着两种不同的电路结构。阻塞赋值对应的电路结构往往与触发沿没有关系,只与输入电平的变化有关系;而非阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生赋值的情况。

3、在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。

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

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

例如:

当执行“x=next_x;”时,x会立即的到next_x的值。而下一句“y=x;”必须等到“x=next_x;”执行完毕才能被执行。由于这两条语句都没有延迟(相当于导线),导致他们的等价语句为“y=next_x;”。

赋值是实时的,计算完右面的马上赋值给左边的,然后再执行下一句,操作时串行的,且在一个alway内完成。

2、非阻塞赋值操作符用小于等于号 (即 <= )表示。“非阻塞”是指在进程语句(initial和always)中,当前的赋值语句不会阻断其后的语句。非阻塞语句可以认为是分为两个步骤进行的:

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

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

例如:

当执行“x<=next_x;”时,并不会阻断语句“y<=x;”的执行。因此,语句“y<=x;”中的x的值与语句“x<=next_x;”中的x的值不同:语句“y<=x;”中的x是第一个D触发器的初值(Q0)。

而语句“x<=next_x;”中的x的值是D触发器经过一个同步脉冲后的输出值(Q1)。

基于此这个进程产生了与阻塞赋值进程截然不同的结果,即:产生了移位寄存器的效果,next_x à x à y。

扩展资料:

阻塞赋值的执行可以认为是只有一个步骤的操作,即计算RHS并更新LHS,且不能允许有来自任何其他Verilog语句的干扰。所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后再开始赋值的。

非阻塞赋值的操作可以看作为两个步骤的过程;

(1)在赋值时刻开始时,计算非阻塞赋值RHS表达式;

(2)在赋值时刻结束时,更新非阻塞赋值LHS表达式。

非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在initial”块和“al―ways块等过程块中,而非阻塞赋值不允许用于连续赋值。

参考资料:

百度百科――阻塞赋值

百度百科――非阻塞赋值

顶一下
(0)
0%
踩一下
(0)
0%