OpenEdv-开源电子网

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

verilog里always下第一个 if 语句里面的变量为什么一定要是always里的敏感变量呢

[复制链接]

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-3-12
在线时间
1 小时
发表于 2015-10-19 21:09:59 | 显示全部楼层 |阅读模式
5金钱
代码为:
module fp_verilog(
             clk,rst_n,
				 fm
				 );
parameter devide=32'd99;
input clk;   //时钟信号
input rst_n; //复位
output fm;   //输出 低亮高不亮

wire a;
reg[31:0] cnt;

//assign a=clk||!rst_n;
always @(posedge clk or posedge rst_n)
begin
	if(rst_n==1)
		cnt<=devide;
	else if(cnt==32'd0)
	   cnt<=devide;
	else
		cnt<=cnt-32'd1;
end
assign fm=(cnt>=(devide/2))? 1'b0:1'b1;

endmodule[/mw_shl_code]
正确,通过编译
当代码为:
[mw_shl_code=c,true]module fp_verilog( clk,rst_n, fm ); parameter devide=32'd99; input clk; //时钟信号 input rst_n; //复位 output fm; //输出 低亮高不亮 wire a; reg[31:0] cnt; //assign a=clk||!rst_n; always @(posedge clk or posedge rst_n) begin if(cnt==32'd0) cnt<=devide; else if(rst_n==1) cnt<=devide; else cnt<=cnt-32'd1; end assign fm=(cnt>=(devide/2))? 1'b0:1'b1; endmodule[/mw_shl_code]
就出现编译错误,两个程序单纯的调换了if判断的顺序,为何always下第一个 if 语句里面的变量为什么一定要是always里的敏感变量呢

最佳答案

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

楼主理解有误,其实这个问题反映的正是硬件描述语言和程控编程语言的本质差别。 在HDL语言中(不论是Verilog还是VHDL等),if()里面的判断一定是最先决的条件,后面的else()里面的判断一定是在先决条件不成立时再进行低一级的判断,所以类似于异步清零或置位等操作,必然是要优先于其它同步逻辑的,所以这类条件判断就一定要放在if()里面,否则就没有硬件能够与之对应了。 而对于C语言等程控编程语言,if()判断仅仅是由ALU进行逻辑运 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-6-6
在线时间
2 小时
发表于 2015-10-19 21:10:00 | 显示全部楼层
楼主理解有误,其实这个问题反映的正是硬件描述语言和程控编程语言的本质差别。
在HDL语言中(不论是Verilog还是VHDL等),if()里面的判断一定是最先决的条件,后面的else()里面的判断一定是在先决条件不成立时再进行低一级的判断,所以类似于异步清零或置位等操作,必然是要优先于其它同步逻辑的,所以这类条件判断就一定要放在if()里面,否则就没有硬件能够与之对应了。
而对于C语言等程控编程语言,if()判断仅仅是由ALU进行逻辑运算,而不是对应着实际的硬件,所以只要逻辑条件能覆盖完全,哪个先判断哪个后判断并不影响实际运算结果,至多只会影响ALU的运算效率而已。。
三更有梦书当枕,千里怀人月在峰!
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-3-12
在线时间
1 小时
 楼主| 发表于 2015-10-19 21:55:03 | 显示全部楼层
 经过多次试验,发现if的先后顺序确实不同,if的顺序决定了异步清零的引脚,先写任何敏感列表中的变量,都会将其的逻辑优先影响cnt寄存器的值,如果开始没有敏感列表中的变量,也许在综合的时候无法将异步变量选出,导致编译失败吧,这是我的理解,写了个一位寄存器的计数器,相当于带异步清零的D出发器,大家可以对照程序和RTL图来感觉if判断先后的区别
module fp_verilog(
             clk,rst_n,a,
 fm
 );
parameter devide=32'd99;
input clk;   //时钟信号
input rst_n; //复位
input a;
output fm;   //输出 低亮高不亮


reg cnt;

//assign a=clk||!rst_n;
always @(posedge clk or posedge rst_n or posedge a)
begin
 if(rst_n)
 cnt<=0;
 else if(a)
   cnt<=0;
 else
 cnt<=~cnt;
end
assign fm=cnt;

endmodule
[/mw_shl_code]


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-3-12
在线时间
1 小时
 楼主| 发表于 2015-11-30 21:45:19 | 显示全部楼层
回复【4楼】laidaihua:
---------------------------------
谢谢大神指点,我在观察了FPGA的逻辑单元结构后就感觉有可能是因为FPGA硬件结构而导致这种情况的,现在你一说我感觉确实如此,感谢给我的帮助。
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-3-12
在线时间
1 小时
 楼主| 发表于 2015-11-30 21:47:09 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,这个帖子推荐答案应该是3楼,不知道能不能改啊!
回复

使用道具 举报

58

主题

6291

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11406
金钱
11406
注册时间
2014-4-1
在线时间
1282 小时
发表于 2015-11-30 21:52:36 | 显示全部楼层
俺帮你改了,大概是第二次使用“老师”的权力。

这个问题俺关注过,当时也没想明白。
平时写verilog的时候,习惯于首先处理rst的情况,所以没有遇到过LZ的问题。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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