原创 对阻塞赋值与非阻塞赋值的一些理解(原创)

2011-4-2 21:57 2611 9 9 分类: FPGA/CPLD

对阻塞赋值与非阻塞赋值的一些理解


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



66a6b4ff-96a6-481b-9656-400c7f6aa333.JPG


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


 


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


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


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


例如:


adbf152c-2205-424d-9776-f63a61f72193.JPG



当执行“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。


相信看到这里大家应该明白为什么时序逻辑多用非阻塞赋值,而组合逻辑多用阻塞赋值了。

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条