3157|11

842

帖子

3

TA的资源

版主

楼主
 

Verilog并行语句中变量赋值问题 [复制链接]

 
本帖最后由 1nnocent 于 2022-4-29 14:20 编辑

 

如上图,如果一个模块里面多个并行语句always1、2、3
a有初值0
第一个always需要a为1才执行红色语句;
而如果a只在第二个always中赋值为1;

问题:

1、这样的话always1红色部分的执行是不是在always1、always2并行执行的同时,还要等待always2赋值完成才能进一步执行?

2、问题一中的情况就是Verilog与C这类语言的区别吗?

3、如果一个Verilog中有多个这样的变量的话,代码看起来不是很乱?

此帖出自FPGA/CPLD论坛

最新回复

在回答你的第一个问题之前,我觉得首先你得明白Verilog是什么。Verilog是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 简单点理解就是,他是用来描述硬件的语言。描述硬件是什么意思,就是你这里搭出来的电路里是怎么反应的,用Verilog描述出来。比如,你给输入了1hz的时钟信号,然后上升沿的时候,你所搭建的数字电路里电流会有什么变化,电压值会怎么变化。然后你用verilog描述出来说这里会这样变化。 所以,你要先弄明白数字电路的一些基础的组合逻辑电路和延时电路。Verilog里面的基本语句是并行语句。就是同时发生的意思。  像你说的三个always语句他是同时发生的。不存在谁等谁的问题。就是三个人各走各的路。   像你说的a只有在b中被赋值。那么a最开始是什么值呢??这个怎么说呢,具体要看你的电路。你的电路搭好之后,你的a的初始值其实就有一个了(高电平,低电平或者悬空高阻状态之类的,你的电路搭起来了,这里就是一个管脚或者一个测试点这样子,你大概理解下就是是实际电路中的一个具体的芯片管脚或者导线测试点了。)这个时候三个always并行的时候,第一个always是直接就根据a当前的状态进行判断了,同时,这个第二个always这里相当于有一个D触发器接下来会把D触发器的输出端反馈回来给a(实际电路中是有一定的延时的)所以,实际上,要等到第二次时钟沿再来的时候这个时候第一个always判断的a才是前面一个时钟沿当时第二个always中被赋值的a。   额我说的可能有点乱,不知道这样你能理解了不? 要想理解verilog一定要先把数字电路基础先认真的学一遍。因为verilog的本质是描述硬件,我觉得比较准确的说是描述数字电路。他的各种描述出的功能实际的完成是各种基本的数字电路组合而成的。   前面算是回答你的第一个问题。   你的第二个问题,Verilog跟C性质相不相同,看了第一个问题的回答,我想你自己应该也能有答案了。不相同。C语言是执行语言,而Verilog是描述性的语言。性质是不一样的。 C语言是顺序语言,Verilog整理来说是算并行语言,只是里面有几个语句的内部是顺序执行的。但是本身的基础语句之间是并行的。就比如,你前面的两个always语句,他们是并行的。再比如如下一段, a<=b;   ① b<=c;    ② always@(上升沿) ③ {d<=b;   ④ e<=c;      ⑤} ①②③这三句也是并行的。 而always的内部④⑤是顺序执行的 假设设置的初始状态a=1,b=0,c=0,d=1,e=1 那么电路开机后在第一个时钟上升沿来临前后会发生什么变化 上升沿还没来 a=1  ----  a=0    b赋值给了a b=0 -----  b=0    c赋值给了b c=0 ------  c=0    c还是那个c d=1 ------  d=1     d还是那个d e=1 ------  e=1    e还是那个e   上升沿来了 a=0 b=0 c=0 d=0   b赋值给了d e=0   c赋值给了e   再说一句,这个是理想状态的上升是瞬间上升的。实际电路中因为上升是有时间的,所以这个上升沿触发的赋值是会延后的。太久了也不搞技术有点忘了,这个延迟时间好像是tr?   第三个问题。你正在学这个的话,一定要去学着画画波形图,更有助于你理解!!!等你完全搞明白了你就不会觉得乱了         详情 回复 发表于 2022-5-6 00:29
点赞 关注
 

回复
举报

1377

帖子

2

TA的资源

五彩晶圆(初级)

沙发
 
你列的1, 2, 3都是 @(posedge sys_clk) 同一个条件的,就是同时执行的。 里面用到 a 值的地方,就是用 a 的当前值。
此帖出自FPGA/CPLD论坛

