FPGA 学习10 状态机的理解

FPGA 学习10 状态机的理解

Hello.v 文件


module Hello(Clk,Rst_n,data,led);

	input Clk;//50M
	input Rst_n;//低电平复位
	
	input [7:0]data;
	
	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;
	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:
				begin
					state <= CHECK_H;
					if(data == "o")
						led <= ~led;
					else
						led <= led;
				end
				
			default:state <= CHECK_H;
		endcase		
	end

endmodule
	
	/*				
			CHECK_o :				//进入第5个状态条件
				if(data == "o") begin
					led <= ~led ;
					state <= CHECK_H ;

				end	
				else
					state <= CHECK_H ;	
			default :				//其它非正常状态
					state <= CHECK_H ;
	*/


Hello_tb.v 文件


`timescale 1ns/1ns
`define clock_period 20
module Hello_tb ;

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

	Hello Hello_0(
		.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 +1);
		
		
	// forever : 循环调用,在仿真的时候设置仿真时间即可
		forever begin
			ASCII = "I";
			#(`clock_period);
			ASCII = "A";
			#(`clock_period);
			ASCII = "M";
			#(`clock_period);
			ASCII = "X";
			#(`clock_period);
			ASCII = "i";
			#(`clock_period);
			ASCII = "a";
			#(`clock_period);
			ASCII = "o";	
			#(`clock_period);
			ASCII = "M";
			#(`clock_period);
			ASCII = "e";
			#(`clock_period);
			ASCII = "i";
			#(`clock_period);
			ASCII = "g";
			#(`clock_period);
			ASCII = "e";	
			
			#(`clock_period);
			ASCII = "H";
			#(`clock_period);
			ASCII = "E";
			
			#(`clock_period);
			ASCII = "M";
			#(`clock_period);
			ASCII = "l";
			
			#(`clock_period);
			ASCII = "H";
			#(`clock_period);
			ASCII = "E";
			#(`clock_period);
			ASCII = "L";
			#(`clock_period);
			ASCII = "L";
			#(`clock_period);
			ASCII = "O";
			#(`clock_period);
			
			ASCII = "H";
			#(`clock_period);
			ASCII = "e";
			#(`clock_period);
			ASCII = "l";
			#(`clock_period);
			ASCII = "l";
			#(`clock_period);
			ASCII = "o";
			
			#(`clock_period);
			ASCII = "l";
		end
	end
		
endmodule



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值