verilog 关于阻塞与非阻塞赋值同时使用时的问题

举一例子
always @ (posedge CLK or begedge RST)
begin
if(~RST)begin a<=1'b0;b<=1'b0; end
else begin
a=b;
b<=b+1'b1;
end
end
请问在RST后的第一个CLK时钟上升沿后 a 和 b 的 输出是什么
b应该不会立马就赋值给a吧?
所以a还是0
b输出1?
是否是这样
我是否可以这么理解 就是说 非阻塞的赋值只在于上升沿来的那一瞬间,利用这个时刻系统的初值进行赋值,而它的输出是在一个延时“t”后,而阻塞赋值是不是就是说会有个值的相互传递过程?
不想自己仿真 呵呵 你们能帮我解答下吗?

其实时序逻辑中,信号有一定的保持时间。使用非阻塞赋值的时候,<=右边的信号变化,也不会马上对左边的信号造成影响,而是要等到一个周期之后。而组合逻辑中使用阻塞赋值,右边的信号变化,会立即对左边的信号造成影响。
阻塞赋值更像是顺序执行,而非阻塞赋值更符合并行执行。
比如always块中有:
y = a ;
y = y + b;
那么这两句和y = a + b;效果是一样的。就是说阻塞赋值中,a的值要赋值给y以后,才会执行下一条y+b, 而非阻塞赋值就不是这样,前一句和后一句同时执行,不会影响下一句。

PS:研究阻塞赋值和非阻塞赋值,有意义,可以多去搜搜文章。但这样研究代码,确实没意义。这段语句综合都过不了,一个always块中不允许同时出现阻塞赋值与非阻塞赋值追问

3Q
是不是多看优秀的代码会有帮助?
小弟正在搞CPLD+CY7C68013A+LABVIEW+AD+DA的数据采集控制系统。。。
给点意见吧把,。。。

追答

一般来说,看多了别人的模块,自己慢慢吸收就会做了,多看别人做的很重要,先模仿才有创造。
别的,多谷歌,多看看器件官网,会有很多应用笔记告诉你怎么做。比如你第一个USB控制器,很多器件都有相应的应用笔记。AD/DA也类似。
题外话,不知道你用的那款CPLD,一般来说FPGA的触发器资源比CPLD丰富,更适合做时序控制

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-17
恕我直言,你这样的研究没什么意义,这种非正规的代码写法可能会出现很多你意想不到的问题,即使仿真通过了,这也没有实际应用价值。always语句中一般不能有非阻塞赋值语句,除非他描述的是组合逻辑电路,VerilogHDL是硬件描述语言,代码的简洁是次要的,主要是代码对应的电路要简洁(用的元件最少,占的面积最小等)。
此外,在各家设计公司里,这样的代码是绝对不允许出现的,而是要有严格的代码规范。
希望我的回答对你能有帮助!追问

哥 我错了。。。。。
我正在的学习 为了小弟不走歪路。。。给点意见吧,,,我正在搞数据采集呢,,,,谢了

追答

个人浅见:硬件描述语言,语言是次要的,主要的是算法。对语言可以上网上查一查写代码的一些相关标准,这些标准你知道了,你就会发现,其实算法相同那么大家写出的代码都差不多(这点和其他高级语言例如C、matlab等不同),这也是实际所需要的,因为标准是大家公认的在硬件实现时占用的面积最小,不会对硬件有浪费。且性能也很好,不会出错。
祝你顺利。

本回答被提问者采纳
第2个回答  2011-12-17
dfdg
相似回答