原创 FSM

2014-9-10 17:08 804 10 10 分类: FPGA/CPLD
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
 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条