FPGA学习第1天--状态机介绍

状态机是什么?

Finite State Machine
有限状态机(FSM)
在这里插入图片描述

状态机的写法

一段式:
只有一个always块,把所有的逻辑(输入、输出、状态)都在一个always块
的时序逻辑中实现。这种写法看起来很简洁,但是不利于维护,如果状态复杂一些
容易出错。
二段式:
有两个always 块,把时序逻辑和组合逻辑分隔开来。时序逻辑里进行当前状态
和下一状态的切换,组合逻辑实现各个输入、输出以及状态判断。这种写法不仅便于
阅读、理解、维护,而且利于综合器优化代码,利于用户添加合适的时序约束条件,
利于布局布线器实现设计。在两段式描述中,当前状态的输出用组合逻辑实现,可能
存在竞争和冒险,产生毛刺。
三段式:
有三个always块,一个采用同步时序的方式描述状态转移,
一个采用组合逻辑的方式判断状态转移条件、描述状态转移规律,
第三个always使用同步时序的方式描述每个状态的输出。
代码容易维护,时序逻辑的输出解决了两段式组合逻辑的毛
刺问题,但是从资源消耗的角度上看,三段式的资源消耗多一些。

一段式状态机参考代码:

module	fsm_led(
	input	wire		clk_50M,//输入时钟信号
	input	wire		rst_n,	//输入复位信号
	
	output  reg	[3:0]	led		//输出4个led
);

//设置参数
parameter T = 26'd9_999_999;

//状态机

//状态空间划分
localparam	S_led0_on = 0;//第1个led亮
localparam	S_led1_on = 1;//第2个led亮
localparam	S_led2_on = 2;//第3个led亮
localparam	S_led3_on = 3;//第4个led亮

//状态寄存器
reg	[1:0]	cstate;	//current当前,state状态,4个状态需要2个位宽的二进制数来存储

//定义1s计数器,50_000_000次,需要26个位宽
reg	[25:0]	cnt;

//1s钟计数器模块
always@(posedge clk_50M or negedge rst_n)begin
	if(!rst_n)							//如果按下复位键
		cnt <= 1'b0;					//计数器清零
	else if(cnt == T)					//如果计数达到1S
		cnt <= 1'b0;					//计数器清零
	else							
		cnt <= cnt + 1'b1;				//否则,计数器自增1
end

//一段式状态机
//状态的判断和转移,根据状态输出
always@(posedge clk_50M or negedge rst_n)begin
	if(!rst_n)begin
		led <= 4'b0000;
		cstate <= S_led0_on;
	end
	else
		case(cstate)
			S_led0_on : begin
							led <= 4'b0001;
								if(cnt == T)
									cstate <= S_led1_on;
								else
									cstate <= cstate;
						end
			S_led1_on : begin
							led <= 4'b0010;
								if(cnt == T)
									cstate <= S_led2_on;
								else
									cstate <= cstate;
						end
			S_led2_on : begin
							led <= 4'b0100;
								if(cnt == T)
									cstate <= S_led3_on;
								else
									cstate <= cstate;
						end
			S_led3_on : begin
							led <= 4'b1000;
								if(cnt == T)
									cstate <= S_led0_on;
								else
									cstate <= cstate;
						end		
			default:	begin
							led <= 4'b0001;
								if(cnt == T)
									cstate <= S_led1_on;
								else
									cstate <= cstate;
						end	
		endcase	
end

endmodule

好的状态机标准

好的状态机的标准很多,最重要的几个方面如下:
第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义:其一要求该FSM的综合实现结果无毛刺等异常扰动;其二要求FSM要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态。
第二,状态机的设计要满足设计的面积和速度的要求。
第三,状态机的设计要清晰易懂、易维护。

二段式、三段式以及激励文件,后续补上。
二段式、三段式代码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA状态机可以用来实现交通信号灯的控制。在FPGA中,可以使用VHDL或Verilog描述状态机,并将其实现在FPGA芯片上。 根据引用中的描述,交通信号灯的状态可以用有限状态机的原理来表示。状态机由不同的状态状态之间的转换条件组成。在交通灯的例子中,常见的状态有红灯、绿灯和黄灯。每个状态对应着交通灯的不同亮灯状态FPGA状态机的描述可以采用不同的方式。根据引用提供的信息,可以采用一段式状态机、二段式状态机或三段式状态机。 在一段式状态机中,状态转移只涉及时序电路,没有竞争冒险,并且消耗的逻辑较少。 在二段式状态机中,采用两个always模块来描述状态转移。一个always模块用于同步时序逻辑描述状态转移,另一个always模块用于组合逻辑判断状态条件转移。需要注意的是,组合逻辑电路可能会导致竞争冒险现象。 而在三段式状态机中,采用三个always模块来描述状态转移。第一个always模块采用同步时序逻辑描述状态转移,第二个always模块采用组合逻辑描述状态转移规律,第三个always模块描述电路的输出。三段式状态机可以避免组合逻辑的竞争与冒险,并且输出信号经过寄存器缓存后再输出,以消除电路毛刺。 综上所述,在FPGA中实现交通信号灯的状态机可以采用一段式、二段式或三段式的方式来描述状态转移和输出。具体的实现方法可以根据需求和设计要求进行选择和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值