阻塞与非阻塞的区别
0赞
发表于 6/4/2012 4:19:40 PM
阅读(3248)
做了一个PWM的简单模块,无意中让我发现了阻塞与非阻塞的他们的区别真的很大,一不小心真的会让人找不到错误在哪里。。。。。
下面我贴出我的分析:
非阻塞:always @(posedge CLOCK)
if(!REST_N)
begin
F<=0;
j<=0;
end
else
begin
if(j==200)
F<= ~ F;
if(j==300)
begin
F<= ~ F;
j<=0;
end
j<=j+1;
end
end
结果做仿真的时候看到无论如何J加到了300也不能清零,我就纳闷了到底什么问题呢,郁闷了一会,突然我想到了在时序逻辑中不能对同一个变量再次赋值,这就非阻塞在整个always 结束后才赋值的原因,于是我果断的改了一下
always @(posedge CLOCK)
if(!REST_N)
begin
F<=0;
j<=0;
end
else
begin
if(j==200)
F<= ~ F;
if(j==300)
begin
F<= ~ F;
j=0;
end
if(!REST_N)
begin
F<=0;
j<=0;
end
else
begin
if(j==200)
F<= ~ F;
if(j==300)
begin
F<= ~ F;
j=0;
end
j=j+1;
end
end
结果就解决了,这下子真让我从实践中明白了,非阻塞是在always结束后才赋值。于是我又想了一招:
always @(posedge CLOCK)
if(!REST_N)
begin
F<=0;
j<=0;
end
else
begin
if(j==200)
F<= ~ F;
if(j==300)
begin
F<= ~ F;
j=0;
end
if(!REST_N)
begin
F<=0;
j<=0;
end
else
begin
if(j==200)
F<= ~ F;
if(j==300)
begin
F<= ~ F;
j=0;
end
j<=j+1;
end
end
于是乎又行了,呵呵,真正明白了阻塞跟非阻塞的赋值了。
但是这个代码让我有点费解的是,在时序逻辑中用非阻塞,组合逻辑中用阻塞,阻塞和非阻塞不要同时在一个always块中出现,貌似我这个小小的实验能把这个道理给推翻了,这是为什么呢?。。。。。
