9442|10

78

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

(FPGA~2014-07-03)阻塞赋值“=”与非阻塞赋值“<=”你懂了吗? [复制链接]

 
初学Verilog HDL被那个“=”与“<=”整迷糊啦,然后找度娘,一篇文章写得不错嘛,不迷糊啦。如下,还迷糊的小伙伴凑个热闹吧,,另外,感谢作者喽。原文来自这儿\



首先我们要理解两种变量类型 Net Type(连线型) Register Type (寄存器型)。(有些参考书上有分为3种类型,这个无关紧要)Net Type(连线型),从名字上理解就是“导线”呗,导线的这头和导线的另一头始终是直接连通的,这头是什么值,那头就是什么值,所以输出随着输入随时变化的。连线型中 wire 最常见。
    Register Type(寄存器型),寄存器就不像普通导线了,它可以把值给存住,你只要给它赋一次值,它都会存住那个值,直到你给它赋一个新的值它才会改变。寄存器型中 reg 最常见。
    最常用到的是 wirereg 这两种类型,其他的对我们初学者来说一般很少用到,可以暂时跳过,以后慢慢学下去自然会理解。
    注意:wire型变量如果没有赋予初始值,默认初始值为高阻态“Z”。
           reg  型变量如果没有赋予初始值,默认初始值为不定态“X”。

    在理解这两种基本的数据类型之后,我们来看看verilog语言中的赋值语句。verilog语言中的赋值语句有两种,一种是持续赋值语句(assign语句),另一种是过程赋值语句(always语句)。
     持续赋值语句(assign语句)主要用于对wire型变量的赋值,因为wire(线型)的值不能存住,需要一直给值,所以需要用持续赋值。
          例如:assign c = a + b;    只要a和b有任意变化,都可以立即反映到c上,也就是说c的值是根据a,b的值随时变化的。
     过程赋值语句(always语句)主要用于reg 型变量的赋值 ,因为always语句被执行是需要满足触发条件的,所以always过程块里面的内容不是每时每刻都被执行,因此需要将被赋值的对象定义成寄存器类型,以便这个值能被保持住。
    过程赋值又分为 阻塞赋值 “=”  和 非阻塞赋值 “<=” 两种。这里的非阻塞赋值符号 “<=” 与 “小于等于” 符号相同,他们在不同的语境下表示不同含义,要注意区分,例如在“if-else”等判断语句中,一般都表示为“小于等于”。

    接下来对这两种赋值作具体讲解...
     ① 阻塞赋值 “=“ 。 阻塞赋值和我们平时理解的赋值差不多,不用太多解释,就是按照语句的顺序,一句句往下顺序执行。一个赋值语句执行完,然后执行下一个赋值语句。
     ② 非阻塞赋值 “<=” 。非阻塞赋值就比较特别了,在同一个always过程块中,非阻塞赋值语句都是同时并发执行的,并且在过程块结束时才执行赋值操作。也就是说,在同一个always过程块中,非阻塞赋值语句被执行没有先后顺序,在过程快结束时,大家一起被赋值。

     给大家举一个具体的例子:
module test (clk, a1, a2, b1, b2, c1, c2); // test为module名称,括号内的是端口列表,包含所有输入输出的变量名称
input clk, a1, a2;          // 定义输入变量,这里没有定义位宽,默认为1位宽度
output b1, b2, c1, c2;    // 定义输出变量,这里没有定义位宽,默认为1位宽度
reg b1 = 0 , b2 = 0, c1 = 0 , c2 = 0;   // 注意!因为这些变量将会在always过程块中被赋值,所以必须定义成 reg 型   
// 注意!这里省略了对输入信号clk, a1, a2 的类型定义,它们默认为1位的wire 型(因为输入信号是随时要变化,所以必须用wire型)              
always @ (posedge clk)   // always 用 clk 上升沿触发
    begin
        b1 = a1;       // 这里采用的是阻塞赋值
        c1 = b1;
    end

