FPGA——状态机
状态机
状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(Finite State Machine),主要分为2大类:
1.Mealy 状态机
输出跟外部输入和当前状态共同决定
2.Moore状态机
输出只和状态有关而与输入无关
FPGA-程序设计
四段论
1.状态空间定义
2.状态跳转
3.下个状态判断
4.确定状态时刻目的
// 状态空间定义
parameter look_book = 3'b001;
parameter play_game = 3'b010;
parameter sleep = 3'b100;
reg [2:0] state_current ;
reg [2:0] state_next ;
简单起见,只定义了两个状态的转移,在每个状态只用一个寄存器置位,采用独热码方式。
// 状态的转移
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
state_current <= sleep;
end
else begin
state_current<=state_next;
end
end
状态的转移 为时序逻辑,即采用非阻塞赋值。在复位时,状态为look_book,否则将次态赋给现态。
// 下一状态的判断
always @(*)begin
case(state_current)
sleep: begin
if(study_time)
state_next = look_book ;
else
state_next = sleep ;
end
look_book:begin
if(play_time)
state_next = play_game ;
else
state_next = look_book ;
end
play_game:begin
if(play_time)
state_next = sleep ;
else
state_next = play_game ;
end
default:sleep;
endcase
end
在下一个状态设计中我们采用组合逻辑的方法,一般在状态判断会有多个条件都会在always语句中这是我们可以用"*“来代替"look_book or play_game or sleep”
// 确定状态时刻目的
wire Incident_one ;
assign Incident_one = (state_current == sleep)? 1'b1: 1'b0;
利用条件语句,完成对事件判断当state_current == sleep条件为真时Incident_one = 1’b1,否则Incident_one = 1’b0。