armwork 发表于 2009-2-26 17:19:45

阻塞和非阻塞

有这样一段代码:本来意图是8进制计数器
always @(posedge clk)
    begin
       cnt<=cnt+1;
       if (cnt==8)
          cnt<=0;
    end
同一个块里对cnt两次非阻塞赋值,仿真后变成9进制计数器了?
如果改成阻塞赋值,仿真就对了.

对非阻塞一直理解不对.

谢谢

Oliver 发表于 2009-2-26 20:09:17

当然不是你这么写的啊,这样的话增量和判断是同时进行的.

得用else.

时序逻辑肯定用非阻塞了.

改成阻塞后可以是因为先增量后判断,是分开执行的

armwork 发表于 2009-2-27 09:17:50

非常感谢!

armwork 发表于 2009-2-27 11:20:49

假设要求信号占空比3:5,代码如下:

always @(posedge clk)
        begin
           if (testCnt==0)
              testImg<=1;
           else if (testCnt==3)
              testImg<=0;
           if (testCnt==8)
              begin
                testCnt<=0;
                testImg<=0;
              end
           else testCnt<=testCnt+1;
         end       
如果按上面代码,仿真结果信号占空比3:6,而不是3:5.

只有if (testCnt==7)
   begin
        testCnt<=0;
        testImg<=0;
   end
仿真结果信号占空比3:5.

一直没理解过来,谢谢.

Oliver 发表于 2009-2-27 11:33:15

就是这样的,用7就可以了.

armwork 发表于 2009-2-27 11:41:44

是用7,但没弄明白,方便的话能指点吗?谢谢

Oliver 发表于 2009-2-27 11:52:53

怎么说呢,你画个图或者看仿真图一下就明白了啊.

本来到8的时候已经过了8个周期(如果这时对img=1的话就是3/8),

但你把cnt,img都置0了,要下一时钟来的时候cnt=0才会对img=1,那你数数实际上用了多少个周期?

所以实际需要设置为"周期-1"(其实就是0也得算上)


另外,建议你以后把增量(计数器)和判断分两个always来写.

armwork 发表于 2009-2-27 11:59:48

谢谢.我来好好学习.

armwork 发表于 2009-2-27 12:07:39

谢谢 Oliver ,我看明白了.
非阻塞可以这样理解吗:
1.非阻塞一定要有个D触发期;
2.非阻塞得到的值一定是下一个CLK才得到?

您说的把增量(计数器)和判断分两个always来写.
always @(posedge clk)
      begin
         if (testCnt==0)
            testImg<=1;
         else if (testCnt==3)
                testImg<=0;
         if (testCnt==8)
            begin
                testCnt<=0;
                testImg<=0;
            end
    end

always @(posedge clk)
testCnt<=testCnt+1;
         end

armwork 发表于 2009-2-27 12:07:40

.

armwork 发表于 2009-2-27 12:07:40

谢谢 Oliver ,我看明白了.
非阻塞可以这样理解吗:
1.非阻塞一定要有个D触发期;
2.非阻塞得到的值一定是下一个CLK才得到?

您说的把增量(计数器)和判断分两个always来写.
always @(posedge clk)
      begin
         if (testCnt==0)
            testImg<=1;
         else if (testCnt==3)
                testImg<=0;
         if (testCnt==8)
            begin
                testCnt<=0;
                testImg<=0;
            end
    end

always @(posedge clk)
testCnt<=testCnt+1;
         end

armwork 发表于 2009-2-27 12:08:26

谢谢 Oliver ,我看明白了.
非阻塞可以这样理解吗:
1.非阻塞一定要有个D触发期;
2.非阻塞得到的值一定是下一个CLK才得到?

您说的把增量(计数器)和判断分两个always来写. 是这样吗?:
always @(posedge clk)
      begin
         if (testCnt==0)
            testImg<=1;
         else if (testCnt==3)
                testImg<=0;
         if (testCnt==8)
            begin
                testCnt<=0;
                testImg<=0;
            end
    end

always @(posedge clk)
   testCnt<=testCnt+1;

ibq3100 发表于 2009-2-27 12:23:31

testcnt等于0 1 2 3 4 5 6 7 一共8位

Oliver 发表于 2009-2-27 12:39:23

阻塞和非阻塞你需要去看一下书到底是如何权威解释的.

