基于FPGA的序列检测器(一段式状态机为例)

一、题目要求

假设有一段数据流,要求从数据流中识别出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

三、仿真结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值