世纪电源网社区logo
社区
Datasheet
标题
返回顶部
已解决

Verilog过程赋值语句提问

[复制链接]
查看: 1972 |回复: 5
1
shaorc
  • shaorc
  • 离线
  • LV8
  • 副总工程师
  • 积分:2754
  • |
  • 主题:192
  • |
  • 帖子:485
积分:2754
LV8
副总工程师
  • 2017-9-20 15:23:21
10问答币
在书上看到的,讲解阻塞型赋值语句时,举了一个例子

说的是,本想采用触发器的方式,
设计一个延时来使得dreg的输出比areg慢3个时钟节拍,
但是结果是dreg的输出只比areg慢一个时钟节拍输出

程序和逻辑电路图,在下图给出
在分析中(如上图),既然已经说了,是顺序执行,
那么每天语句执行时间为一个时钟周期,
三个语句执行完不就是延时3个周期了吗?
即使后一句的右边是前一句更新后的结果,
到程序执行完时,dreg还是变成了areg
这样不就是延时3个时钟周期了吗?为什么不是这样呢?

另外,
阻塞型赋值语句,规定是,顺序执行语句,每种状态一个接一个执行,
非阻塞型赋值语句,规定是,并行赋值语句,当执行语句时同事计算右边的表达式,
而不会立刻把值赋给左边的变量,过一段时间才会赋值

那在下图中,是把第一个例子中的功能用非阻塞语句实现了
这里说的过一段时间,是指的是CLK信号来到时,才会赋值到左边吗?如果可以把阻塞和非阻塞赋值语句简单化的讲解一下就更好了,谢!



1.jpg
IMG_20170920_145413.jpg

最佳答案

查看完整内容

针对第一个问题:从理论上将,阻塞赋值语句与其后面的语句只有概念上的先后,而无实质上的延迟。因此,一个时钟周期内,三条语句就执行完了;而如果使用非阻塞赋值,第一个clk,breg变为areg,第二个clk,creg变为areg,第三个clk,dreg变为areg,三个时钟周期完成。针对第二个问题: 1、无论是阻塞赋值还是非阻塞赋值,都不能决定并行或顺序执行,在verilog中,能够决定语句顺序执行的是begin....end,决定语句并行执行的是fork.. ...
gxg1122
  • 积分:9036
  • |
  • 主题:41
  • |
  • 帖子:1255
积分:9036
LV8
副总工程师
  • 2017-9-21 13:00:35
  • 倒数5
 
都忘了。
埃_维_针1
  • 积分:8783
  • |
  • 主题:13
  • |
  • 帖子:548
积分:8783
LV8
副总工程师
  • 2017-9-21 18:22:55
  • 倒数4
 
我用小脚丫官网仿真了一下,没什么问题啊。
阻塞式赋值特点就是在一个块语句中一旦执行完成当前的赋值语句,赋值目标变量即刻获得等号右边的表达式的值。
非阻塞赋值特点就是块语句执行结束时才能整体完成赋值。

always@(posedge clk)就是来了上升沿,就执行下面的块语句,里面是非阻塞赋值,全部计算完了才一次性赋值给等号左边。
dspwalker
  • 积分:1392
  • |
  • 主题:4
  • |
  • 帖子:131
积分:1392
LV6
高级工程师
  • 2017-9-21 20:26:23
  • 倒数3
 
针对第一个问题:从理论上将,阻塞赋值语句与其后面的语句只有概念上的先后,而无实质上的延迟。因此,一个时钟周期内,三条语句就执行完了;而如果使用非阻塞赋值,第一个clk,breg变为areg,第二个clk,creg变为areg,第三个clk,dreg变为areg,三个时钟周期完成。针对第二个问题:
1、无论是阻塞赋值还是非阻塞赋值,都不能决定并行或顺序执行,在verilog中,能够决定语句顺序执行的是begin....end,决定语句并行执行的是fork....join。
2、科普一下两种赋值的区别:

a)阻塞赋值之所以称为阻塞赋值,是因为它在执行时,不允许任何别的语句干扰(同一个always块中),直到它完成赋值后(即将右侧值赋给左侧),才允许别的赋值语句执行。
b)非阻塞赋值则相反,它在执行时,其他语句也可执行,只不过右侧表达式计算完成之后,不会传递给左侧,而是等到赋值语句所在的块结束后,才传递给左侧。

评分

参与人数 121币 +10收起理由
世纪电源网-九天 + 10

查看全部评分

shaorc
  • shaorc
  • 离线
  • LV8
  • 副总工程师
  • 积分:2754
  • |
  • 主题:192
  • |
  • 帖子:485
积分:2754
LV8
副总工程师
  • 2017-9-22 14:15:50
  • 倒数2
 
先谢谢解答,有个追问
还是在第一个例子中,
无论有多少条阻塞语句进行赋值,
比如除了areg  breg  creg dreg 外
还有ereg freg  等等
把之前的程序写成
ereg=dreg
freg=ereg
等等
只要在一个周期内,
最终的寄存器都是延时一个周期后才得到areg的值?
dspwalker
  • 积分:1392
  • |
  • 主题:4
  • |
  • 帖子:131
积分:1392
LV6
高级工程师
最新回复
  • 2017-9-22 20:32:10
  • 倒数1
 
准确的说,当clk的上升沿出现时,freg就等于areg了,其中涉及到的延时只是硬件上的延时。
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号