OpenEdv-开源电子网

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

[ALTERA] 请教一个边沿检测的基本问题,感觉很迷

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-9-18
在线时间
13 小时
发表于 2020-1-22 10:16:36 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 mxdpsp 于 2020-1-22 10:22 编辑

//Quartus II环境,Verilog语言
//代码如下:
module key_test(
  input  sys_clk,             //PIN_E1

  input  key_1,               //PIN_E15
  input  key_2,               //PIN_M2

  output reg test            //PIN_A2
);

always @(negedge key_1 or negedge key_2) begin
    test <= ~test;
end

//本意是按下key_1或key_2都会触发输出test翻转,但综合后查看RTL发现test被综合成了一个首尾相连的寄存器,和key_1,key_2完全无关,请问是为什么?

1.png


最佳答案

查看完整内容[请看2#楼]

“有很多莫名其妙的问题”,我理解会导致下面的问题: 1、除了外部信号触发,代码中一般还会有系统时钟触发的其它的always块,因为触发信号是异步的,会导致时序竞争与冒险,带来一些未知结果; 2、不是一个always块,甚至是用不同的信号触发的。而在不同的always块中,不能对同一个变量赋值,编译时会报错; 3、其它问题,望高手继续补充。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

52

主题

147

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2019-4-1
在线时间
118 小时
发表于 2020-1-22 10:16:37 | 显示全部楼层
QinQZ 发表于 2020-2-4 19:10
边沿检测不要这么写,很有很多莫名其妙的问题。时序电路的always里面只能是时钟和复位,按照常规的写法来

“有很多莫名其妙的问题”,我理解会导致下面的问题:
1、除了外部信号触发,代码中一般还会有系统时钟触发的其它的always块,因为触发信号是异步的,会导致时序竞争与冒险,带来一些未知结果;
2、不是一个always块,甚至是用不同的信号触发的。而在不同的always块中,不能对同一个变量赋值,编译时会报错;
3、其它问题,望高手继续补充。。。
回复

使用道具 举报

52

主题

147

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2019-4-1
在线时间
118 小时
发表于 2020-2-3 12:19:05 | 显示全部楼层
通常的写法是用系统时钟的边沿触发,然后代码判断按键是否按下,像下面这样的代码,肯定没问题:
always @(posedge sys_clk or 。。。)begin
if(key_1 or key_2。。。
end
不过像你那样写,我也想不出到底错在哪里
回复

使用道具 举报

16

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2019-7-17
在线时间
43 小时
发表于 2020-2-3 16:23:54 | 显示全部楼层
always(....) 里面是敏感信号,如果没了时钟如何进行沿边和运行呀!我个人意见不知道是否正确
回复

使用道具 举报

3

主题

2013

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5618
金钱
5618
注册时间
2018-10-21
在线时间
1591 小时
发表于 2020-2-4 19:10:31 | 显示全部楼层
边沿检测不要这么写,很有很多莫名其妙的问题。时序电路的always里面只能是时钟和复位,按照常规的写法来
回复

使用道具 举报

8

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2017-1-14
在线时间
48 小时
发表于 2020-2-8 21:22:39 | 显示全部楼层
这可以用assign 语句来实现此功能吧
回复

使用道具 举报

8

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2017-1-14
在线时间
48 小时
发表于 2020-2-8 21:23:21 | 显示全部楼层
这个 可以用assign 语句来实现此功能吧
回复

使用道具 举报

1

主题

21

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2019-5-3
在线时间
7 小时
发表于 2020-3-4 13:07:34 | 显示全部楼层
你先用时钟检测到 两个按键的上升沿(或者下降沿)再说
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-9-18
在线时间
13 小时
 楼主| 发表于 2020-3-4 16:15:23 | 显示全部楼层
jshzp 发表于 2020-2-3 12:19
通常的写法是用系统时钟的边沿触发,然后代码判断按键是否按下,像下面这样的代码,肯定没问题:
always @ ...

的确是莫名其妙啊,只能规范书写以避之了
回复

使用道具 举报

1

主题

21

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2019-5-3
在线时间
7 小时
发表于 2020-5-13 23:58:26 | 显示全部楼层
你是一窍不通
回复

使用道具 举报

15

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2019-12-17
在线时间
76 小时
发表于 2020-6-9 10:05:49 | 显示全部楼层
带有posedge和negedge关键字的事件表达式表示沿触发的时序逻辑,没有posedge和negedge关键字表示组合逻辑或者电平敏感的锁存器
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 16:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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