记住一点,时序逻辑用非阻塞,组合逻辑用阻塞.这样就对了,至于区别,用法,原理,为什么你可以查书再好好理会.

当然乱用也可以的,不过有些平台会警告甚至编译错误.

always @(posedge clk or negedge rst)begin
    if(!rst)
       cnt <= 'd0;
    else begin
       if(cnt == 3'd7)
          cnt <= 'd0;
       else
          cnt <= cnt + 3'd1;
    end
end
always @(*)begin
    if(!rst)
       img = 1'd0;
    else
       img = (cnt < 3)1'b1:1'b0;
end

再网页上打这个冒火得很,我都是用SI来编辑的.

<<WERILOG HDL设计与验证>>不错的,看看吧.

armwork 发表于 2009-2-27 13:37:27

谢谢大家帮助.
看了本夏宇闻老师的书,感觉非阻塞讲的不是很明白,当然主要是自己领悟力不够.

armwork 发表于 2009-2-27 13:49:04

设计与验证--Verilog HDL   

点击看大图 市 场 价 :¥32.00
会员价 : ¥24.00 (75折)   

购买收藏
【作  者】 EDA先锋工作室 吴继华 王诚 [同作者作品]
【出 版 社】人民邮电出版社
【书 号】 7115150419
【开 本】 16开
【页 码】 228
【出版日期】 2006年8月

是这本书吗? 谢谢. 周末去买本.

armwork 发表于 2009-2-27 15:11:13

看了王金明老师的书,又做了个例子:
module block(
    input a,
    output b,
    output c,
    output d,
    output e,
    input clk
    );
reg b0,c0,d0,e0;
assign b=b0;
assign c=c0;
assign d=d0;
assign e=e0;
always @(posedge clk)
        begin
                b0=a;
                c0=b0;
        end
       
always @ (posedge clk)
        begin
           d0<=a;
                e0<=d0;
        end
endmodule

综合后的原理图
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_422462.jpg
(原文件名:sch.jpg)

仿真波形
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_422463.jpg
(原文件名:wav.jpg)

armwork 发表于 2009-2-27 15:19:08

b c d 和 a的波形完全一样,d是非阻塞,应该延迟1个时钟吗?

上面做的和王老师的书上讲解不一样.


http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_422464.jpg
(原文件名:w0.jpg)

http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_422465.jpg
(原文件名:w1.jpg)

http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_422466.jpg
(原文件名:w2.jpg)

Oliver 发表于 2009-2-27 20:23:44

就是那本书,买来看看吧,入门还是不错的.

方针最好用modelsim se来做,开始定位就定好.

armwork 发表于 2009-2-28 23:10:04

谢谢,今天去没买到,06年出的.

Oliver 发表于 2009-3-1 00:37:51

不一定非得这本,我是觉得还不错才说这本的.

PPA2001推荐我的那本没有所以我买了这本.差不多就可以了.

网上很多资料很水的,必须得有本书在身边翻翻

armwork 发表于 2009-3-2 09:09:16

谢谢Oliver,网上可以买到的,您能帮我再推荐几本书吗?我一起去买.
方便的话,能帮我看看17楼的例子吗?
多谢.

Oliver 发表于 2009-3-3 19:00:25

唉,奇怪的网络,打一半又不响应,把内容复制下来,结果是一个链接,晕...

感觉你对非阻塞没理解,翻翻书吧.

最典型的就是
b=a;
c=b;
d=c;


b<=a;
c<=b;
d<=c;

armwork 发表于 2009-3-4 10:02:51

谢谢,确实如大侠所说对非阻塞不理解.
b=a: b 和a同步?
b<=a: b滞后a一个时钟?

Oliver 发表于 2009-3-4 13:31:36

主要不是延迟一拍,是其他语句是否同时执行.
如:
b=a;
c=b;
d=c;
最后的结果是a=b=c=d,因为他们是阻塞执行的,如当执行c=b时,b的值在上步已经被赋成了a;依此类推

如:
b<=a;
c<=b;
d<=c;
最后的结果是d=c;c=b;b=a(它们不相等),相当于移了1位(d<-c<-b<-a).
因为他们是同时执行的.执行c<=b时,b的值不等于a,都同时赋值.

armwork 发表于 2009-3-4 15:04:19

谢谢oliver,明白好多了.

HONY0411 发表于 2009-3-24 16:38:02

学习了
页: [1]
查看完整版本: 阻塞和非阻塞