X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
DSP 与 ARM 处理器
[资料分享] FPGA Verilog语言中阻塞赋值与非阻塞赋值个人看法
Aguilera
2018-11-10 20:19
楼主
对于Verilog 初学者来说,阻塞赋值与非阻塞赋值应该要区别一下子,我估计对于这两种赋值方式的应用解说,什么时候该用阻塞赋值,什么时候该用非阻塞赋值,通常见到的一句话是,时序逻辑里面通常用非阻塞赋值,组合逻辑里面通常使用阻塞赋值。但是这必然是含糊不清的,也并不意味着时序逻辑里面就不可以阻塞赋值了,组合逻辑里面就不可以用非阻塞赋值了。所以我觉得有必要弄清楚一下阻塞赋值和非阻塞赋值的细微区别。
首先还是回归下定义,所谓阻塞赋值,例如 a=b; 当这个赋值语句执行的时候是不允许有其它语句执行的,这就是阻塞的原因。而非阻塞赋值,例如a<=b;当这个赋值语句执行的时候是不阻碍其它语句执行的。对于FPGA来讲,跟单片机相比(即使是高速单片机),它本身的优点是语句执行的并行性,而单片机语句执行是顺序执行的。所以如果说我们要充分利用好FPGA这个优点,那么我们应该尽量使用非阻塞赋值。
下面我想从一个简单的例子来浅析一下两者的区别。
这是一个简单的分频程序,目的是将clk时钟四分频。Count初始值是0,(个人经验认为的,因为verilog里面似乎没法对变量进行初始化),然后第一个时钟的上升沿到来时,count自加1后变成了1,if语句执行为假,然后第二个时钟上升沿到来时,count又自加1变成了2,if语句执行条件为真,则执行if语句内的内容,将data_a数据翻转,count重新赋值为0,所以该程序就是每两个时钟的上升沿,data_a数据翻转一次,得到四分频的效果。
下图为仿真波形,是完全对得住分析的。
上面的程序用的是阻塞赋值,也就是 count执行自加1的时候,其它任何语句都是不能执行的,因此这里就有点想单片机里面的C语言了,一个顺序执行的always块。
如果把上面的程序赋值全改成非阻塞赋值,效果会怎样呢?
首先我们先不作分析,先对比一下仿真波形。
从仿真波形来看,这个程序确变成了对clk时钟的六分频,显然不是我们之前的思路分析结果。实际上它是这样子执行的。
首先可以这样理解,1、非阻塞赋值是always块结束才赋值的,个人理解是程序见到always块的结束标记end后才赋值,但是并不代表当程序最开始看到该语句时没有任何动作,而是先把后面的值给计算出来放在一个寄存器中暂存,到了块结束才赋值,比如上述中的先把count+1计算出来后,到了块结束才把那个结果赋值给count。2、非阻塞赋值是并行执行的,因此不管有多少个always块,不管每个always块里面有多少条非阻塞赋值,它都是瞬间一块并行执行的,互不干扰。
所以上面的程序就好分析了
Count初始值是0,第一个时钟的上升沿到来时,count<=count+1 这条语句先不赋值(前面说了块结束才赋值),但是count+1已经计算出来放在寄存器中存储着,先执行的是if语句,if语句此时条件仍然是(count=0),条件为假,不执行if内部语句,接着遇到always块结束标记end,这才执行count<=的赋值,count此时为1,然后第二个时钟上升沿到来,同样先执行if语句,条件仍然为假,然后再执行count自加1,count变为2,第三个时钟上升沿到来,先执行if语句,条件满足,至于此时 有三个非阻塞赋值的语句出现
count<=count+1;
data_a<=!data_a;
count<=0;
这三个语句按道理讲也是并行执行的,但是,有两个语句同时对count进行了赋值。。那么咋整呢,这点笔者尚未清楚,恳请达人解析,或者待日后笔者弄清楚在来看看了。。。
7月25日,经过龙哥点拨,上述问题终于有了一个合理的解释。
参阅许多资料可以得出的结论是:在begin 。。end 中非阻塞赋值实际上是并行中的顺序执行。此话的理解是,begin 。。end 语句块中得非阻塞赋值语句与其它块中的非阻塞赋值语句是并行的,但是对于单个begin 。。end 块中的语句却是顺序执行的。所以在verilog语言中是不允许在两个块中对同一变量进行赋值的,而在单一块中,如果有两个或两个以上的非阻塞语句对同一个变量进行了赋值,那么该变量的值由最后一个语句所决定。
点赞
回复评论
暂无评论,赶紧抢沙发吧
最新活动
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
随便看看
错误解释
求教:电源特别烫!
丝印为AA6B SOT23-6封装配2.2UH电感 3.7~4.2V升压到5V
是德科技有奖问答活动,答题闯关赢好礼!(已颁奖)
PIC机器人书籍(英文)!~很好
wince下如何测试驱动程序阿
智能手机引发3G芯片竞争加剧
通用异步串口实现单总线硬件控制器的研究和实现方法
增加uart6驱动
电动汽车“快充”,能有多快?
5G毫米波射频算法技术
《边干边学-Linux内核指导》这本书上的那个“设计自己的驱动程序”的例子拿来编译不知道为什么错???
在dos下运行FCARM.EXE,将网页文件编译成c文件出问题了。。
分享NFC通用读卡器电路图
编译出错,紧急求教!
双向DC-DC变换器 求大神分享想法
降压后的3.3V和加上三极管的3.3V有什么不同?
内存分配存储问题
你还记得那条最爱你的项链么
一周精彩回顾~~
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复