序列检测器的 Verilog 实现 
 
1.  摩尔型电路 
(1)状态转移图 
 
(2)Verilog 代码 
//////////////////////////////////////////////////////////////////////////////// 
//模块功能:检测到序列"10010"时立即输出 1,这是个摩尔型电路 
//QQ:787671932        2012-9-25 
//////////////////////////////////////////////////////////////////////////////// 
module seqdet(x,z,clk,rst); 
input x,clk,rst;                            //x 为输入序列 
output z;                                                   
 
reg[2:0]state,nstate;                //state 为当前状态,nstate 为下一状态 
 
parameter    IDLE=3'd0,        //初始状态 
                            A=3'd1,        //状态序列 1 
                            B=3'd2,        //状态序列 10 
                            C=3'd3,        //状态序列 100 
                            D=3'd4,        //状态序列 1001 
                            E=3'd5;        //状态序列 10010                   
//////////////////////////////////////////////////////////////////////////////// 
always@(x,state) 
        case(state) 
          IDLE:if(x==1)    nstate=A; 
                    else            nstate=IDLE; 
          A:      if(x==0)    nstate=B; 
                    else            nstate=A; 
          B:      if(x==0)    nstate=C; 
 
 
    else            nstate=A; 
          C:      if(x==1)    nstate=D; 
                    else            nstate=IDLE; 
          D:      if(x==0)    nstate=E; 
                    else            nstate=A; 
  E:      if(x==0)    nstate=C; 
 
 
            else          nstate=A; 
  default:              nstate<=IDLE; 
 
 
endcase 
///////////////////////////////////////////////////////////////////////////////  
always@(posedge clk,negedge rst) 
  if(!rst)      state<=IDLE; 
  else          state<=nstate; 
////////////////////////////////////////////////////////////////////////////// 
assign z=(state==E);    //z 输出为 1 的条件,z 只和状态有关,所以为摩尔型 
///////////////////////////////////////////////////////////////////////////// 
endmodule 
 
(3)仿真结果 
 
2.  米利型电路 
(1)状态转移图 
 
 
 
(2)Verilog 代码 
//////////////////////////////////////////////////////////////////////////////// 
//模块功能:检测到序列"10010"时立即输出 1,这是个米利型电路 
//QQ:787671932        2012-9-24 
//////////////////////////////////////////////////////////////////////////////// 
module seqdet(x,z,clk,rst); 
input x,clk,rst;                            //x 为输入序列 
output z;                                                   
reg[2:0]state,nstate;                //state 为当前状态,nstate 为下一状态 
parameter    IDLE=3'd0,        //初始状态 
                            A=3'd1,        //状态序列 1 
                            B=3'd2,        //状态序列 10 
                            C=3'd3,        //状态序列 100 
                            D=3'd4,        //状态序列 1001 
                            E=3'd5;        //状态序列 10010                   
//////////////////////////////////////////////////////////////////////////////// 
always@(x,state) 
        case(state) 
          IDLE:if(x==1) nstate=A; 
                    else          nstate=IDLE; 
          A:      if(x==0) nstate=B; 
                    else          nstate=A; 
          B:      if(x==0) nstate=C; 
 
    else          nstate=A; 
          C:      if(x==1) nstate=D; 
                    else          nstate=IDLE; 
          D:      if(x==0) nstate=E; 
                    else          nstate=A; 
 
  E:      if(x==0) nstate=C; 
            else          nstate=A; 
 
  default:            nstate<=IDLE; 
 
 
endcase 
///////////////////////////////////////////////////////////////////////////////  
always@(posedge clk,negedge rst) 
  if(!rst) state<=IDLE; 
  else          state<=nstate; 
////////////////////////////////////////////////////////////////////////////// 
assign z=(state==D) && (x==0);    // z 既和状态有关又和输入有关,所以为米利型 
///////////////////////////////////////////////////////////////////////////// 
endmodule 
 
 
 
 
(3)仿真结果