实践是最好的老师,通过项目实战才能把所学转化为实际的能力。——沃兹基

一.什么是状态机?

有限状态机Finite State Machine,简称FSM)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.一般分为三种:分别是Moore型,Mealy型,以及混合型。这个练习主要讲Mealy型有限状态机。

Mealy型有限状态机:由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向哪一状态还是留在原状态不但取决于各个输入值,还取决于当前所在状态。

图1状态转移图[1]

状态转移图的解释:上图中Input 输入是时钟clk,输入信号为A,Reset,Output  为F和G

module MEALY_FSM(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G;       //输出信号
reg F,G;
reg [1:0]state;//状态信号
/*定义四个状态的编码 00,01,10,11*/
parameter idle=2'b00,start=2'b01,
stop=2'b10,clear=2'b11;
  always @(posedge clk) //总是在时钟上升沿触发
  if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
    begin 
     state <=idle;//无阻塞赋值,且起始状态为start
     F<=0;//初始输出为0
    G<=0;//初始输出为0
    end
  else
    case(state)
           idle: begin
                   if(A)//由图所知,A/G=0
                           begin
                             state<=start;//根据图所示,idle箭头指向start
                            G<=0;
                           end
                        else
                        state<=idle;
                  end
           start:if(!A)
                    begin
                   state<=stop;//根据图所示,idle箭头指向stop
                    F<=1;//图中所示A/F=1
                   end
                     else
                       state<=start;// 
            stop: if(A)
                       begin
                          state<=clear;
                          G<=1; 
                     end
                      else 
                          state<=stop;
            
           clear:if(!A)// 
                       begin
                     state<=idle;
                          F<=0;
                          G<=1;
                     end
                      else
                         state<=clear;
   endcase

endmodule

另一种写法

module MEALY_FSM_II(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G;       //输出信号
reg F,G;
reg [3:0]state;//状态信号多用了两个寄存器,这叫独热编码,FPGA适合,上面的适合CPLD
/*定义四个状态的编码 1000,0100,0010,0001*/
parameter idle=4'b1000,start=4'b0100,
stop=4'b0010,clear=4'b0001;
  always @(posedge clk) //总是在时钟上升沿触发
  if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
    begin 
     state <=idle;//无阻塞赋值,且起始状态为start
     F<=0;//初始输出为0
    G<=0;//初始输出为0
    end
  else
    case(state)
           idle: begin
                   if(A)//由图所知,A/G=0
                           begin
                             state<=start;//根据图所示,idle箭头指向start
                            G<=0;
                           end
                        else
                        state<=idle;
                  end
           start:if(!A)
                    begin
                   state<=stop;//根据图所示,idle箭头指向stop
                    F<=1;//图中所示A/F=1
                   end
                     else
                       state<=start;// 
            stop: if(A)
                       begin
                          state<=clear;
                          G<=1; 
                     end
                      else 
                          state<=stop;
            
           clear:if(!A)// 
                       begin
                     state<=idle;
                          F<=0;
                          G<=1;
                     end
                      else
                         state<=clear;
   endcase

endmodule

第三种写法

module MEALY_FSM_III(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G;       //输出信号
reg [1:0]state;//寄存器状态,相当于把触发器和组合逻辑分开描述
wire [1:0] nextstate;// 定义两个状态,当前和下一个 
wire F,G;
/*定义四个状态的编码 00,01,10,11*/
parameter idle=2'b00,start=2'b01,
stop=2'b10,clear=2'b11;
  always @(posedge clk) //总是在时钟上升沿触发
  if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
    begin 
     state <=idle;//无阻塞赋值,且起始状态为start
    end
  else
    state<=nextstate;//相当于把触发器和组合逻辑分开描述
     
     assign nextstate=(state==idle)?  (A?start:idle):
                      (state==start)? (!A?stop:start)://若为!A执行后面的,否则执行start
                     (state==stop)?  (A?clear:stop):
                      (state==clear)? (!A?idle:clear):idle;
     assign F =((state==stop)&&A);//根据逻辑状态得出来的                    
     assign G =((state==clear)&&(!A|!Reset));    //

endmodule

第四种写法

module MEALY_FSM_IV(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G;       //输出信号
reg F,G;//这里必须声明数据类型,不声明的话,你试试。
reg [1:0]state,nextstate;// 定义两个状态,当前和下一个 
/*定义四个状态的编码 00,01,10,11*/
parameter idle=2'b00,start=2'b01,
stop=2'b10,clear=2'b11;
  always @(posedge clk) //总是在时钟上升沿触发
  if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
    begin 
     state <=idle;//无阻塞赋值,且起始状态为start
    end
  else
    state<=nextstate;//相当于把触发器和组合逻辑分开描述
     
     always@(state or A)    //因为受输入和当前状态影响
      begin
        F<=0;
          G<=0;
         if(state==idle)//从idle开始描述
          begin
           if(A)//
            nextstate=start;  //开始为1
           else
            nextstate=idle;  //!A为isle
          G<=1;
          end
         else
          if(state==start)
             if(!A)
             nextstate<=stop;
             else
             nextstate<=start;
         else
            if(state==stop)
             if(A)
             nextstate<=clear;
             else
             nextstate<=stop;
         else
            if(state==clear)
             begin
               if(!A)
                 nextstate=idle;
               else
                 nextstate=clear; 
                  F<=1;
              end
        else
              nextstate=idle;//阻塞赋值
     end
endmodule

综合后的状态机视图如下所示

图二.综合后的状态机试图

总结mealy型状态机的写法流程如下

1.获得状态转移图,通过逻辑抽象。就是把给出的一个实际逻辑关系表示为时序逻辑函数,可以用状态转换表来描述,也可以用状态转换图来描述。

  a)分析给定的逻辑问题,确定输入变量、输出变量以及电路的状态数。通常是取原因(或条件)作为输入变量,取结果作为输出变量
    b) 定义输入、输出逻辑状态的含意,并将电路状态顺序编号                                              c)按照要求列出电路的状态转换表或画出状态转换图。

2.状态化简

结果在状态转换图中出现这样两个状态,它们在相同的输入下转换到同一状态去,并得到一样的输出,则称它们为等价状态。显然等价状态是重复的,可以合并为一个。电路的状态数越少,存储电路也就越简单。状态化简的目的就在于将等价状态尽可能地合并,以得到最简的状态转换图。

3.状态分配

状态分配很重要,在分配的时候意味着使用的触发器的多少,对于FPGA由于触发器多,可以使用独热编码也就是4‘b1000,4’b0100这种方式,对于CPLD可以使用其他编码。

4选定触发器的类型并求出状态方程、驱动方程和输出方程。
5) 按照方程得出逻辑图
     使用always块语句和case(if)等条件语句及赋值语句即可方便实现。具体的逻辑化简及逻辑电路到触发器映射均可由计算机自动完成,上述设计步骤中的第2步及4、5步不再需要很多的人为干预,使电路设计工作得到简化,效率也有很大的提高。