点评

1、2、3是同时执行的, 如果要执行1中if里面的红色语句的话,是不是就得等到2中完成赋值操作才能执行1中的红色语句。 就是说1中的红色语句和2中的赋值语句就会有一个先后的问题  详情 回复 发表于 2022-4-29 14:46
 
 

回复

2933

帖子

4

TA的资源

五彩晶圆(中级)

板凳
 

都不会执行,因为这些电路是并行的,一个时刻只能有一种状态,一个变量或是一组变量在某一时刻只能有一种状态。所以某一时刻只能有一个赋值起作用。

此帖出自FPGA/CPLD论坛

点评

只有2中赋值了 1中的只是判断a是否满足执行if后面语句的条件  详情 回复 发表于 2022-4-29 14:41
 
 
 

回复

842

帖子

3

TA的资源

版主

4
 
bigbat 发表于 2022-4-29 14:39 都不会执行,因为这些电路是并行的,一个时刻只能有一种状态,一个变量或是一组变量在某一时刻只能有一种状 ...

只有2中赋值了

1中的只是判断a是否满足执行if后面语句的条件

此帖出自FPGA/CPLD论坛
 
 
 

回复

842

帖子

3

TA的资源

版主

5
 
cruelfox 发表于 2022-4-29 14:35 你列的1, 2, 3都是 @(posedge sys_clk) 同一个条件的,就是同时执行的。 里面用到 a 值的地方,就是用 a 的 ...

1、2、3是同时执行的,

如果要执行1中if里面的红色语句的话,是不是就得等到2中完成赋值操作才能执行1中的红色语句。

就是说1中的红色语句和2中的赋值语句就会有一个先后的问题

此帖出自FPGA/CPLD论坛

点评

你就把 a <= ... 这个赋值理解成延后的,所有取 a 值的地方都是修改前的值。  详情 回复 发表于 2022-4-29 15:43
 
 
 

回复

1377

帖子

2

TA的资源

五彩晶圆(初级)

6
 
1nnocent 发表于 2022-4-29 14:46 1、2、3是同时执行的, 如果要执行1中if里面的红色语句的话,是不是就得等到2中完成赋值操作才能 ...

你就把 a <= ... 这个赋值理解成延后的,所有取 a 值的地方都是修改前的值。

此帖出自FPGA/CPLD论坛

点评

理解了 如果一个模块里有很多这种变量这个代码阅读起来是不是很麻烦?  详情 回复 发表于 2022-4-29 15:59
 
 
 

回复

842

帖子

3

TA的资源

版主

7
 
cruelfox 发表于 2022-4-29 15:43 你就把 a <= ... 这个赋值理解成延后的,所有取 a 值的地方都是修改前的值。

理解了 如果一个模块里有很多这种变量这个代码阅读起来是不是很麻烦?

此帖出自FPGA/CPLD论坛

点评

所有 always 开头的块都是并行的关系,在满足条件的时候就会执行。 Verilog 主要用来描述逻辑关系,不像程序语言描述的是一种过程。当然 Verilog 也可以描述过程,但只限于写testbench,不用在电路描述。 &nbs  详情 回复 发表于 2022-4-29 16:38
verilog是电路,各种语句都是真值表。只是真值表由综合软件化简后做成了电路连接。 这个不是计算机软件程序!!!,只要你明白我说的话,就算入门了。  详情 回复 发表于 2022-4-29 16:05
 
 
 

回复

2933

帖子

4

TA的资源

五彩晶圆(中级)

8
 
1nnocent 发表于 2022-4-29 15:59 理解了 如果一个模块里有很多这种变量这个代码阅读起来是不是很麻烦?

verilog是电路,各种语句都是真值表。只是真值表由综合软件化简后做成了电路连接。

这个不是计算机软件程序!!!,只要你明白我说的话,就算入门了。

此帖出自FPGA/CPLD论坛
 
 
 

回复

1377

帖子

2

TA的资源

五彩晶圆(初级)

9
 
1nnocent 发表于 2022-4-29 15:59 理解了 如果一个模块里有很多这种变量这个代码阅读起来是不是很麻烦?

所有 always 开头的块都是并行的关系,在满足条件的时候就会执行。

Verilog 主要用来描述逻辑关系,不像程序语言描述的是一种过程。当然 Verilog 也可以描述过程,但只限于写testbench,不用在电路描述。

 

