什么是非阻塞赋值和阻塞赋值?
1个回答
展开全部
阻塞赋值和非阻塞赋值的本质的区别:
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"块等过程块中,而非阻塞赋值不允许用于连续赋值。
参考资料:
搜狗百科——阻塞赋值
搜狗百科——非阻塞赋值
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"块等过程块中,而非阻塞赋值不允许用于连续赋值。
参考资料:
搜狗百科——阻塞赋值
搜狗百科——非阻塞赋值
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询