中级会员
 
- 积分
- 264
- 金钱
- 264
- 注册时间
- 2019-3-26
- 在线时间
- 105 小时
|
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#楼]
你这个不是标准的二段式状态机,关于状态机的定义和不同状态机的区别,网上的资料非常多,一般更推荐三段式状态机
|