OpenEdv-开源电子网

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

[其他] 求教,在一个时序always块里,判断并进行状态转移,输出使用其他时序或逻辑电路,算是几段式状态机?

[复制链接]

17

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
264
金钱
264
注册时间
2019-3-26
在线时间
105 小时
发表于 2022-8-9 15:22:47 | 显示全部楼层 |阅读模式
10金钱
只定义了一个当前状态curr_state,没有使用下一状态next_state判断curr_state的状态转移条件和进行状态转移都在同一个时序电路中,比如这样:

//同步时序判断状态转移条件,状态转移
always @(posedge module_clk or negedge ex_rst)begin
        if(!ex_rst)
                state <= EE_IDLE;
        else begin
                case(state)
                        EE_IDLE:
                                if(write_en_edge)
                                        state <= EE_WRITE_REQ;
                                else if(read_en_edge)
                                        state <= EE_READ_REQ;
                                else
                                        state <= EE_IDLE;
                       
                        EE_READ_REQ:
                                if(i2c_read_req_ack)
                                        state <= EE_READ_ADD;
                                else if(wr_req_wait == WR_REQ_WAIT_MAX)
                                        state <= EE_READ_END;
                                else
                                        state <= EE_READ_REQ;
                       
                        EE_WRITE_REQ:
                                if(i2c_write_req_ack)
                                        state <= EE_WRITE_ADD;
                                else if(wr_req_wait == WR_REQ_WAIT_MAX)
                                        state <= EE_WRITE_END;
                                else
                                        state <= EE_WRITE_REQ;
                       
                        EE_READ_ADD:
                                state <= EE_READ_WAIT;
                       
                        EE_WRITE_ADD:
                                state <= EE_WRITE_WAIT;

                        EE_READ_WAIT:
                                if(i2c_slave_reg_addr == read_lenth + 1'd1)
                                        state <= EE_READ_END;
                                else if(wr_wait_cnt == WR_Wait_MAX)
                                        state <= EE_READ_REQ;
                                else
                                        state <= EE_READ_WAIT;
                       
                        EE_WRITE_WAIT:
                                if(i2c_slave_reg_addr == write_lenth + 1'd1)
                                        state <= EE_WRITE_END;
                                else if(wr_wait_cnt == WR_Wait_MAX)
                                        state <= EE_WRITE_REQ;
                                else
                                        state <= EE_WRITE_WAIT;
                                               
                        EE_READ_END,EE_WRITE_END:
                                state <= EE_IDLE;
                               
                        default:state <= EE_IDLE;
                       
                endcase;
        end
end


输出使用其他always块,同步时序或者组合逻辑:
//写结束
assign write_done= (state==EE_WRITE_END)?1:0;

//读结束
assign read_done = (state==EE_READ_END)?1:0;

//读地址++
always @(posedge module_clk or negedge ex_rst) begin
        if(!ex_rst)
                i2c_slave_read_addr <= 16'd0;
        else if(state==EE_READ_ADD)
                i2c_slave_read_addr <= i2c_slave_read_addr + 16'd1;
        else if(state==EE_IDLE)
                i2c_slave_read_addr <= 16'd0;
        else
                i2c_slave_read_addr <= i2c_slave_read_addr;
end
//等待ACK计时
always @(posedge module_clk or negedge ex_rst) begin
        if(!ex_rst)
                wr_req_wait <= 32'd0;
        else if(state==EE_READ_REQ || state==EE_WRITE_REQ)
                wr_req_wait <= wr_req_wait + 32'd1;
        else
                wr_req_wait <= 32'd0;
end



请问这种结构算是几段式状态机?算两段式吗?
入门FPGA后,经常使用这种写法,没有用到next_state进行状态转移,也不是用的组合逻辑判断状态转移条件,把描述状态转移和判断转移条件放在同一个时序电路里了,这样写应该也符合规范吧,和标准的3段式状态机相比,都有哪些缺点?虚心请教。

最佳答案

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

你这个不是标准的二段式状态机,关于状态机的定义和不同状态机的区别,网上的资料非常多,一般更推荐三段式状态机
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1979

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5520
金钱
5520
注册时间
2018-10-21
在线时间
1561 小时
发表于 2022-8-9 15:22:48 | 显示全部楼层
你这个不是标准的二段式状态机,关于状态机的定义和不同状态机的区别,网上的资料非常多,一般更推荐三段式状态机
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-10-4 02:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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