1 /********************************************************************************* 2 * Company : 3 * Engineer : 空气微凉 4 * 5 * Create Date : 00:00:00 22/03/2013 6 * Design Name : 7 * Module Name : 8 * Project Name : 9 * Target Devices : 10 * Tool versions : 11 * Description : 12 * http://www.cnblogs.com/kongqiweiliang/ 13 * Dependencies : 14 * 15 * Revision : 16 * Revision : 0.01 - File Created 17 * Additional Comments : 基础实验_12_有限状态机 :Moore型序列检测器 18 ********************************************************************************/ 19 `timescale 1ns/1ps 20 `define UD #1 21 /*******************************************************************************/ 22 module SEQ_REC_MOORE 23 ( 24 //system interface 25 input iCLK_50 ,//50MHz 26 input iRESET ,//system interface 27 //Interface package 28 input iDAT_EN ,// 29 input iDAT ,// 30 output oDAT // 31 ); 32 //------------------------------------------------------------------------------- 33 parameter FSM_IDLE = 3'h0; 34 parameter FSM_0 = 3'h1; 35 parameter FSM_1 = 3'h2; 36 parameter FSM_2 = 3'h3; 37 parameter FSM_3 = 3'h4; 38 39 reg [2:0] FSM_CS; 40 reg [2:0] FSM_NS; 41 42 // Moore状态机的输出只与有限状态机的当前状态有关,与输入信号的当前 43 // 值无关。 Moore有限状态机在时钟CLOCK脉冲的有效边沿后的有限个门延后, 44 // 输出达到稳定值。即使在一个时钟周期内输入信号发生变化,输出也会在一个 45 // 完整的时钟周期内保持稳定值而不变。输入对输出的影响要到下一个时钟周期 46 // 才能反映出来。 47 // Moore有限状态机最重要的特点就是将输入与输出信号隔离开来。 48 49 // 序列检测的作用是,先根据要检测的序列设计好状机的跳转,状态机会去匹配 50 // 指定的序列,在检测到符合要求后,保持一个CLK的脉冲 51 always@(posedge iCLK_50 or negedge iRESET)begin 52 if(!iRESET) 53 FSM_CS <= FSM_IDLE; 54 else 55 FSM_CS <= FSM_NS; 56 end 57 always@(*)begin 58 case(FSM_CS) 59 FSM_IDLE : 60 if(iDAT_EN && iDAT) FSM_NS = FSM_1; 61 else if(iDAT_EN && (!iDAT)) FSM_NS = FSM_0; 62 else FSM_NS = FSM_IDLE; 63 FSM_0 : 64 if(!iDAT) FSM_NS = FSM_0; 65 else if(iDAT) FSM_NS = FSM_1; 66 else FSM_NS = FSM_IDLE; 67 FSM_1 : 68 if(!iDAT) FSM_NS = FSM_0; 69 else if(iDAT) FSM_NS = FSM_2; 70 else FSM_NS = FSM_IDLE; 71 FSM_2 , 72 FSM_3 : 73 if(!iDAT) FSM_NS = FSM_0; 74 else if(iDAT) FSM_NS = FSM_3; 75 else FSM_NS = FSM_IDLE; 76 default : 77 FSM_NS = FSM_IDLE; 78 endcase 79 end 80 81 assign oDAT = (FSM_CS == FSM_3) ? 1'h1 : 1'h0; 82 //------------------------------------------------------------------------------- 83 endmodule