OpenEdv-开源电子网

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

[ALTERA] always@(*)语句产生的组合逻辑中,句子内部语句执行的一些疑问

[复制链接]

8

主题

12

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-12-9
在线时间
6 小时
发表于 2020-3-11 11:59:16 | 显示全部楼层 |阅读模式
在以太网环回实验中,以下是always@(*)产生的组合逻辑,但是对内部语句是怎样执行的,存在疑惑。就比如,cur_state==st_idle时,如果skip_en从0变1,那么,只执行语句
if(skip_en)               
                next_state = st_check_sum;
还时说从begin的开始处执行,也就是说
先执行
    next_state = st_idle;
再执行
if(skip_en)               
                next_state = st_check_sum;
是不是always@(*)语句中,只要敏感信号出现变化,begin-end内的语句都会执行一遍?还是说,只是跳到敏感信号出执行相应程序。

always @(*) begin
    next_state = st_idle;
    case(cur_state)
        st_idle     : begin                               //等待发送数据
            if(skip_en)               
                next_state = st_check_sum;
            else
                next_state = st_idle;
        end  
        st_check_sum: begin                               //IP首部校验
            if(skip_en)
                next_state = st_preamble;
            else
                next_state = st_check_sum;   
        end                             
        st_preamble : begin                               //发送前导码+帧起始界定符
            if(skip_en)
                next_state = st_eth_head;
            else
                next_state = st_preamble;      
        end
        st_eth_head : begin                               //发送以太网首部
            if(skip_en)
                next_state = st_ip_head;
            else
                next_state = st_eth_head;      
        end              
        st_ip_head : begin                                //发送IP首部+UDP首部               
            if(skip_en)
                next_state = st_tx_data;
            else
                next_state = st_ip_head;      
        end
        st_tx_data : begin                                //发送数据                  
            if(skip_en)
                next_state = st_crc;
            else
                next_state = st_tx_data;      
        end
        st_crc: begin                                     //发送CRC校验值
            if(skip_en)
                next_state = st_idle;
            else
                next_state = st_crc;      
        end
        default : next_state = st_idle;   
    endcase
end                     

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2178
金钱
2178
注册时间
2018-8-27
在线时间
258 小时
发表于 2020-3-12 09:03:10 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

2013

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5617
金钱
5617
注册时间
2018-10-21
在线时间
1591 小时
发表于 2020-3-12 09:14:42 | 显示全部楼层
不是的,之所以在第二行程序添加next_state = st_idle,是为了避免因case语句不全而生成锁存器。
比如,如果skip_en从0变1,那么只执行语句
if(skip_en)
    next_state = st_check_sum;

第二行的语句,只有在下面的语句case或者if语句不全时,才会执行。
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2019-5-6
在线时间
27 小时
发表于 2022-10-7 23:09:44 | 显示全部楼层
QinQZ 发表于 2020-3-12 09:14
不是的,之所以在第二行程序添加next_state = st_idle,是为了避免因case语句不全而生成锁存器。
比如,如 ...

你好  在Aaronzhong中 举的列子中,如果不在第二行中加入next_state = st_idle 是否可行,谢谢指导
回复 支持 反对

使用道具 举报

3

主题

2013

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5617
金钱
5617
注册时间
2018-10-21
在线时间
1591 小时
发表于 2022-10-9 09:51:44 | 显示全部楼层
chunyu5888 发表于 2022-10-7 23:09
你好  在Aaronzhong中 举的列子中,如果不在第二行中加入next_state = st_idle 是否可行,谢谢指导

也可以,但是加上这句有个好处是当case语句不全时,可以让状态机又恢复到默认状态
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 08:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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