FPGA初学-状态机

当检测到hello的时候,led翻转

module Hello(Clk,Rst_n,data,led);
			input Clk;//50M
			input Rst_n;//低电平复位
			input [7:0] data;//ascii码,八位
			
			output reg led;
			
			//接下来对状态进行定义
			localparam//在文件内部使用,无法在外部被其他的文件修改
				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_n)
				if(!Rst_n)begin
				
					led<=1'b1;
					state<=CHECK_H;//当系统复位的时候,让状态处于等待check_H的状态
				end
				else begin
					case(state)
						CHECK_H:
							if(data=="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;//序列正确,led翻转
								state<=CHECK_H;//进行新序列的检测
							end
							else	
								state<=CHECK_H;

								//当电路出现问题,出现除以上状态的任何一种情况,那么led状态不发生变化,而且state回到check_H
							default:state<=CHECK_H;
							endcase
				
				end 
				
			





endmodule 
`timescale 1ns/1ns
`define clock_period 20

module Hello_tb;
			reg Clk;
			reg Rst_n;
			reg [7:0]ASCII;
			wire led;




			Hello Hello0(
			.Clk(Clk),
			.Rst_n(Rst_n),
			.data(ASCII),
			.led(led)
			);

		initial Clk=1;
		always #(`clock_period/2)Clk=~Clk;
		initial begin
			Rst_n=0;
			
			ASCII=0;
			#(`clock_period*200);
			Rst_n=1;
			#(`clock_period*200);
			repeat(10) begin 
				ASCII = "I";
				#(`clock_period);
				ASCII = "A";
				#(`clock_period);
				ASCII = "M";
				#(`clock_period);
				ASCII = "H";
				#(`clock_period);
				ASCII = "e";
				#(`clock_period);
				ASCII = "l";	
				#(`clock_period);
				ASCII = "l";
				#(`clock_period);
				ASCII = "o";			
			
			end 
		
		
		
		
		
		end


endmodule 

最后的结果是这样的在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值