读者朋友可以在留言区和我交流。

Verilog HDL 小练习(四)状态机相关推荐

  1. 【Verilog HDL】第四章 模块的端口连接规则——污水处理模型

    先放上连接规则的简图,再详细解释 1. 构建模型--污水处理之流水模型 我们先将上述结构构件一个简单模型,以帮助我们理解. 污水:输入数据 净水:输出数据 双向数据暂不讨论,取输入和输出的交集即可 污 ...

  2. 数字集成电路设计(二、Verilog HDL基础知识)

    文章目录 1. 语言要素 1.1 空白符 1.2 注释符 1.3 标识符 1.3.1 转义标识符 1.4 关键字 1.5 数值 1.5.1 整数及其表示方式 1.5.2 实数及其表示方式 1.5.3 ...

  3. Verilog HDL简明教程

    Verilog HDL简明教程 来源: 郭红卫的日志 Verilog HDL简明教程 Verilog HDL是一种硬件描述语言,用于从算法级.门级到开关级的多种抽象设计层次的数字系统建模.被建模的数字 ...

  4. 【 Verilog HDL 】循环语句总结

    目录 综述 forever语句 repeat语句 while语句 for语句 综述 在Verilog HDL中存在四种类型的循环语句,用来控制执行语句的执行次数. 1) forever  连续的执行语 ...

  5. Verilog HDL 总结(1)

    Verilog HDL 复习总结 1. Verilog 语法的基础概念 1.1 Verilog模块的基本概念 1.2 Verilog用于模块的测试 2. Verilog的基本语法 2.1 模块的结构 ...

  6. 如何写好状态机?跑马灯/流水灯Verilog HDL实现

    如何写好状态机 很多初学者不知道何时应用状态机.这里介绍两种应用思路:第一种思路,从状态变量入手.如果一个电路具有时序规律或者逻辑顺序,我们就可以自然而然地规划出状态,从这些状态入手,分析每个状态的输 ...

  7. 数字集成电路设计(四、Verilog HDL数字逻辑设计方法)(一)

    文章目录 1.Verilog语言的设计思想和可综合特性 2. 组合电路的设计 2.1 数字加法器 2.2 数据比较器 2.3 数据选择器 2.4 数字编码器 2.4.1 3位二进制8线-3线编码器 2 ...

  8. (82)Verilog HDL:状态机二段式

    (82)Verilog HDL:状态机二段式 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:状态机二段式 5)结语 1.2 FPGA简介 FPG ...

  9. (81)Verilog HDL:状态机一段式

    (81)Verilog HDL:状态机一段式 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:状态机一段式 5)结语 1.2 FPGA简介 FPG ...