此帖出自FPGA/CPLD论坛
 
 
 

回复

2113

帖子

0

TA的资源

裸片初长成(初级)

10
 

这样的话always1红色部分的执行是不是在always1、always2并行执行的同时,还要等待always2赋值完成才能进一步执行?

A:1执行自己的,2执行自己的。

两个相互不干扰。

此帖出自FPGA/CPLD论坛
 
 
 

回复

1万

帖子

203

TA的资源

管理员

11
 

在回答你的第一个问题之前,我觉得首先你得明白Verilog是什么。Verilog是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。

简单点理解就是,他是用来描述硬件的语言。描述硬件是什么意思,就是你这里搭出来的电路里是怎么反应的,用Verilog描述出来。比如,你给输入了1hz的时钟信号,然后上升沿的时候,你所搭建的数字电路里电流会有什么变化,电压值会怎么变化。然后你用verilog描述出来说这里会这样变化。

所以,你要先弄明白数字电路的一些基础的组合逻辑电路和延时电路。Verilog里面的基本语句是并行语句。就是同时发生的意思。 

像你说的三个always语句他是同时发生的。不存在谁等谁的问题。就是三个人各走各的路。

 

像你说的a只有在b中被赋值。那么a最开始是什么值呢??这个怎么说呢,具体要看你的电路。你的电路搭好之后,你的a的初始值其实就有一个了(高电平,低电平或者悬空高阻状态之类的,你的电路搭起来了,这里就是一个管脚或者一个测试点这样子,你大概理解下就是是实际电路中的一个具体的芯片管脚或者导线测试点了。)这个时候三个always并行的时候,第一个always是直接就根据a当前的状态进行判断了,同时,这个第二个always这里相当于有一个D触发器接下来会把D触发器的输出端反馈回来给a(实际电路中是有一定的延时的)所以,实际上,要等到第二次时钟沿再来的时候这个时候第一个always判断的a才是前面一个时钟沿当时第二个always中被赋值的a。

 

额我说的可能有点乱,不知道这样你能理解了不?

要想理解verilog一定要先把数字电路基础先认真的学一遍。因为verilog的本质是描述硬件,我觉得比较准确的说是描述数字电路。他的各种描述出的功能实际的完成是各种基本的数字电路组合而成的。

 

前面算是回答你的第一个问题。

 

你的第二个问题,Verilog跟C性质相不相同,看了第一个问题的回答,我想你自己应该也能有答案了。不相同。C语言是执行语言,而Verilog是描述性的语言。性质是不一样的。

C语言是顺序语言,Verilog整理来说是算并行语言,只是里面有几个语句的内部是顺序执行的。但是本身的基础语句之间是并行的。就比如,你前面的两个always语句,他们是并行的。再比如如下一段,

a<=b;   ①

b<=c;    ②

always@(上升沿) ③

{d<=b;   ④

e<=c;      ⑤}

①②③这三句也是并行的。

而always的内部④⑤是顺序执行的

假设设置的初始状态a=1,b=0,c=0,d=1,e=1

那么电路开机后在第一个时钟上升沿来临前后会发生什么变化

上升沿还没来

a=1  ----  a=0    b赋值给了a

b=0 -----  b=0    c赋值给了b

c=0 ------  c=0    c还是那个c

d=1 ------  d=1     d还是那个d

e=1 ------  e=1    e还是那个e

 

上升沿来了

a=0

b=0

c=0

d=0   b赋值给了d

e=0   c赋值给了e

 

再说一句,这个是理想状态的上升是瞬间上升的。实际电路中因为上升是有时间的,所以这个上升沿触发的赋值是会延后的。太久了也不搞技术有点忘了,这个延迟时间好像是tr?

 

第三个问题。你正在学这个的话,一定要去学着画画波形图,更有助于你理解!!!等你完全搞明白了你就不会觉得乱了

 

 

 

此帖出自FPGA/CPLD论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

好的 非常感谢    详情 回复 发表于 2022-5-6 16:25
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 
 

回复

842

帖子

3

TA的资源

版主

12
 
okhxyyo 发表于 2022-5-6 00:29 在回答你的第一个问题之前,我觉得首先你得明白Verilog是什么。Verilog是一种硬件描述语言,以文本形式来描 ...

好的 非常感谢

 

此帖出自FPGA/CPLD论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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