一、题目要求
假设有一段数据流,要求从数据流中识别出Hello,若识别成功,输出一个高电平,控制led灯发生反转。
根据题目要求,可以将整个状态分为5个:
状态1:检测到H,跳转到状态2,判断是否为e。
状态2:检测e,若为e,则跳转到状态3,否则跳转到状态1,判断第一个字母是否为H。
状态3:检测l,若为l,则跳转到状态4,否则跳转到状态1,判断第一个字母是否为H。
状态4:检测l,若为l,则跳转到状态5,否则跳转到状态1,判断第一个字母是否为H。
状态5:检测o,若为o,则控制LED小灯打开,并回到状态1继续检测。
二、源代码
为了便于理解,以一段式状态机为例。
module Hello(clk,rst,data,led);
input clk;//50M
input rst;//低电平复位
input [7:0] data;//连续数据流输入ASCLL码
output reg led;
//定义5个状态,独热码编码
localparam
CHECK_H = 5'b0_0001,//这部分代码相当于用CHECK_H来代替了5'b0_0001这一串数字
CHECK_e = 5'b0_0010,
CHECK_la = 5'b0_0100,
CHECK_lb = 5'b0_1000,
CHECK_o = 5'b1_0000;
reg [4:0] state;//定义状态所需要的寄存器
//暂时使用一段式状态机
always@(posedge clk or negedge rst)
if(!rst)begin
state <= CHECK_H;
led <= 1'b1;
end
else begin
case(state)
CHECK_H:
if(data == "H")//检测到H,则跳转到下一个状态
state <= CHECK_e;
else
state <= CHECK_H;
CHECK_e:
if(data == "e")
state <= CHECK_la;
else
state <= CHECK_H;
CHECK_la:
if(data == "l")
state <= CHECK_lb;
else
state <= CHECK_H;
CHECK_lb:
if(data == "l")
state <= CHECK_o;
else
state <= CHECK_H;
CHECK_o:
if(data == "o")
begin
led <= ~led;
state <= CHECK_H;
end
else
state <= CHECK_H;
default:state <= CHECK_H;
endcase
end
endmodule