always @ (posedge clk)  // always 用 clk 上升沿触发
    begin
        b2 <= a2;    // 这里采用的是非阻塞赋值
        c2 <= b2;
    end   
endmodule     // endmodule 别忘了,与 module 成对使用

仿真输入值设置图如下:
我们只需给输入信号赋值,输出信号根据输入信号的变化而变化。
下面请看用quartus 2 软件仿真的波形图


首先请看这两张图的区别,第一张是时序仿真波形图(timing),黄色标记部分因为延时而产生,第二张图为功能仿真波形图(function),不考虑器件的延时。
  在时刻,第一个时钟上升沿到来(posedge clk), 两个always过程块同时被触发(这就是PFGA器件强大的一点,可以并发执行)
    a1,b1,c1采用的是阻塞赋值。阻塞赋值语句顺序执行,先执行 b1 = a1; 由于 a1 此刻的值为 1,所以b1 变为 1,然后执行 c1 = b1;由于b1的值刚才已经变成 1 了,所以c1也变成了 1 。
     a2,b2,c2采用的是非阻塞赋值。非阻塞赋值语句并发执行, 也就是说 b2 <= a2; c2 <= b2; 这两句同时执行。由于a2 此刻的值为1,所以 b2 变为1,与此同时,b2  的当前值也将赋值给 c2 , b2 的当前值是是多少呢? 这里一定要分清楚了,b2 的当前值是 0,并不是 1 ,因为在 b2 还没有变为 1  之前,b2 的值就要赋值给 c2 了,所以 c2 的值仍然是 0 。
   直到在②时刻,第二个时钟上升沿到来,两个always再一次被同时触发,这次在执行 c2 <= b2; 这条赋值语句时,b2 的当前值为 1 ,所以 c2 才被赋值为 1 。

   大家可以根据上面的分析方法,自己分析一下在③、④时刻 b1,b2,c1,c2 应该分别为什么值,与波形图对照着理解一下。
其实verilog语言和 c语言大同小异,比较着来学习,会比较容易......

此帖出自FPGA/CPLD论坛

最新回复

阻塞赋值 “=”  和 非阻塞赋值 “  详情 回复 发表于 2015-1-27 10:26
点赞 关注(3)
 

回复
举报

41

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
学习了
此帖出自FPGA/CPLD论坛
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
学习下,感谢楼主了,这么有心,分享下
只是后面那个图看不到哎,要是传上来就更好了,支持下!
此帖出自FPGA/CPLD论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
学习一下,值得参考
此帖出自FPGA/CPLD论坛
 
 
 

回复

208

帖子

3

TA的资源

纯净的硅(初级)

5
 
图了,???
此帖出自FPGA/CPLD论坛
个人签名人要学会逆流而上,适者生存
 
 
 

回复

47

帖子

2

TA的资源

一粒金砂(中级)

6
 
分享了 有时间看看。对初学者比较好
此帖出自FPGA/CPLD论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

7
 
学习了  开始学FPGA对于这两个赋值很容易混淆的,现在好多了~~~
此帖出自FPGA/CPLD论坛
 
 
 

回复

45

帖子

0

TA的资源

一粒金砂(初级)

8
 
学习学习,,
此帖出自FPGA/CPLD论坛
 
 
 

回复

1万

帖子

203

TA的资源

管理员

9
 
图呢??没看到。。。。。。。。。
此帖出自FPGA/CPLD论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 
 

回复

93

帖子

0

TA的资源

一粒金砂(中级)

10
 
哈哈,赞!!!
此帖出自FPGA/CPLD论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(中级)

11
 
阻塞赋值 “=”  和 非阻塞赋值 “<=”   
看资料的时候 貌似懂了
真正还需实践: 比如一般时序不严格的时候,二者都行; 但是时序要求高的时候, 就知道重要了
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表