首页 > 其他分享 >有限状态机

有限状态机

时间:2024-05-16 14:20:54浏览次数:12  
标签:状态 ... 有限 localparam 时序 状态机 state

1 状态机原理

Verilog HDL语句块都是并行执行的,若想按照顺序的方式执行语句,则会使用有限状态机,简称为状态机。

状态机的设计分为一段式、二段式和三段式。通常使用两段式状态机和三段式状态机。

1.1 二段式状态机

二段式状态机使用一个时序逻辑进行状态的转移,另一个时序逻辑进行数据的输出,模板如下所示:

//二段式状态机模板
module 模块名(
	端口1,
	端口2,
	...
	端口n
	)
    
    //用独热码描述状态
	localparam 状态1 = 	n'b0000...0001;
	localparam 状态2  = 	n'b0000...0010;
   	...
	localparam 状态n  = 	n'b1000...0000;
	
	reg [位宽]	state;	//当前状态
	
	//时序逻辑描述的状态转移
	always @(posedge clk or negedge rst_n) begin
	 	if (rst_n == 1'b0) begin
	 		state <= 默认状态;
	 	end
        else case(state)
            状态1: begin
                if (状态转移条件) begin
	 					state <= 下一个状态;
	 				end
	 				else begin
						state <= state;
	 			end
            end
            状态2: begin
                ...
            end
            ...
            状态n: begin
                ...
            end
        	default begin
        		state = 默认状态;
        	end
        endcase
	end
    
    //时序逻辑描述的数据输出
    always @(posedge clk or negedge rst_n) begin
        数据输出;
    end
    
endmodule

1.2 三段式状态机

三段式状态机将二段式状态机中进行状态转移的时序逻辑分为两个部分,其中一部分用时序逻辑实现状态的存储,另一部分用组合逻辑实现状态的跳转。与二段式状态机相同的是,都用一个时序逻辑进行数据的输出,模板如下所示:

//三段式状态机模板
module 模块名(
	端口1,
	端口2,
	...
	端口n
	)
	
	//用独热码描述状态
	localparam 状态1 = 	n'b0000...0001;
	localparam 状态2  = 	n'b0000...0010;
   	...
	localparam 状态n  = 	n'b1000...0000;
	
	reg [位宽]	curr_state;	//当前状态
	reg [位宽]	next_state; //接下来的状态

	//时序逻辑描述实现状态curr_state的存储
	always @(posedge clk or posedge rst_n) begin
		if (rst_n == 1'b0) begin
			curr_state <= 默认状态;
		end
		else begin
			curr_state <= next_state;
		end
	end
    
    //组合逻辑实现状态next_state的跳转
    always @(posedge clk or negedge rst_n) begin
        case(curr_state)
        	状态1: begin
                if (状态转移条件) begin
	 					next_state <= 下一个状态;
	 				end
	 				else begin
						next_state <= 状态1;
	 			end
        	end
        	状态2: begin
        		...
        	end
        	...
        	状态n: begin
        		...
        	end
        	default begin
        		next_state = 默认状态;
        	end
        endcase
    end
    
    //时序逻辑描述的数据输出
    always @(posedge clk or negedge rst_n) begin
        数据输出;
    end
    
endmodule

三段式状态机将组合逻辑和时序逻辑分开的好处就是将来在修时序的时候方便插入寄存器。

2 实例:自动售货机

使用状态机描述一个简单的自动售货机,该售货机中的商品3元一件,每次投币只能投入1元。在我们描述状态机之前,一般会先画出对应的状态转移图,该状态转移图如图 1 所示。

image-20240516140535982

图1 状态转移图

根据状态转移图,我们可以得到如下所示的Verilog HDL代码:

2.1 两段式

module fsm(
		input	wire		clk,
		input	wire		rst_n,
		input   wire		pi_money,
		output	reg			po_cola
    );
	//用独热码描述状态
	localparam IDLE = 	3'b001;
	localparam ONE  = 	3'b010;
	localparam TWO  = 	3'b100;
    
//两段式状态机
	//状态寄存器(两段式)
	reg [2:0]	state;

	//该always块描述状态转移:state
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 1'b0) begin
			state <= IDLE;
		end
		else case(state)
				IDLE: begin
					if (pi_money == 1'b1) begin
						state <= ONE;
					end
					else begin
						state <= state;
					end
				end
				ONE: begin
					if (pi_money == 1'b1) begin
						state <= TWO;
					end
					else begin
						state <= state;
					end
				end
				TWO: begin
					if (pi_money == 1'b1) begin
						state <= IDLE;
					end
					else begin
						state <= state;
					end
				end
				default: begin
					state <= IDLE;
				end
			endcase
	end
    
    //该always快描述数据输出:po_cola
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 1'b0) begin
			po_cola <= 1'b0;
		end
		else if (state == TWO && pi_money == 1'b1) begin
			po_cola <= 1'b1;
		end
		else begin
			po_cola <= 1'b0;
		end
	end

2.2 三段式

module fsm(
		input	wire		clk,
		input	wire		rst_n,
		input   wire		pi_money,
		output	reg			po_cola
    );
	//用独热码描述状态
	localparam IDLE = 	3'b001;
	localparam ONE  = 	3'b010;
	localparam TWO  = 	3'b100;
    
//三段式寄存器 (将两段式寄存器第一个always块拆分为2个部分,一个部分用时序逻辑,另一个部分用组合逻辑)
	//curr_state用时序逻辑实现
	reg [2:0]	curr_state;
	//next_state用组合逻辑实现
	reg [2:0]	next_state;

	//时序逻辑实现状态的存储
	always @(posedge clk or posedge rst_n) begin
		if (rst_n == 1'b0) begin
			curr_state <= IDLE;
		end
		else begin
			curr_state <= next_state;
		end
	end

	//组合逻辑实现状态的跳转
	always @(*) begin
		case(curr_state)
			IDLE: begin
				if (pi_money == 1'b1) begin
					next_state = ONE;
				end
				else begin
					next_state = IDLE;
				end
			end
			ONE: begin
				if (pi_money == 1'b1) begin
					next_state = TWO;
				end
				else begin
					next_state = ONE;
				end
			end
			TWO: begin
				if (pi_money == 1'b1) begin
					next_state = IDLE;
				end
				else begin
					next_state = TWO;
				end
			end
			default: begin
				next_state = IDLE;
			end
		endcase
	end
    
    //该always快描述数据输出:po_cola
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 1'b0) begin
			po_cola <= 1'b0;
		end
		else if (curr_state == TWO && pi_money == 1'b1) begin
			po_cola <= 1'b1;
		end
		else begin
			po_cola <= 1'b0;
		end
	end

标签:状态,...,有限,localparam,时序,状态机,state
From: https://www.cnblogs.com/little55/p/18195874

相关文章

  • PCIE状态机-LTSSM
    一、PCIE LTSSMLTSSM是指LinkTrainingandStatusStateMachine,是PCIe物理层实现的,用于控制和管理PCIe总线上的数据链路。它提供了一组状态,以便设备进行链路训练和链接协商。在PCIe总线上,发送端和接收端需要进行链路训练,以便确定最佳的链接速度和链接宽度。LTSSM的作......
  • 银弹:为了避免项目的成员为了一些问题争执不休,公司发明了银弹(Silver Bullet)这一工具。
    我的答案:【第二组】答:银弹作为一种工具,其目的是为了在项目团队中解决争议,确保项目能够继续前进。然而,是否真的有用,需要从多个角度进行考量:团队沟通与协作:银弹提供了一种强制性的解决方案,可以在一定程度上减少无休止的争论,促使团队成员快速做出决策。这在某些情况下可以提......
  • 八、贪吃蛇之状态机设计
    八、贪吃蛇之状态机设计贪吃游戏采用mealy状态机。1. 游戏状态控制状态机用一段式编码来完成游戏控制过程:  各状态说明:(1) RESTART:复位后进入重启状态,屏幕显示欢迎界面,6秒后进入游戏难度选择界面,等待选择难度。(2) START:用SW[2:0]选择游戏难度,按下KEY[3:0]任意键,开始......
  • 一汽模具制造有限公司法定代表人——许万才
    介绍来源:https://aiqicha.baidu.com/human_lTM-TogKuTwUct0rfuhEg-8-zyNnYP7-763jmLtuI4v简介:许万才,男,中共党员,毕业于哈尔滨工业大学汽车工程学院汽车设计与制造专业,大学本科学历,工学学士学位。历任一汽轿车股份有限公司总经理助理、长春一汽富维汽车零部件股份有限公司......
  • 基于有限体积法和交错网格的SIMPLE算法推导及实现
    基于有限体积法和交错网格的SIMPLE算法推导及实现SIMPLE算法,半隐式速度压力耦合算法,是专门求解不可压流体流动的算法。由于不可压流体控制方程中,密度常常被视为常数,没有表征流体密度、压力、温度联系的状态方程,压力以梯度项的形式存在于动量方程中,无法显性表达或者直接求解,造成了......
  • verilog 状态机模版
    定义所有状态参数localparamIDLE=3'b000;localparamBOF=3'b001;localparamFIND=3'b010;localparamCHANGE=3'b011;localparamERROR=3'b100;localparamEOF=3'b101;always@(posedgeI_sys_clkor......
  • AI模块(有限状态机、行为树)-应用在cocos中
    前言:本模块是在cocos项目中运用战斗框架,根据学习别人的文章来结合项目进行编写的,若有不对不合理的地方有劳大家指正,万分感谢!!!若有能有用的上的,万分荣幸!简介:AI模块一般是对怪物的AI实现,或者托管等自动战斗的情况。具体方式可能根据项目的具体需求来选择,常用的有:有限状态机,行为树......
  • 普通有限多项式笔记
    普通多项式笔记\(\textrm{Newton'sMethod}\)(牛顿迭代)应用于解决已知\(g(x)\)的情况下,求出\(g(f(x))\equiv0\modx^n\)。首先通过列出方程显然,\(f(x)\modx^n\)在此时是唯一的。那么我们假设已知\(g(f_0(x))\equiv0\modx^{n/2}\),显然此时\(f_0(x)\modx^{n/2}\)也......
  • 有限元分析与应用 | Finite Element Method (FEM) Analysis and Applications
    第1讲引论/1.2变形体力学的要点https://learning.edx.org/course/course-v1:TsinghuaX+70120073x+1T2024/block-v1:TsinghuaX+70120073x+1T2024+type@sequential+block@5c00cb7f61af4dc8abb857abadc46151/block-v1:TsinghuaX+70120073x+1T2024+type@vertical+block@579410847......
  • 有限元方法[Matlab]-笔记
    <<MATLABCodesforFiniteElementAnalysis-SolidsandStructures(Ferreira)>>笔记chapter01matlabbasic略第二章:离散系统笔记、例题Matlab代码problem1.m%MATLABcodesforFiniteElementAnalysis%Problem1:3springsproblem%clearme......