//模块功能:检测到序列"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
//模块功能:检测到序列"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