序列检测器的 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)仿真结果