有限状态机,也称为FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态。当其获得一个输入字符时,将从当前状态转换到另一个状态,或者仍然保持在当前状态。
1.One-hot编码的FSM
One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
module ONE_HOT_FSM (Clock, Reset, A, B, C, D, E,Single, Multi, Contig);
input Clock; //输入系统时钟
input Reset; //输入重置信号
input A, B, C, D, E; //输入有限状态机信号
output Single, Multi, Contig; //输出有限状态机信号Single,Multi,Contig
//定义输出信号类型
reg Single;
reg Multi;
reg Contig;
// 定义常量S1-S7为各状态
parameter [6:0] //one-hot编码实现
S1=7'b0000001,
S2=7'b0000010,
S3=7'b0000100,
S4=7'b0001000,
S5=7'b0010000,
S6=7'b0100000,
S7=7'b1000000;
parameter U_DLY=1; //定义延时常量
// 定义当前状态和下一个状态变量为寄存器类型
reg [2:0] Curr_st;
reg [2:0] Next_st;
//对当前状态Curr_st进行赋值,时序逻辑代码
always @ (posedge Clock or posedge Reset)
begin
if (Reset)
Curr_st<=S1; //当复位信号到来时,给当前状态赋值S1
else
Curr_st<=#U_DLY Next_st; //当时钟信号脉冲到来时,将接下状态Next_st赋值给Curr_st
end
//组合逻辑代码
always @ (Curr_st or A or B or C or D or E)
begin
case (Curr_st) //使用case语句实现组合逻辑
S1 : //S1状态执行操作
begin
Multi=1'b0;
Contig=1'b0;
Single=1'b0;
if (A&~B&C)
Next_st=S2;
else if (A&B&~C)
Next_st=S4;
else
Next_st=S1;
end
S2 : //S2状态执行操作
begin
Multi = 1'b1;
Contig = 1'b0;
Single = 1'b0;
if (!D)
Next_st=S3;
else
Next_st=S4;
end
S3 : //S3状态执行操作
begin
Multi=1'b0;
Contig=1'b1;
Single=1'b0;
if (A|D)
Next_st=S4;
else
Next_st=S3;
end
S4 : //S4状态执行操作
begin
Multi=1'b1;
Contig=1'b1;
Single=1'b0;
if (A&B&~C)
Next_st=S5;
else
Next_st=S4;
end
S5 : //S5状态执行操作
begin
Multi=1'b1;
Contig=1'b0;
Single=1'b0;
Next_st=S6;
end
S6 : //S6状态执行操作
begin
Multi=1'b0;
Contig=1'b1;
Single=1'b1;
if (!E)
Next_st=S7;
else
Next_st=S6;
end
S7 : //S7状态执行操作
begin
Multi=1'b0;
Contig=1'b1;
Single=1'b0;
if (E)
Next_st=S1;
else
Next_st=S7;
end
endcase
end
endmodule
2.Binary 编码的FSM
二进制编码实现的FSM。
module binary (Clock, Reset, A, B, C, D, E,Single, Multi, Contig);
input Clock; //输入系统时钟信号
input Reset; //输入重置信号,高电平有效
input A, B, C, D, E; //有限状态机输入信号
output Single, Multi, Contig; //有限状态机输出信号
//定义输出信号类型为寄存器类型
reg Single;
reg Multi;
reg Contig;
//定义常量S1-S7为各状态
parameter [2:0] //二进制编码来实现各状态
S1 = 3'b001,
S2 = 3'b010,
S3 = 3'b011,
S4 = 3'b100,
S5 = 3'b101,
S6 = 3'b110,
S7 = 3'b111;
parameter U_DLY = 1; //定义延时常量
//定义当前状态和下一个状态变量为寄存器类型
reg [2:0] Curr_st;
reg [2:0] Next_st;
//当前状态Curr_st赋值,此处为时序逻辑代码
always @ (posedge Clock or posedge Reset)
begin
if (Reset)
Curr_st <= S1;
else
Curr_st <= #U_DLY Next_st;
end
//case语句实现组合逻辑
always @ (Curr_st or A or B or C or D or D or E)
begin
case (Curr_st)
S1 :S1状态执行操作
begin
Multi = 1'b0;
Contig = 1'b0;
Single = 1'b0;
if (A & ~B & C)
Next_st = S2;
else if (A & B & ~C)
Next_st = S4;
else
Next_st = S1;
end
S2 :S2状态执行操作
begin
Multi = 1'b1;
Contig = 1'b0;
Single = 1'b0;
if (!D)
Next_st = S3;
else
Next_st = S4;
end
S3 :S3状态执行操作
begin
Multi = 1'b0;
Contig = 1'b1;
Single = 1'b0;
if (A | D)
Next_st = S4;
else
Next_st = S3;
end
S4 :S4状态执行操作
begin
Multi = 1'b1;
Contig = 1'b1;
Single = 1'b0;
if (A & B & ~C)
Next_st = S5;
else
Next_st = S4;
end
S5 :S5状态执行操作
begin
Multi = 1'b1;
Contig = 1'b0;
Single = 1'b0;
Next_st = S6;
end
S6 :S6状态执行操作
begin
Multi = 1'b0;
Contig = 1'b1;
Single = 1'b1;
if (!E)
Next_st = S7;
else
Next_st = S6;
end
S7 :S7状态执行操作
begin
Multi = 1'b0;
Contig = 1'b1;
Single = 1'b0;
if (E)
Next_st = S1;
else
Next_st = S7;
end
endcase
end
endmodule