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

news2024/11/19 14:43:44

目录

    • 理论解读
      • 状态机定义
      • 状态转移图
      • 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 , //系统时钟 50MHz
	input 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 define
 reg [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;
		else
			state <= IDLE;
	ONE : if(pi_money == 1'b1)
			state <= TWO;
		else
			state <= ONE;
	TWO : if(pi_money == 1'b1)
			state <= IDLE;
		else
			state <= 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;
 	else
 		po_cola <= 1'b0;
 
 endmodule

两种state的FSM(异步复位)

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

module top_module(
    input clk,
    input areset,    // Asynchronous reset to state B
    input in,
    output out);//  

    parameter A=0, B=1; 
    reg state, next;
    
    // State transition logic
    always@(*)begin    // This is a combinational always block
        case(state)
			A: next = in ? A : B;
			B: next = in ? B : A;
        endcase
    end

    // State flip-flops with asynchronous reset
    always @(posedge clk or posedge areset) begin    // This is a sequential always block
        if(areset == 1'b1)begin
            state <= B;
        end else begin
            state <= next;
        end
    end

    // Output logic
    assign out = (state == B);

endmodule
//写法2
module top_module(clk, reset, in, out);
    input clk;
    input reset;    // Synchronous reset to state B
    input in;
    output out;//  
    reg out;

    // Fill in state name declarations
    parameter A=0, B=1; 
    reg state, next_state;

 	always @(*) begin    // This is a combinational always block
        case(state)     // State transition logic
            A:begin
            if( in == 1'b1 )
                next_state <= A;
            else
                next_state <= B;   
            end    
            B:begin
            if( in == 1'b1 )
                next_state <= B;
            else
                next_state <= A;   
            end
        endcase
    end

    always @(posedge clk) begin    // This is a sequential always block
        if(reset)
            state <= B;
        else
            state <= next_state;// State flip-flops with asynchronous reset
    end

    // Output logic
     assign 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 logic
    always@(*)begin
        case(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;
        endcase
    end
    // State flip-flops with synchronous reset
    always@(posedge clk)begin
        if(reset == 1'b1)begin
            state <= A;
        end else begin
            state <= next_state;
        end    
    end
    // Output logic
    assign out = (state==D);
endmodule

蓄水池问题

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

在这里插入图片描述

  • 代码设计
module top_module (
    input clk,
    input reset,
    input [3:1] s,
    output fr3,
    output fr2,
    output fr1,
    output dfr
); 
    reg [3:0] state, next_state;
    parameter in0=4'b111_1, in1=4'b011_0, in1_1=4'b011_1, in2=4'b001_0, in2_1=4'b001_1, in3=4'b000_0;
    always@(*)begin
        case(state)
            in0  : next_state = s[1] ? in1 : in0;	  //111_1  
            in1  : next_state = s[2] ? in2 : (s[1] ? in1  : in0);//011_0
            in1_1: next_state = s[2] ? in2 : (s[1] ? in1_1: in0);//011_1
            in2  : next_state = s[3] ? in3 : (s[2] ? in2  : in1_1);//001_0
            in2_1: next_state = s[3] ? in3 : (s[2] ? in2_1: in1_1);//001_1            
            in3  : next_state = s[3] ? in3 : in2_1;  	  //000_0           
            default: ;
        endcase
    end
    
    always@(posedge clk)begin
        if(reset == 1'b1)begin
            state <= in0;
        end else begin
            state <= next_state;
        end
    end
    
   assign {fr3,fr2,fr1,dfr} = state;    
 /*       always @(*)begin
        case(state)
            in0  :{fr3,fr2,fr1,dfr} = 4'b111_1;
            in1  :{fr3,fr2,fr1,dfr} = 4'b011_0;
            in1_1:{fr3,fr2,fr1,dfr} = 4'b011_1;
            in2  :{fr3,fr2,fr1,dfr} = 4'b001_0;
            in2_1:{fr3,fr2,fr1,dfr} = 4'b001_1;
            in3  :{fr3,fr2,fr1,dfr} = 4'b000_0;
            default:{fr3,fr2,fr1,dfr} = 'x;
        endcase
    end*/

endmodule
  • RTL图
    在这里插入图片描述

  • 状态转移图
    在这里插入图片描述

  • 验证结果
    在这里插入图片描述

参考链接

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

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

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

相关文章

基于域账户及西门子simatic logon的集中权限管理的实现(二)

上次我们完成了域环境及simatic logon服务器的搭建&#xff0c;今天我们将在wincc及HMI上进行组态&#xff0c;实现用域账户进行登录。 3.WINCC用户管理组态引文&#xff1a;博途工控人平时在哪里技术交流博途工控人社群 3.1 首先将要安装WINCC的服务器加入域。 3.2 在wincc…

SQL Server Management Studio (SSMS) 备份数据库

文章目录 前言一、在界面上操作二、使用sql 代码操作总结 前言 之前的文章记录过如何使用sqlserver复制远程数据库到本地。这里补充下如何使用SQL Server Management Studio (SSMS) 备份。 传送门&#xff1a;sqlserver复制远程数据库到本地 一、在界面上操作 在 SQL Server …

MyTinySTL 简单分析(二)--util.h exceptdef.h

目前在学习STL&#xff0c;看到一个开源的项目MyTinySTL&#xff0c;非常不错。想着照着这个代码自己敲一遍应该也能有些进步。然后就开始了学习过程。 首先分析的是vector 以下是由vector.h关联的所有头文件 本篇分析一下util.h &#xff0c; xxx 这里先来研究几个函数 st…

酒店订房小程序源码系统:帮您打造类似美团的酒店模式的小程序 带完整的安装部署教程

随着移动互联网的快速发展&#xff0c;小程序已经成为一种新型的应用形态&#xff0c;为各大行业提供了更加便捷的服务。其中&#xff0c;酒店预订小程序作为一种方便快捷的预订方式&#xff0c;备受用户青睐。小编给大家分享一款酒店订房小程序源码系统&#xff0c;旨在帮助您…

Ubuntu20.04-剪贴板

针对图形界面用户 1.两种方式 1.1 安装Parcellite 简单轻量级剪贴板管理器 sudo apt install parcellite 1.2 安装Gpaste 更强大的剪贴板管理器&#xff0c;包含历史记录和同步功能 sudo apt install gpaste

参加数据库活动,学习知识,领取奖品

去年12月1日我发了一篇关于数据库高可用的文章《我们的数据库需要什么样的HA&#xff1f;》&#xff0c;文中介绍了阿里云PolarDB MySQL通过了热备无感秒切技术&#xff0c;解决了HA场景下的故障探测、切换速度和切换体验的问题。文末提到了线上的PolarDB功能体验馆&#xff0c…

汽车研发测试大全

车研发中需要做的试验&#xff0c;这些试验都是保证我们的车能安全、稳定、可靠行驶的必要条件。主要包含以下内容&#xff1a; 一、整车试验项目 1.1整车可靠性试验 1.2 NVH试验 1.3 HVAC试验 1.4 EMC试验 1.5 化学分析试验 1.6 整车道路性能试验 二、零部件试验项目 …

特征工程之降维算法

数据降维简介 数据降维即对原始数据特征进行变换,使得特征的维度减少。 依据降维过程是否可以用一个线性变换表示,降维算法可以分为线性降维算法和非线性降维算法,下图展示了各种降维算法及其类别: 降维的必要性: 多重共线性和预测变量之间相互关联。多重共线性会导致解空…

【架构】docker实现集群主从扩容【案例3/4】

实现集群主从扩容 当整个集群扛不住流量的情况时&#xff0c;需要给集群扩容增加设备&#xff0c;由3主3从&#xff0c;扩为4主4从。实现&#xff1a; 示意图如下&#xff1a; 第一步&#xff1a;新创建两个节点&#xff08;redis-node-7&#xff0c;端口6387和 redis-node…

白码CRM快速实现报价转订单功能

某crm项目已经做到销售模块了&#xff0c;销售模块实现了从报价到销售单&#xff0c;再到财务模块的应收流程。但使用过程中发现不好用的地方&#xff1a;报价通过后客户下单&#xff0c;销售相关人员又要重新录入数据一样的销售单&#xff0c;觉得这样的操作比较繁琐&#xff…

若依基于sm-crypto实现前后端登录密码加密

上一节介绍了基于jsencrypt实现的密码加密解密登录功能&#xff0c;这次来介绍基于sm-crypto实现前后端登录密码加密&#xff0c;本次采用的是sm2进行的加密解密。 后端 首先从后端代码开始写起(因为公钥和私钥都是要从java代码中生成)&#xff1a; 首先需要引入sm-crypto的j…

【UE Niagara 条带粒子系列】01-初识条带渲染器

目录 效果 步骤 一、创建条带渲染器 二、增加粒子生成数量 三、设置条带粒子的初始宽度 效果 步骤 一、创建条带渲染器 1. 新建一个Niagara系统 选择“Simple Sprite Burst”模板 这里命名为“NS_RibbonRenderer” 打开“NS_RibbonRenderer”&#xff0c;删除“Sprite…

Kubernetes API 和流量控制:管理请求数量和排队进程

本文描述了我们最近遇到的一个真实案例&#xff1a;Kubernetes API 因其中一个集群中的大量请求而瘫痪。今天&#xff0c;我们将讨论我们如何处理这个问题&#xff0c;并提供一些关于如何预防它的提示。 高并发搞崩 Kubernetes API 一个非常普通的早晨&#xff0c;我们开始了…

KT148A语音芯在智能锁语音提示的优势在哪里成本还是性能

智能锁&#xff0c;已经广泛的应用于生活的各个场景&#xff0c;确实是一个好产品&#xff0c;我自己都在用&#xff0c;也很方便 而锁基本上都搭配有语音芯片或者蜂鸣器&#xff0c;低端的产品都是蜂鸣器&#xff0c;中端的产品基本都搭配语音芯片而智能锁方案中&#xff0c;…

智谱AI技术开放日:新一代基座大模型GLM-4及GLMs的发布

2024年1月16日&#xff0c;智谱AI举行了一次重要的技术开放日&#xff0c;发布了新一代基座大模型GLM-4和定制化的大模型GLMs。此次发布标志着智谱AI在人工智能领域的新一轮突破&#xff0c;进一步提升了大模型的性能&#xff0c;并降低了使用门槛&#xff0c;使得更多的人能够…

从界面探讨产品的卖点

背景 最近经常用这个平台来发布一些东西&#xff0c;总觉得体验不够好&#xff0c;毕竟这是号称是技术人员的聚集地&#xff0c;为何自己做的这个东西&#xff0c;好不好用&#xff0c;交互性咱们放到第二位&#xff0c;看了起码应该舒服&#xff0c;这应该是第一位的吧&#…

KubeSphere 核心实战之一【在kubesphere平台上部署mysql】(实操篇 1/3)

文章目录 1、登录kubesphere平台2、kubesphere部署应用分析2.1、工作负载2.2、服务2.3、应用路由2.4、任务2.5、存储与配置2.6、部署应用三要素 3、部署mysql3.1、mysql容器启动实例3.2、mysql部署分析3.3、创建mysql的配置3.4、创建mysql的数据卷pvc3.5、创建mysql工作负载3.6…

09- OpenCV:图像上采样和降采样

目录 1、上采样和降采样 简介 2、采样的应用场景 3、采样的API 4、图像金字塔概念 5、代码演示 1、上采样和降采样 简介 在图像处理中&#xff0c;上采样&#xff08;Upsampling&#xff09;和降采样&#xff08;Downsampling&#xff09;是常用的操作。 &#xff08;1&…

申泰勇教练的独家人物化身系列即将登陆 The Sandbox

申泰勇&#xff08;Shin Tae-yong&#xff09;教练是足球界的传奇人物&#xff0c;他来到 The Sandbox&#xff0c;推出了自己的专属人物化身系列。作为前 K 联赛中场球员和印尼队取得历史性成就的幕后教练&#xff0c;他的传奇经历现在已经影响到了虚拟世界。 向过去、现在和未…

C:\Windows\Temp占用空间过大, 这样删除

1. windowsi, 打开windows设置, 点击系统 2. 点击存储, 点击临时文件 3. 选择你想要删除的临时文件