【FPGA】有限状态机(FSM)的设计

       有限状态机,也称为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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值