OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14644|回复: 26
打印 上一主题 下一主题

[ALTERA] 请问always块电平触发时,每次电平改变,always块只执行一次吗?

[复制链接]

39

主题

600

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1627
金钱
1627
注册时间
2017-7-17
在线时间
320 小时
楼主
发表于 2019-9-2 17:11:13 | 显示全部楼层
本帖最后由 candylife9 于 2019-9-9 09:52 编辑

不是你对alway理解有问题,是你用软件的思维去设计硬件。综合结果是没有问题的,硬件行为也是按照你描述的去做的。就这个例子来说,你硬件描述语言被综合之后,就会生成这个锁存器,而不是在运行的时候,或者说touch改变的时候才生产的,它就是个硬件电路,就一直在那里,但是这个电路的行为是在描述语言里面定义的,硬件是没有什么运行的概念的。你这里是描述了一个锁存器的功能,就是在touch有效的时候,取反led。硬件是一直有效的,而你是把verilog当成了软件,想成了他是一条一条执行的。------------我的想法是每次检测到电平变化,就检测一次电平信号是不是高电平,如果是高的话就改变led信号变化-------------,你这个想法,很明显就是软件思维,硬件的思维是:不管touch有没有变化,led都会有输出的(不管touch有没有变化,touch的电平都会对led状态有影响,而不是变的时候才检测一次)。

重点:1.你这个例子,begin--end里面的行为就是描述了一个带使能的反相器。(alway描述的就是使能端有效或无效)
          2.你没有理解硬件描述语言。
          3.verilog是硬件描述语言,它描述硬件的行为,是描述,描述,描述,而不是硬件需要执行的代码,代码,代码。
回复

使用道具 举报

39

主题

600

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1627
金钱
1627
注册时间
2017-7-17
在线时间
320 小时
2#
发表于 2019-9-6 16:31:48 | 显示全部楼层
FPGA是数字电路,一个上升沿对应着一次电路状态的刷新,就跟刷新一个网页一样,不要按照代码的思维去理解FPGA的verilog。另外,这不叫作代码,叫硬件描述语言。
回复

使用道具 举报

39

主题

600

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1627
金钱
1627
注册时间
2017-7-17
在线时间
320 小时
3#
发表于 2019-9-9 09:33:31 | 显示全部楼层
本帖最后由 candylife9 于 2019-9-9 09:34 编辑
LíuQían 发表于 2019-9-3 09:33
电平发生变化的时候,不论从高到底还是从低到高,都会触发,这个程序我也不知道错在哪儿了,帮顶,或者你可 ...

哎,没想到这么多人,连硬件和软件的区别都没有搞清楚,连基本的硬件思维都不具备,居然把verilog叫做程序。。。。
回复

使用道具 举报

39

主题

600

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1627
金钱
1627
注册时间
2017-7-17
在线时间
320 小时
4#
发表于 2019-9-9 10:49:38 | 显示全部楼层
denike 发表于 2019-9-4 16:42
module key_touch(input touch,output reg led);
always@(touch)
begin

你这个描述类似于一个两路选择器的功能,也不能实现他的要求。

选择器.jpg (103.12 KB, 下载次数: 213)

选择器.jpg
回复

使用道具 举报

39

主题

600

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1627
金钱
1627
注册时间
2017-7-17
在线时间
320 小时
5#
发表于 2019-9-9 22:36:29 | 显示全部楼层
kqkqk 发表于 2019-9-9 10:54
可是如果按照我always块功能定义和我描述的逻辑,它综合出的电路不应该是在我touch信号有变化且变为高电 ...

因为你一旦touch改变,那么begin--end里面的描述就开始生效(不要理解为执行一次)。所以当touch由0变为1的时候,touch为高满足,led取反这个动作就会生效,而不是执行一次。当touch由1变为0时,begin--end里描述的行为同样生效,但是由于touch为低,所以被输出信号被锁存。
回复

使用道具 举报

39

主题

600

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1627
金钱
1627
注册时间
2017-7-17
在线时间
320 小时
6#
发表于 2019-9-9 22:50:01 | 显示全部楼层
kqkqk 发表于 2019-9-9 10:54
可是如果按照我always块功能定义和我描述的逻辑,它综合出的电路不应该是在我touch信号有变化且变为高电 ...

还要纠正一个问题,就是alway敏感事件的发生和if(touch)的判断是没有先后的,不是touch改变后,再判断touch高低。而是,touch改变时,根据touch的高低,决定led信号的输出,因为硬件是“并行”的。所以,touch由0变为1时,touch到底是高还是低,还要看综合的结果。
回复

使用道具 举报

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

本版积分规则


关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-1-8 19:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表