状态机之二段式

功能实现:检测一段序列码A1011,如果检测到1011输出为1否则输出为0

状态机如图所示:起始状态为IDLE,当检测到A[0]=1,进入state1状态,当检测到A[1]=1时,进入STATE2状态,当检测到A[2]=0时,进入STATE3状态,当检测到A[3]=1时,进入IDLE状态。

状态机可分为两部分:第一部分是描述状态条件转移的判断,第二部分描述的是输出

parameter IDLE = 3'b000;//初始状态
parameter STATE1=3'b001;//状态1
parameter STATE2=3'b010;//状态2
parameter STATE3=3'b100;//状态3

状态描述用的是独热码编码:优点是用的组合逻辑比二进制码少,但是寄存器占用的多

第一个时序模块用的是判断条件转移

always@(posedge CLK or negedge RSTn)
if(!RSTn)
begin
    State<=4'd0;
end
else
begin
    case(State)
        IDLE:if(A[0]==1'b1)
                    State<=STATE1;
                else
                    State<=IDLE;
        STATE1:if(A[1]==1'b1)
                    State<=STATE2;
                 else
                    State<=IDLE;
        STATE2:if(A[2]==0)
                    State<=STATE3;
                 else 
                    State<=IDLE;
        STATE3:if(A[3]==1'b1)
                    State<=IDLE;
                 else
                    State<=IDLE;
        default:State<=IDLE;
    endcase
end

第二个时序模块用的是判断输入和现有的状态来输出

always@(posedge CLK or negedge RSTn)
if(!RSTn)
	rOut<=1'd0;
else if(State==STATE3&&A[3]==1'b1)
	rOut<=1'd1;
else
	rOut<=1'd0;

  test_beach 

initial 
begin
    begin
        RSTn=0;
        CLK=1;
        #10 RSTn=1;
    end
    while(1)
        #10 CLK=~CLK;//时钟每10ns翻转一次
end

initial
begin
    #60
    A=4'b1111;
    //#50 A=4'b1110;
    #100 A=4'b1011;
    #100$stop;//过100ns停
end
原文地址:https://www.cnblogs.com/bixiaopengblog/p/5961221.html