状态机

状态机分为摩尔(Moore)型有限状态机和米利(Mealy)型有限状态机。摩尔型电路:输出与输入变量无直接关系的时序逻辑电路。米利型电路:输出与输入变量直接相关的时序逻辑电路。

状态机描述方式可分为一段式、两段式和三段式的。但目前我只用到一段式,后面再更新两段式和三段式。

编写状态机的注意事项:

(1)为了避免不必要的锁存器生成,需要穷举所有状态对应的输出动作,或使用default来定义状态动作;

(2)在定义状态时,推荐使用本地化参数定义localparam

下面一段代码,状态的跳转还是不能很好地写出

module Hello(Clk,Rst_n,data,led);
	input Clk;
	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;
		
/* 实现字符串的检测,每检测成功一次,LED状态便翻转一次 */
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)begin
		led <= 1;
		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
`timescale 1ns/1ns
`define clock_period 20
module Hello_tb;
	
	reg Clk;
	reg Rst_n;
	reg [7:0]ASCII;
	
	wire led;
	
	Hello Hello1(
		.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*20);
		Rst_n = 1;
		#(`clock_period*20 + 1);
		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);			
			
			#(`clock_period);	
			ASCII="H";		
			#(`clock_period);	
			ASCII="e";

			#(`clock_period);	
			ASCII="M";		
			#(`clock_period);	
			ASCII="I";			

			#(`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);	
		end
	end

endmodule

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值