• 状态机之二段式


    功能实现:检测一段序列码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
  • 相关阅读:
    【BZOJ1006】神奇的国度(弦图)
    弦图
    【BZOJ2946】公共串(后缀数组)
    【POJ1743】Musical Theme(后缀数组)
    JAVA和Tomcat运维整理
    linux shell 之if-------用if做判断
    Linux curl命令详解
    Intel HEX文件解析
    Linux bridge-utils tunctl 使用
    怎样查询锁表的SQL
  • 原文地址:https://www.cnblogs.com/bixiaopengblog/p/5961221.html
Copyright © 2020-2023  润新知