最新文章

  1. 高煥堂 5本 Android 的 eBooks (完整版Free)
  2. java基盘JavaScript_JavaWeb学习:SSH整合(无障碍整合)
  3. python爬虫抓取图片-python网络爬虫源代码(可直接抓取图片)
  4. JAVA springboot ssm b2b2c多用户商城系统源码:服务消费(基础)...
  5. python graphql query返回一组字典数据_Python的sqlalchemy使用原生sql查询如何返回字典形式的数组?...
  6. Dubbo监控平台安装
  7. [html] 在HTML5中,用于获得用户的当前位置是哪个方法?
  8. tableview或scrollview Y轴发生变化解决方案
  9. 飞机是由塑料杆的飞鸽传书
  10. android基础入门思考题答案,《Android移动应用基础教程》中国铁道出版社课后习题(附答案)...
  11. 公众号跳转小程序首次没有数据_小程序如何从“0”开始运营,变成获客神器...
  12. Android—— Fragment 真正的完全解析(上)(转)
  13. mysql存储过程输出_MySQL存储过程
  14. 固件中的单个二进制模拟:Tenda AC15 路由器 CVE-2018-5767 / CVE-2020-10987 漏洞分析与复现
  15. jq模仿雨滴下落的动画
  16. 《数学之美》第六章——信息的度量和作用
  17. Django Channels 个人对官方文档大概理解 及一些地方的作用
  18. 通过netd获取网卡的IP地址和硬件mac地址
  19. 职场邮件的十大忌讳,你犯了吗?
  20. 谈谈对于Promise简单的理解

热门文章

  1. 区块链新规,不可忽视的几个细节
  2. 伯德图(Bode图)分析系统性能
  3. keychain介绍
  4. 如何创建 ESXi 安装程序 USB 闪存驱动器
  5. Unity新手引导(圆形指引、矩形指引)
  6. 分享一些实用的小工具(Windows版)
  7. 分析晶体三极管频率特性的等效模型
  8. VMware ESXi 宕机分析过程
  9. Hero项目分析(基于Angular架构)
  10. 实用软件工程课后答案 (张海潘 吕云翔)