功能实现:检测一段序列码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