OpenEdv-开源电子网

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

[ALTERA] 有关开拓者UART实验的if语句问题

[复制链接]

5

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-12-20
在线时间
8 小时
发表于 2020-6-13 10:11:18 | 显示全部楼层 |阅读模式
1金钱
各位老师大家好,在使用开拓者开发版进行UART实验时遇到了一个有关if语句的疑问,请见下面两组代码:
代码1

always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
                rx_flag<=1'b1;
        end
        else begin
                if(start_flag)
                        rx_flag<=1'b1;
                if((rx_cnt==4'd9)&&(clk_cnt==BPS_CNT/2))
                        rx_flag<=1'b0;
                else
                        rx_flag<=rx_flag;
        end
end


代码2
always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
                rx_flag<=1'b1;
        end
        else begin
                if(start_flag)
                        rx_flag<=1'b1;
                else if((rx_cnt==4'd9)&&(clk_cnt==BPS_CNT/2))
                        rx_flag<=1'b0;
                else
                        rx_flag<=rx_flag;
        end
end


相比于代码1,代码2仅多一个else,start_flag是单时钟周期的标志信号,在signaltap下,两组代码均能看到start_flag为一个时钟周期的脉冲,代码2中的rx_flag能够按照设计要求时高时低,而代码1中的rx_flag却一直保持低(即便来start_flag脉冲),这是为什么,难道两组代码的逻辑不一样,还是if语句有什么语法问题我没有注意到?感谢大家解答,感激不尽。



最佳答案

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

这种情况执行的是else rx_flag
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2013

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5618
金钱
5618
注册时间
2018-10-21
在线时间
1591 小时
发表于 2020-6-13 10:11:19 | 显示全部楼层
会飞的鸭鸭 发表于 2020-6-13 20:58
你好,在代码1 signaltap中能看到仅满足 if(start_flag),不满足if((rx_cnt==4'd9)&&(clk_cnt==BPS_CNT/2 ...

这种情况执行的是else rx_flag<=rx_flag;即rx_flag保持不变。第一条if语句始终不执行,所以这种代码的写法可读性很差。
回复

使用道具 举报

3

主题

2013

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5618
金钱
5618
注册时间
2018-10-21
在线时间
1591 小时
发表于 2020-6-13 13:31:01 | 显示全部楼层
两组代码的逻辑不一样。always中出现两个if语句对同一个变量赋值,如果两个if的条件都满足了,会按照后面一个if进行赋值,也就是后面一个if条件优先级更高。但是如果是第二种写法,即if-else if结构,那么就是我们指定了前一个优先级更高。
回复

使用道具 举报

5

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-12-20
在线时间
8 小时
 楼主| 发表于 2020-6-13 20:58:47 | 显示全部楼层
QinQZ 发表于 2020-6-13 13:31
两组代码的逻辑不一样。always中出现两个if语句对同一个变量赋值,如果两个if的条件都满足了,会按照后面一 ...

你好,在代码1 signaltap中能看到仅满足 if(start_flag),不满足if((rx_cnt==4'd9)&&(clk_cnt==BPS_CNT/2)),但代码1  signaltap中的rx_flag恒为0,这是不是quartus软件因为两个if语句对同一个变量赋值,不管哪个条件可以满足或不能满足,自动默认后面的if进行赋值?
回复

使用道具 举报

5

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-12-20
在线时间
8 小时
 楼主| 发表于 2020-6-14 10:45:19 | 显示全部楼层
QinQZ 发表于 2020-6-13 10:11
这种情况执行的是else rx_flag

是不是前面的条件无论满足与不满足,执行的都是else?为什么前面的条件已经满足了(signaltap中能看到)却仍执行else?多谢解答。
回复

使用道具 举报

3

主题

2013

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5618
金钱
5618
注册时间
2018-10-21
在线时间
1591 小时
发表于 2020-6-15 10:02:41 | 显示全部楼层
会飞的鸭鸭 发表于 2020-6-14 10:45
是不是前面的条件无论满足与不满足,执行的都是else?为什么前面的条件已经满足了(signaltap中能看到) ...

你可以把代码1的条件分成(if)和(if else)两种,要把if else看成一个整体,既然后面的优先级高,那么就一直在执行if和else里面的内容
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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