OpenEdv-开源电子网

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

always中敏感信号可以双边沿触发吗?

[复制链接]

18

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-7-31
在线时间
0 小时
发表于 2015-7-20 21:45:52 | 显示全部楼层 |阅读模式
5金钱
reg [15:0]cnt;

always@(posedge clk,negedge clk)begin
        if(!rst_n)
                cnt<=0;
        else
                cnt<=cnt+1;
end

上语句在QuartusII中报语法错误;
reg [15:0]cnt;

always@(clk)begin
        if(!rst_n)
                cnt<=0;
        else
                cnt<=cnt+1;
end

上语法个人理解clk发生变化触发敏感信号这与always@(posedge clk,negedge clk)在逻辑上是相通的啊!
其大牛正解!!!

最佳答案

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

想要对时钟进行双边沿触发主要有三种方法。 一种就是像楼上所说,使用电平敏感触发,能够实现时钟的双边沿触发,但是一般不推荐这种方法触发,这种方法虽然在逻辑上是可行的,但verilog终归不是C一样的高级语言,它的每段代码都需经过综合布线实现的,因此在用verilog实现算法的时候还需考虑代码书写风格的合理性,而对时钟信号使用电平触发,很有可能在某些情况下就不能满足时序。 第二种就是就是将上升沿和下降沿分成两个a ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-4-15
在线时间
0 小时
发表于 2015-7-20 21:45:53 | 显示全部楼层
想要对时钟进行双边沿触发主要有三种方法。

一种就是像楼上所说,使用电平敏感触发,能够实现时钟的双边沿触发,但是一般不推荐这种方法触发,这种方法虽然在逻辑上是可行的,但verilog终归不是C一样的高级语言,它的每段代码都需经过综合布线实现的,因此在用verilog实现算法的时候还需考虑代码书写风格的合理性,而对时钟信号使用电平触发,很有可能在某些情况下就不能满足时序。

第二种就是就是将上升沿和下降沿分成两个always快来写,这样子写的缺点就是不能在两个always块中对同一个reg变量做操作,同时这样写总觉得会很蛋疼。

第三种就是利用pll将时钟信号延迟或者滞后180°,分别对上升沿触发,或者干脆将时钟倍频,这样子就不需要考虑太多了。

另外,对于频率不是很快的时钟信号或者是一些异步信号建议采用脉冲形式同步,也就是在一个足够快的时钟下(如50M),可以实时监测输入信号的电平,当两次相邻电平异或之后为1,就表示有上升沿或者下降沿(01表示有上升沿,10表示有下降沿),这样子的好处就是,你的所有模块都可以在同一个工作时钟下工作,而不会因为一些其他时钟信号或异步信号而将电路变成异步电路。

(以上有些是参考网上资料,有些是我实际操作的经验,还望采纳)
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-7-20 23:16:26 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

18

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-7-31
在线时间
0 小时
 楼主| 发表于 2015-7-21 09:23:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
当我早晨上网看到有人回我的帖子了,先是一激动。定眼一看是原子哥,顿时心里一凉,点进去一看果然“帮顶。。。”
开玩笑,原子哥莫介意啊!希望原子哥的M3板子越做越好!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-7-21 23:11:33 | 显示全部楼层
回复【3楼】a2582006460:
---------------------------------
这个我不懂,所以没办法。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

101

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2015-5-23
在线时间
133 小时
发表于 2015-7-23 17:20:19 | 显示全部楼层
回复【3楼】a2582006460:
---------------------------------
你语法错误吧!!
reg [15:0]cnt;

 always@(posedge clk or negedge clk)begin
         if(!rst_n)
                 cnt<=0;
         else
                 cnt<=cnt+1;
 end
这样才行吧!
回复

使用道具 举报

13

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-8-27
在线时间
12 小时
发表于 2015-7-23 22:02:58 | 显示全部楼层
怎么不把报错内容贴上来??看看应该能看出来啊。。
程序的语法最好规范一下,数据写清楚位数,如
cnt <= 16'd0 ;
cnt <= cnt + 1'b1 ;
回复

使用道具 举报

18

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-7-31
在线时间
0 小时
 楼主| 发表于 2015-7-24 08:47:14 | 显示全部楼层
回复【5楼】denike:
---------------------------------
 always@(posedge clk or negedge clk)begin 
         if(!rst_n) 
                 cnt<=0; 
         else 
                 cnt<=cnt+1; 
 end 
这样是个语法错误的!
 always@(clk )begin 
         if(!rst_n) 
                 cnt<=0; 
         else 
                 cnt<=cnt+1; 
 end 
这样语法通过了,可是不知道是不是漏洞。在综合的时候会不会有问题。
回复

使用道具 举报

18

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-7-31
在线时间
0 小时
 楼主| 发表于 2015-7-24 08:50:34 | 显示全部楼层
回复【6楼】tangkunjyy:
---------------------------------
就是想了解一下always@语句中的敏感信号触发的问题,我一般都不会这么写,这只是做测试写了一下。
最近在一本书上看到了这样的写法:
always@(clk )begin  
         if(!rst_n)  
                 cnt<=0;  
         else  
                 cnt<=cnt+1;  
 end 
以前一直以为不可能双边沿触发的,事实也是always@(posedge clk or negedge clk)这样的语句编译无法通过!
不理解always@(clk )begin 这语句的具体含义
回复

使用道具 举报

0

主题

101

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2015-5-23
在线时间
133 小时
发表于 2015-7-25 10:42:48 | 显示全部楼层
always@(clk )begin  这样就行了有变化就触发相当于上下降沿了。
回复

使用道具 举报

18

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-7-31
在线时间
0 小时
 楼主| 发表于 2015-7-26 15:08:30 | 显示全部楼层
回复【10楼】随思远:
---------------------------------
多谢,讲的很好!
不过我求问过同事,他更我说了一种FPGA中的一个硬核也可以用于这种操作模式,也就是像DDR操作模式一样。不知道你知道吗?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2014-5-5
在线时间
1 小时
发表于 2016-8-25 10:02:05 | 显示全部楼层
a2582006460 发表于 2015-7-26 15:08
回复【10楼】随思远:
---------------------------------
多谢,讲的很好!
不过我求问过同事,他更我说了 ...

这个问题我也遇到过,verilog不像VHDL可以实现同一信号不同边沿做敏感信号,所以简单点的方法是将敏感信号取反,再进入程序
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 19:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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