【IC设计】ICer‘s 乾坤大挪移——FSM状态机

目录

    • 理论解读
      • 状态机定义
      • 状态转移图
      • Mealy和Moore型状态机
      • 推荐写“新两段式状态机”
    • 设计实战
      • 可乐机
      • 两种state的FSM(异步复位)
      • 4种状态的one-hot状态机
      • 4种状态的同步复位状态机
      • 蓄水池问题
    • 参考链接

理论解读

状态机定义

  • 状态机简写为 FSM(Finite State Machine),也称为同步有限状态机,简称为状态机,“同步”是指状态机中所有的状态跳转都是在时钟的作用下进行,而“有限”是指状态的个数是有限的。
  • 状态机是时序逻辑电路中非常重要的一个应用,常在大型复杂的系统中使用较多。
  • 为清晰表达出状态和状态跳转的条件,有必要绘制状态转移图!
  • 写好状态机的三个关键步骤:

1、从实际问题中抽象出状态转移图
2、绘制状态转移图
3、根据状态转移图来设计代码

状态转移图

  • 状态转移图需要表达的信息:各状态之间的功能、跳转的条件、输入输出

1、每个椭圆的框表示一个状态
2、每个状态之间都有一个指向的箭头,表示的是状态跳转的过程
3、箭头上有标注的一组数字,“/”左边表达的是状态的输入,“/”右边表达的是状态的输出

1、输入:根据输入可以确定是否需要进行状态跳转以及输出,是影响状态机系统执行过程
的重要驱动力;
2、输出:根据当前时刻的状态以及输入,是状态机系统最终要执行的动作;
3、状态:根据输入和上一状态决定当前时刻所处的状态,是状态机系统执行的一个稳定的
过程。

  • 示例:可乐机

1、输入:投入 1 元硬币;
2、输出:出可乐、不出可乐;
3、状态:可乐机中有 0 元、可乐机中有 1 元、可乐机中有 2 元、可乐机中有 3 元。

Mealy和Moore型状态机

  • 共同点:状态的跳转都只和输入有关
  • 最后的输出和当前状态、输入有关,称为 Mealy 状态机(状态数最少),推荐
    在这里插入图片描述
  • 最后的输出和当前状态有关、与输入无关,则称为 Moore 型状态机
    在这里插入图片描述

推荐写“新两段式状态机”

  • 状态机按写法可分为:一段式、二段式、三段式

一段式指的是在一段状态机中使用时序逻辑既描述状态的转移,也描述数据的输出
二段式指在第一段状态机中使用时序逻辑描述状态转移,在第二段状态机中使用组合逻辑描述数据的输出
三段式指在第一段状态机中采用时序逻辑描述状态转移,在第二段在状态机中采用组合逻辑判断状态转移条件描述状态转移规律,在第三段状态机中描述状态输出,可以用组合电路输出,也可以时序电路输出

一段式在描述大型状态机时比较困难,不够清晰;
二段式状态机其结构与理想理论模型吻合,不会有附加的结构存在。 但是由于二段状态机的第二段是组
合逻辑描述数据的输出,所以有一些情况是无法描述的,比如输出时需要类似计数的累加情况,这种情况在组合逻辑中会产生自迭代,自迭代在组合逻辑电路中是严格禁止的,而且第二段状态机主要是描述数据的输出,输出时使用组合逻辑往往会产生更多的毛刺,所以并不推荐
三段式状态机的第一段状态机是用时序逻辑描述当前状态,第二段状态机是用组合逻辑描述下一状态,

  • 新两段式状态机(本质是合并三段式的第一、二段,第三段不变):

在第一段状态机中:采用时序逻辑描述状态转移+在状态机中采用组合逻辑判断状态转移条件,描述状态转移规律
在第二段状态机中:描述状态输出,可以用组合电路输出,也可以时序电路输出

  • 使用两个均采用时序逻辑的 always 块:

1、第一个 always 块描述状态的转移为第一段状态机,第二个 always 块描述数据的输出为第二段状态机
2、如果我们遵循一个 always 块只描述一个变量的原则,如果有多个输出时第二段状态机就可以分为多个
always 块来表达,但理论上仍属于新二段状态机,所以几段式状态机并不是由 always 块的数量简单决定的

设计实战

可乐机

  • 状态转移图
    在这里插入图片描述
  • 代码设计
