FSM(Finite State Machine,有限状态机)在FPGA中使用的非常广泛,主要是因为FPGA是一个并行的系统,在实际的操作中,我们可能需要一些串行的、有次序的操作。这时候,FSM就可以派上用场了。
FSM主要可以分解为三个部分:
状态S
状态转移逻辑T
输出函数G
当然一般还要规定初始状态S0,之后在输入的作用下,FSM开始运转,状态开始变换,也开始输出。FSM有Moore和Mealy两种,Moore型是指输出仅仅是状态的函数,也即由状态就确定了当前的输出,不需要知道当前的输入。而Mealy型FSM的输出需要不仅需要知道当前的状态,也要知道当前的输入。
那有个问题,Moore型FSM输出只由状态决定,那岂不是输出固定序列吗?输入的作用在哪里?其实,输入的作用在与状态转换函数里,即下一个状态是由当前状态和当前的输入决定的。
于是,Verilog关于FSM的描述也就有:
一段式
两段式
三段式
一段式是所有的逻辑写在一个always时序逻辑块中,在case(state)语句中完成状态转换和输出两个功能。两段式是把时序逻辑和组合逻辑分开来写,组合always块完成状态的更新和输出,时序always块完成状态的更新。三段式是把两段式的状态更新和输出分开来写,组合always块专门完成状态的更新,另加一个组合或者时序always块完成输出。
在复杂的FSM中,建议采用三段式,清晰明了,可以防止状态转换出错。
给出模板如下:
module fsm (
input clk,
input rst,
input in,
output reg out
);
reg cstate; // Current state
wire nstate; // Next state
// First always block, update state
always @(posedge clk or negedge rst) begin
if (rst) begin
// reset
cstate <= s0; // Default state
end
else begin
cstate <= nstate;
end
end
// Second always block, generate next state
always @(*) begin
nstate = s0;
case(cstate)
s0:
if (in)
nstate = s1;
else
nstate = s2;
default:
nstate = 0;
endcase
end
// Third always block, output, this can also be a combinational always
always @(posedge clk or negedge rst) begin
if (rst) begin
// reset
out <= 0;
end
else begin
case(cstate)
s0:
s1:
default:
endcase
end
end
endmodule
文章评论(0条评论)
登录后参与讨论