[Verilog][初学]语法基础(6)有限状态机(FSM)

做一些关于Verilog的简要笔记,方便日后快速复习,如有错漏希望您能够不吝赐教

首先从宏观去理解什么状态机,我就以原子哥的Moore状态机的框图为例讲解:
在这里插入图片描述

显然,由输入当前状态的组合逻辑我们可以得到下一状态,并通过激励信号送至状态寄存器进行存储,最后由当前状态的组合逻辑产生输出。
然后我们再看看Mealy状态机:
在这里插入图片描述

显然它和Moore区别在于它是由当前状态以及输入的组合逻辑产生输出。
那么如何创建状态机?原子哥给了四段论。

1. 定义状态空间
状态空间的定义用parameter关键字实现,状态寄存器用reg关键字定义。
下面是用独热码定义的状态空间和相应状态寄存器。

parameter A	 = 4'B0001;
parameter B  = 4'B0010;
parameter C  = 4'B0100;
parameter D  = 4'B1000;		//定义ABCD四个状态

reg	[3:0]	current_state;	//记录当前状态
reg [3:0]	next_state;		//记录下一状态

2. 状态跳转(时序逻辑)
首先明确,状态跳转属于时序逻辑,需要在跳变沿过程中执行跳转。那么常见的就是always语句,且需要使用非阻塞赋值。

always @(posedge clk or negedge rst_n)begin
	if(!rst_n)
		current_state <= A;
	else
		current_state <= next_state;
end

3. 下一个状态判断(组合逻辑)
这部分相当于框图中的的第一个组合逻辑判断。

always @(*)begin
	case(current_state)
		A:	begin
			if(input == 4'B1111)
				next_state = B;
			else
				next_state = A;
		end
		B:	begin
			...
		end
		C:...
		D:...
		default:...		
	endcase
end

4. 各个状态下的动作(组合逻辑)
这部分可以使用组合逻辑也可以用时序逻辑,看情况使用。
通常情况下使用的是时序逻辑,写法类似上述第三部分。
但有的时候也会使用时序逻辑,具体来说就是在定义状态寄存器的同时,也同样定义输出寄存器,然后将结果存入输出寄存器,然后。这样做有如下优势:
①有效滤去组合逻辑输出的毛刺。
②使总线数据对齐,降低失误率。
其框图如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值