module simple_fsm (input wire sys_clk , //系统时钟 50MHzinput wire sys_rst_n , //全局复位input wire pi_money , //投币方式可以为:不投币(0)、投 1 元(1)output reg po_cola //po_cola 为 1 时出可乐,po_cola 为 0 时不出可乐); //********************************************************************////****************** Parameter and Internal Signal *******************////********************************************************************////parameter define//只有三种状态,使用独热码parameter IDLE = 3'b001;parameter ONE = 3'b010;parameter TWO = 3'b100;//reg definereg [2:0] state ;
//********************************************************************//
//***************************** Main Code ****************************//
//********************************************************************////第一段状态机,描述当前状态 state 如何根据输入跳转到下一状态
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)state <= IDLE; //任何情况下只要按复位就回到初始状态else case(state)IDLE : if(pi_money == 1'b1) //判断输入情况state <= ONE;elsestate <= IDLE;ONE : if(pi_money == 1'b1)state <= TWO;elsestate <= ONE;TWO : if(pi_money == 1'b1)state <= IDLE;elsestate <= TWO;//如果状态机跳转到编码的状态之外也回到初始状态default: state <= IDLE;endcase//第二段状态机,描述当前状态 state 和输入 pi_money 如何影响 po_cola 输出
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)po_cola <= 1'b0;else if((state == TWO) && (pi_money == 1'b1))po_cola <= 1'b1;elsepo_cola <= 1'b0;endmodule

两种state的FSM(异步复位)

实现下图所示的摩尔状态机,复位为异步复位。
在这里插入图片描述
代码实现:

module top_module(input clk,input areset,    // Asynchronous reset to state Binput in,output out);//  parameter A=0, B=1; reg state, next;// State transition logicalways@(*)begin    // This is a combinational always blockcase(state)A: next = in ? A : B;B: next = in ? B : A;endcaseend// State flip-flops with asynchronous resetalways @(posedge clk or posedge areset) begin    // This is a sequential always blockif(areset == 1'b1)beginstate <= B;end else beginstate <= next;endend// Output logicassign out = (state == B);endmodule
//写法2
module top_module(clk, reset, in, out);input clk;input reset;    // Synchronous reset to state Binput in;output out;//  reg out;// Fill in state name declarationsparameter A=0, B=1; reg state, next_state;always @(*) begin    // This is a combinational always blockcase(state)     // State transition logicA:beginif( in == 1'b1 )next_state <= A;elsenext_state <= B;   end    B:beginif( in == 1'b1 )next_state <= B;elsenext_state <= A;   endendcaseendalways @(posedge clk) begin    // This is a sequential always blockif(reset)state <= B;elsestate <= next_state;// State flip-flops with asynchronous resetend// Output logicassign out = (state == B);endmodule
  • 验证结果
    在这里插入图片描述

4种状态的one-hot状态机

  • 实现下面的摩尔状态机,下表是状态转移图,一输入一输出四状态。使用以下 one-hot 状态编码:A=4’b0001, B=4’b0010, C=4’b0100, D=4’b1000。
    在这里插入图片描述
  • 代码设计
module top_module(input in,input [3:0] state,output [3:0] next_state,output out); //parameter A=0, B=1, C=2, D=3;// State transition logic: Derive an equation for each state flip-flop.assign next_state[A] = state[A]&(~in) | state[C]&(~in);assign next_state[B] = state[A]&(in)  | state[B]&(in) | state[D]&(in);assign next_state[C] = state[B]&(~in) | state[D]&(~in);assign next_state[D] = state[C]&(in)  ;// Output logic: assign out = state[D];endmodule

4种状态的同步复位状态机

实现下面的摩尔状态机,状态转移图同上,一输入一输出四状态。

  • 代码设计
module top_module(input clk,input in,input reset,output out); //reg [1:0] state, next_state;parameter A=2'd0, B=2'd1, C=2'd2, D=2'd3;// State transition logicalways@(*)begincase(state)A: next_state = in ? B : A;B: next_state = in ? B : C;C: next_state = in ? D : A;D: next_state = in ? B : C;endcaseend// State flip-flops with synchronous resetalways@(posedge clk)beginif(reset == 1'b1)beginstate <= A;end else beginstate <= next_state;end    end// Output logicassign out = (state==D);
endmodule

蓄水池问题

一个巨大的蓄水池供几个用户使用。为了保持足够高的水位,三个传感器以5英寸的间隔垂直放置。当水位高于最高传感器(S3)时,输入流量应为零。当液位低于最低传感器(S)时,流量应处于最大值(公称流量阀和辅助流量阀都打开)。当水位位于上下传感器之间时,流量由两个因素决定:水位和上次传感器更每个水位都有一个与之相关的标称流量,如下表所示。如果传感器换之前的水位。的变化表明前一个液位低于当前液位,则应采用标称流量。如果前一个液位高于当前液位,则应通过打开补充流量阀(由AFR控制)来增加流量。绘制水库控制器的摩尔模型状态图。清楚地指示每个状态的所有状态转换和输出。FSM的输入是Sy、S2和S3;输出是FR1、FR2、FR3和AFR。

在这里插入图片描述

参考链接

  1. 【野火】FPGA系列教学视频,真正的手把手教学,“波形图”教学法,现场画波形图写代码,硬件基于野火FPGA EP4CE10征途系列开发板,已完结
  2. Verilog零基础入门(边看边练)北京交通大学 李金城
  3. 《CMOS模拟集成电路全流程设计》 李金城 机械工业出版社

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python3 索引下标及切片完全指南

介绍 Python 字符串数据类型是由一个或多个字符组成的序列&#xff0c;可以包含字母、数字、空格字符或符号。由于字符串是一个序列&#xff0c;我们可以通过索引和切片的方式访问它&#xff0c;就像访问其他基于序列的数据类型一样。 本教程将指导您通过索引访问字符串&…

网络攻击与检测防御:维护数字安全的关键挑战

随着数字化时代的深入&#xff0c;网络攻击已成为企业和个人面临的严峻挑战之一。本文将深入探讨不同类型的网络攻击&#xff0c;以及有效的检测和防御策略&#xff0c;以确保网络系统的安全性和稳定性。 1. 常见网络攻击类型&#xff1a; DDoS 攻击&#xff1a;分布式拒绝服…

IOC之Spring统一资源加载策略

前言 在学 Java的时候&#xff0c;我们学习了一个标准类 java.net.URL&#xff0c;该类在 Java SE 中的定位为统一资源定位器&#xff08;Uniform Resource Locator&#xff09;&#xff0c;但是我们知道它的实现基本只限于网络形式发布的资源的查找和定位。然而&#xff0c;实…

生成式对抗网络GAN

Generative Adversarial Nets由伊恩古德费洛&#xff08;Ian J.Goodfellow&#xff09;等人于2014年发表在Conference on Neural Information Processing Systems (NeurIPS)上。NeurIPS是机器学习和计算神经科学领域的顶级国际学术会议之一。 1. GAN在哪些领域大放异彩 图像生…

黑马苍穹外卖学习Day6

HttpClient 介绍 HttpClient 是 Apache 提供的一个开源的 Java HTTP 客户端库&#xff0c;用于发送 HTTP 请求和处理 HTTP 响应。它提供了一种更简便的方式来执行 HTTP 请求&#xff0c;并支持多种协议&#xff0c;如 HTTP、HTTPS、FTP 等。 使用 HttpClient 可以方便地与远程…

MySQL体系结构

MySQL体系结构 MySQL采用的是客户/服务器体系结构&#xff0c;实际是有两个程序&#xff0c;一个是MySQL服务器程序&#xff0c;指的是mysqld程序&#xff0c;运行在存放数据库的机器上&#xff0c;负责在网络上监听并处理来自客户的服务请求&#xff0c;根据这些请求去访问数据…

边缘计算的挑战和机遇(结合RDH-EI)

边缘计算的挑战和机遇 边缘计算面临着数据安全与隐私保护、网络稳定性等挑战&#xff0c;但同时也带来了更强的实时性和本地处理能力&#xff0c;为企业降低了成本和压力&#xff0c;提高了数据处理效率。因此&#xff0c;边缘计算既带来了挑战也带来了机遇&#xff0c;需要我…

Unity之物理系统

专栏的上一篇角色控制器控制角色移动跳崖&#xff0c;这一篇来说说Unity的物理系统。 本篇小编还要带大家做一个碰撞检测效果实例&#xff0c;先放效果图&#xff1a;流星撞击地面产生爆炸效果 一、Rigidbody 我们给胶囊添加了 Rigidbody 组件它才有的重力&#xff0c;我们来…

逸学Docker【java工程师基础】3.3Docker安装nacos

docker pull nacos/nacos-server docker network create nacos_network #创建容器网络 docker run -d \ --name nacos \ --privileged \ --cgroupns host \ --env JVM_XMX256m \ --env MODEstandalone \ --env JVM_XMS256m \ -p 8848:8848/tcp \ -p 9848:9848…

图解拒付平台:如何应对用户的拒付

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;5&#xff09;篇。 本章主要讲清楚支付系统中拒付涉及的基本概念&#xff0c;产品架构、系统架构&#xff0c;以及一些核心的流程和相关领域模型、状态机设计等。 1. 前言 拒付在中国比较少见&#xff0c;但…

教你用五步让千年的兵马俑跳上现代的科目三?

以下是一张我上月去西安拍的兵马俑照片&#xff1a; 使用通义千问&#xff0c;5步就能它舞动起来&#xff0c;跳上现在流行的“科目三”舞蹈。 千年兵马俑跳上科目三 全民舞王 第1步 打开通义千问App&#xff0c;我使用的是华为手机&#xff0c;苹果版的没试&#xff1b; 在…

把握现货黄金的基本操作技巧

在投资市场这个大舞台上&#xff0c;有各种各样的投资产品供投资者选择&#xff0c;其中黄金作为一种重要的投资资产&#xff0c;一直受到广大投资者的青睐。然而&#xff0c;黄金交易并非易事&#xff0c;需要掌握一定的操作技巧。那么&#xff0c;如何才能把握住现货黄金的操…

YOLOv5改进 | 主干篇 | 12月份最新成果TransNeXt特征提取网络(全网首发)

一、本文介绍 本文给大家带来的改进机制是TransNeXt特征提取网络,其发表于2023年的12月份是一个最新最前沿的网络模型&#xff0c;将其应用在我们的特征提取网络来提取特征&#xff0c;同时本文给大家解决其自带的一个报错&#xff0c;通过结合聚合的像素聚焦注意力和卷积GLU&…

《绝地求生》职业选手画面设置推荐 绝地求生画面怎么设置最好

《绝地求生》画面怎么设置最好是很多玩家心中的疑问&#xff0c;如果性能不是问题无疑高特效显示效果更好&#xff0c;但并不是所有画面参数都利于战斗&#xff0c;今天闲游盒带来分享的《绝地求生》职业选手画面设置推荐&#xff0c;赶紧来看看吧。 当前PUBG的图像设置的重要性…

彝族民居一大特色——土掌房

彝族民居一大特色——土掌房在彝区&#xff0c;各地、各支系传承的居室建筑形式是多种多样的&#xff0c;并与当地的居住习俗有密切关联&#xff0c;从村寨的聚落到住宅的地址&#xff1b;从房间的分置到什物的堆放&#xff1b;从建筑结构到民居信仰和禁忌&#xff0c;都表现出…

Linux知识(未完成)

一、Linux 1.1 Linux 的应用领域 1.1.1 个人桌面领域的应用 此领域是 Linux 比较薄弱的环节但是随着发展&#xff0c;近几年 linux 在个人桌面领域的占有率在逐渐提高 1.1.2 服务器领域 linux 在服务器领域的应用是最高的 linux 免费、稳定、高效等特点在这里得到了很好的…

探寻爬虫世界01:HTML页面结构

文章目录 一、引言&#xff08;一&#xff09;背景介绍&#xff1a;选择爬取51job网站数据的原因&#xff08;二&#xff09;目标与需求明确&#xff1a;爬取51job网站数据的目的与用户需求 二、网页结构探索&#xff08;一&#xff09;51job网页结构分析1、页面组成&#xff1…

【Nuxt3】nuxt3目录文件详情描述:.nuxt、.output、assets、public、utils(一)

简言 nuxt3的中文网站 上次简单介绍了nuxt3创建项目的方法和目录文件大概用处。 这次详细说下.nuxt、.output、assets、public、utils五个文件夹的用处。 正文 .nuxt Nuxt在开发中使用.nuxt/目录来生成你的Vue应用程序。 为了避免将开发构建的输出推送到你的代码仓库中&…

博客摘录「 性能优化:__builtin_expect详解」2024年1月15日

性能优化&#xff1a;__builtin_expect详解___builtin_expect对性能的影响-CSDN博客https://blog.csdn.net/chudongfang2015/article/details/75710848 #define LIKELY(x) __builtin_expect(!!(x), 1) __builtin_expect宏定义中为何写成!!(x)&#xff1f; 首先__buildin_expec…

从零开发短视频电商 PaddleOCR Java推理 (四)优化OCR工具类

从零开发短视频电商 PaddleOCR Java推理 &#xff08;四&#xff09;优化OCR工具类 参考&#xff1a;https://github.com/mymagicpower/AIAS/blob/9dc3c65d07568087ac71453de9070a416eb4e1d0/1_image_sdks/ocr_v4_sdk/src/main/java/top/aias/ocr/OcrV4RecExample.java import …