verilog中这几种写法有区别吗?我觉得没什么区别啊, 写代码的时候遇到几个语法问题,在此向各位求助一下

由always引导的顺序语句都会被执行一遍啊,为什么第二种写法通不过编译呢???写法1:reg[15:0]cnt_2;always@(posedgeclkornegedg... 由always引导的顺序语句都会被执行一遍啊,为什么第二种写法通不过编译呢???

写法1:reg [15:0]cnt_2;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) cnt_2<=0;
else if(cnt_2==16'd50000) cnt_2<=0;
cnt_2<=cnt_2+1;
end

结果:通过编译

写法2:reg [15:0]cnt_2;
always @(posedge clk or negedge rst_n)
begin
cnt_2<=cnt_2+1;
if(!rst_n) cnt_2<=0;
else if(cnt_2==16'd50000) cnt_2<=0;
end

结果:编译出现错误

写法3:reg [15:0]cnt_2;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) cnt_2<=0;
else if(cnt_2==16'd50000) cnt_2<=0;
else cnt_2<=cnt_2+1;
end

结果:通过编译

我觉得这几种写法,都很正确啊,为什么写法2出现错误呢?????
展开
 我来答
iker_casillas
2011-08-01 · TA获得超过1992个赞
知道小有建树答主
回答量:582
采纳率:100%
帮助的人:839万
展开全部
<=是非堵塞赋值,也就是一个块里的所有<=语句都是同时运行。
第二个写法里,不管出现何种情况,cnt_2都会被赋值两次。但这两次赋值是同时的。你想,同时赋两个不同的值,这个电路怎么画?
也就是说,一个块里,一个变量在任何情况下都只能被<=赋值一次。

因为你编的实际上是电路,不能用软件的思想去想问题。
褐雨黑桐
2011-08-01 · TA获得超过455个赞
知道小有建树答主
回答量:251
采纳率:100%
帮助的人:248万
展开全部
其实最后能够实现功能的只有第三个!虽然begin-end之间是顺序执行,但在verilog中,你要是想得到你要的结果,只有第三个稳定而且可以实现,有些编译能够通过,但达不到效果,所以不要忘了在板子上下载实现一下看看
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式