有限状态机 FSM——Finite State Machine
有限状态机
- 1.状态机的结构
- 2.Mealy状态机和Moore状态机
- 3.用Verilog来描述可综合的状态机
- 实例
- 序列检测器
- ADC采样控制电路
- 按键消抖
1.状态机的结构
其中F和G是两个有关状态的函数,状态寄存器一般是采用正跳边沿触发的D触发器,n个触发器最多记住2^n个状态。
2.Mealy状态机和Moore状态机
上图是Mealy状态机,其输出不仅取决于当前状态还受输入的影响,Moore状态机的输出仅取决于当前状态。
3.用Verilog来描述可综合的状态机
二进制编码:所需寄存器数量少,但是用的组合逻辑多;
独热码:占用寄存器数量多,速度快,每次仅需判断一位,组合逻辑少;
格雷码:按顺序每次只变化一位的话,就用格雷码;
4个数,
二级制:00 01 10 11;
独热码:0001 0010 0100 1000;
寄存器数量多了,可能会有多余状态,记得添加default语句;
一般的三段式状态机:
- 写出状态转移逻辑;
- 时钟状态,复位信号;
- 输出赋值;
实例
序列检测器
检测输入为1101 ,每次输入一位din
module seq_det(input clk,input rst,input din,output reg out
);
parameter idle = 5'd0,s1 = 5'd1,s2 = 5'd2,s3 = 5'd3,s4 = 5'd4;
reg[2:0] cur_state;
reg[2:0] next_state;always@(posedge clk,posedge rst)
beginif(rst)cur_state<=5'd0;elsecur_state<=next_state;
endalways@(*)
begincase(cur_state)idle:if(din==1'b1)next_state=s1;elsenext_state=idle;s1:if(din==1'b1)next_state=s2;elsenext_state=idle;s2:if(din==1'b0)next_state=s3;elsenext_state=s2;s3:if(din==1'b1)next_state=s4;elsenext_state=idle;s4:if(din==1'b1)next_state=s1;elsenext_state=idle;default:next_state=idle;endcase
always@(*)beginif(cur_state==s4)sout=1'b1;elsesout=1'b0;endendmodule
ADC采样控制电路
ADC:模数转换,将模拟信号变成数字信号,便于数字设备处理。
其中ale 是模拟端的输入选通信号,start为启动信号,eoc是转换进行中信号,转换结束oe输出使能端有效;
module adc_trans(input clk,rst,input start,eoc,input[7:0] data,output ale,oe,output [2:0]addr
);parameter idle =2'b00,s1 =2'b01,s2 =2'b10,s3 =2'b11;
reg [1:0] cur_state,next_state;
always@(posedge clk,posedge rst)beginif(rst)cur_state<=idle;elsecur_state<=next_state;
endalways@(*)begincase(cur_state)idle:ale=0;start=0;oe=0;next_state=s1;s1:ale=1;start=1;oe=0;next_state=s2;s2:ale=0;start=0;oe=0;if(eoc==1)next_state=s3;elsenext_state=s2;s3:ale=0;start=0;oe=1;next_state=idle;endcase
endendmodule
按键消抖
按键消抖的原因和原理不多赘述,直接写主要就是状态机的转换,理解了这一点就可以了。
由于这里的输入信号key_in 是异步信号,不依赖于clk;不处理会出现时序违例,常见方法是直接打两拍;
边沿检测:
检测上升下降沿的原理就是利用了寄存器当前状态的输入即为下一时钟的输出;
若现在为0,下一时刻为1,就是上升沿;
若现在为1,下一时刻为0,就是下降沿;
always@(posedge clk,posedge rst)beginif(rst)key_in_edge_tem1<=1'b0;key_in_edge_tem2<=1'b0;elsekey_in_edge_tem1<=key_instable;key_in_edge_tem2<=key_in_edge_tem1;
end
assign nedge=!(key_in_edge_tem1)&&(key_in_edge_tem2); //1到0 下降沿
assign pedge=(key_in_edge_tem1)&&!(key_in_edge_tem2); //0到1 上升沿
整体的代码,其中key_flag key_state 可以不管,只是为了反馈状态添加的;方便判断状态
module debounce(input clk,input rst,input key_in,output reg key_flag, //flag 代表 f的状态; 在f1/f2 flag为1,其他状态为0output reg key_state //state 代表在f1 :0 or f2:1
);
//其中Key_flag为是否稳定按下的标志,key_state为按下/释放的标志
reg key_in_1;
reg key_in_2;
reg key_in_stable;
reg key_in_edge_tem1;
reg key_in_edge_tem2;
wire pedge;
wire nedge;
reg[18:0] cnt; //2^19*50MHz ==10.48576ms
reg cnt_en;
reg cnt_full;
parameter idle =2'd0,f1 =2'd1,down =2'd2,s2 =2'd3;
reg [1:0] state;
reg [1:0] n_state;///===========================input reg==================================
always@(posedge clk,posedge rst)beginif(rst)key_in_1<=1'b0;key_in_2<=1'b0;elsekey_in_1<=key_in;key_in_2<=key_in_1;
end
assign key_in_stable=key_in_2;///============================detect egde============================
always@(posedge clk,posedge rst)beginif(rst)key_in_edge_tem1<=1'b0;key_in_edge_tem2<=1'b0;elsekey_in_edge_tem1<=key_instable;key_in_edge_tem2<=key_in_edge_tem1;
end
assign nedge=!(key_in_edge_tem1)&&(key_in_edge_tem2); //1到0 下降沿
assign pedge=(key_in_edge_tem1)&&!(key_in_edge_tem2); //0到1 上升沿///=============================cnt==================================
always@(posedge clk,posedge rst)beginif(rst)cnt<=19'b0;else(cnt_en)cnt<=cnt+1'b1;elsecnt<= 19'b0;
end
always@(posedge clk,posedge rst)beginif(rst)cnt_full<=1'b0;else if(cnt==19'h7FFFF)cnt_full<=1'b1;elsecnt_full<=1'b0;
end
///=============================fsm================================
always@(posedge clk,posedge rst)beginif(rst)state<=idle;elsestate<=n_state;
end
always@(*)begincase(state)idle:beginif(nedge)n_state=f1;cnt_en=1'b1;elsen_state=idle;endf1:beginif(pedge)n_state=idle;cnt_en=1'b0;else if(cnt_full)key_flag=1'b1;key_state=1'b0;n_state=down;cnt_en=1'b0;elsen_state=f1;enddown:begin key_flag=1'b0; //只保持一个时钟周期的高脉冲if(pedge)n_state=f2;cnt_en=1'b1;elsen_state=down;endf2:if(nedge)cnt_en=1'b0;n_state=down;else if(cnt_full)n_state=idle;cnt_en=1'b0;key_flag=1'b1;key_state=1'b1;elsen_state=f2;default :key_flag=1'b0;key_state=1'b1;cnt_en=1'b0;state=idle;
endcase
endmodule
有限状态机 FSM——Finite State Machine相关推荐
- 有限状态机FSM(finite state machine) 二
有限状态机FSM(finite state machine) 二 延续上一篇继续有限状态机 上一篇中的状态切换判断是在每一个状态类的 OnExecute 方法中各种 if else 硬编码逻辑 当状态 ...
- 有限状态机FSM(finite state machine) 一
有限状态机FSM(finite state machine) 一 有限状态机又称有限自动状态机,它拥有有限数量的状态,每个状态代表不同的意义,每个状态可以切换到 零-多 个状态.任意时刻状态机有且只能 ...
- 有限状态机FSM(Finite State Machine)及实现方式介绍(转)
原文:https://www.cnblogs.com/barrywxx/p/12860573.html 一.为什么引入有限状态机? 最近做一个项目,项目中很多实体(Entity),每个实体都有很多状态 ...
- 【决策状态机FSM(finite state machine)梳理】
背景:写论文需要,对需要有限状态机部分进行整理.论文内容是关于自动驾驶避撞决策. 参考Junior: The Stanford Entry in the Urban Challenge的有限状态机 1 ...
- 计算机态,(计算机)有限态自动机,FSM(finite state machine),音标,读音,翻译,英文例句,英语词典...
补充资料:ω-有限自动机 ω-有限自动机 ω-finite state automata 1094·.一youx一anz}dongJ-..有限自动机(.一rinite state automata)一 ...
- FSM(Finite State Machine,有限状态机)设计
有限状态机(Finite State Machine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机.Moore型状态机输出仅仅与现态有关和Mealy型状态机 ...
- 《计算机组成与CPU设计实验》5有限状态机的Verilog HDL描述(Finite State Machine,FSM)
多数控制逻辑都可以用有限状态机描述 状态机 状态机是组合逻辑和时序逻辑的特殊组合 时序逻辑用于存储状态 组合逻辑用于产生次态和产生输出 状态的数量是有限的,故称为有限状态机(Finite State ...
- 证明与计算(7): 有限状态机(Finite State Machine)
什么是有限状态机(Finite State Machine)? 什么是确定性有限状态机(deterministic finite automaton, DFA )? 什么是非确定性有限状态机(nond ...
- 【FPGA入门教程】(七)FSM(Finite State Machine,有限状态机)设计
FPGA设计中,最重要的设计思想就是状态机的设计思想!状态机的本质就是对具有逻辑顺序和时序规律的事件的一种描述方法,它有三个要素:状态.输入.输出:状态也叫做状态变量(比如可以用电机的不同转速作为状态 ...
最新文章
- 查看linux虚拟机信息,虚拟机:Linux查看线程信息的步骤
- 【深度学习之美】卷地风来忽吹散,积得飘零美如画(入门系列之十)
- 神策数据张涛:如何让用户标签价值落地?
- 【Python】一道题吃够Python语法糖
- C#中对象的序列化与反序列化
- HTML鼠标悬停图片置顶,jquery实现鼠标悬浮停止轮播特效
- 这段iframe代码可以盖住dropdownlist
- Python实现SIFT算法,附详细公式推导和代码
- 天猫、抖音各大电商平台关键词调用、价格监控、竞价API
- 在 COMSOL 中模拟地震波的传播
- 亚马逊aws申请ses邮件推送攻略
- PeopleSoft
- VS2019 测试使用libusb
- 英特尔oneAPI---跨架构实现高效率
- vue .sync 用法
- vb.net 教程 序
- 黑猫带你学UFS协议第11篇:两万字详解UFS协议信息单元(UPIU)
- CAS-自定义CAS Server端登录页面
- 详解eMMC的前世今生和优劣势
- JQuery使用Datatable插件(二)——使用AJAX与后端交互