实验:设计一个用于识别2进制序列“1011”的状态机
基本要求:
电路每个时钟周期输入1比特数据,当捕获到1011的时钟周期,电路输出1,否则输出0
使用序列101011010作为输出的测试序列
扩展要求:
给你的电路添加输入使能端口,只有输入使能EN为1的时钟周期,才从输入的数据端口向内部获取1比特序列数据。
设计思路:
要得到“1011”序列,从最低位开始匹配,匹配成功就跳转到下一状态,继续匹配下一位,如果匹配不成功就返回到0状态重新开始匹配。
注意加上使能信号后,只有当EN = 1时才可以将输入数据进行匹配。
状态输入逻辑值
状态转换图
输出逻辑值
识别2进制序列“1011”的状态机代码
module state_machine_1011(
CLK ,
RST ,
IN ,
EN ,
OUT );
input CLK ;
input RST ;
input EN ;
input IN ;
output OUT ;
parameter ST_0 = 0;
parameter ST_1 = 1;
parameter ST_2 = 2;
parameter ST_3 = 3;
parameter ST_4 = 4;
reg [2-1:0]stateR ;
reg [2-1:0]next_state ;
reg OUT ;
//calculate next_state
always @ (IN or EN or stateR) begin
case (stateR)
ST_0 :begin if(IN == 0 && EN == 0) next_state = ST_0 ; else if (IN == 0 && EN == 1) next_state = ST_0 ;else if (IN == 1 && EN == 0) next_state = ST_1 ;else if (IN == 1 && EN == 1) next_state = ST_1 ; end
ST_1 :begin if(IN == 0 && EN == 0) next_state = ST_1 ; else if (IN == 0 && EN == 1) next_state = ST_2 ;else if (IN == 1 && EN == 0) next_state = ST_1 ;else if (IN == 1 && EN == 1) next_state = ST_1 ; end
ST_2 :begin if(IN == 0 && EN == 0) next_state = ST_2 ; else if (IN == 0 && EN == 1) next_state = ST_0 ;else if (IN == 1 && EN == 2) next_state = ST_1 ;else if (IN == 1 && EN == 1) next_state = ST_3 ; end
ST_3 :begin if(IN == 0 && EN == 0) next_state = ST_3 ; else if (IN == 0 && EN == 1) next_state = ST_2 ;else if (IN == 1 && EN == 0) next_state = ST_3 ;else if (IN == 1 && EN == 1) next_state = ST_4 ; end
ST_4 :begin next_state = ST_0 ; end
endcase
end
//calculate output
always @ (stateR) begin
if(stateR == ST_4)
OUT = 1'b1;
else
OUT = 1'b0;
end
// state DFF
always @ (posedge CLK or posedge RST)begin
if(RST)
stateR <= ST_0;
else
stateR <= next_state;
end
endmodule
识别2进制序列“1011”的状态机时序仿真图
通过观察时序仿真图可知:
若输入信号为101011010时,当使能端EN= 1,状态机能够正常输出序列1011;
当使能端EN= 0时,由于不能识别输入信号状态机会保持原状态不变,直到使能信号 EN= 1才继续读数。