首页 > 其他分享 >11-verilog-有限状态机

11-verilog-有限状态机

时间:2023-02-12 16:35:34浏览次数:46  
标签:11 输出 状态 状态机 state verilog input 输入

有限状态机

写RTL的时候,实现一个功能的时候有很多种方法

  1. 将系统划分为多个状态,状态之间有状态的转移,第一步,第二步,,,,形成有限状态机
  2. 流水线技术设计,从输入到输出有多个步骤
    有限状态机,状态是有限的,比如8个状态,16个状态等,在进行设计的时候,状态机的状态不要太多,状态超过10个,就会造成设计复杂度和验证复杂度都变高.

有限状态机分类

  1. Moore FSM
    输出只与当前的状态有关,与输入没有关系
  2. Mealy FSM
    输出不仅与当前的状态有关,还与输入有关

Moore FSM-设计自动售货机

分析输入输出信号

  • 自动售货机,输入的就是硬币,输出的是饮料和找零 (确定输入,输出)
  • 假设饮料只有一种价格2.5元,输入的零钱只有一元和五角(两种状态,用1bit表示),找零的情况只有两种0元和5角(用1bit表示)(确定输出输出的状态,用几位的信号表示)

定义接口

  • 状态机要存储一些状态,肯定会有一些寄存器,会有时钟和复位信号
  • 在设计一个模块的时候,最先确定输入输出的端口和位宽以及时序

定义时序

  • 输入的一元和五角不能同时为1(确定输入的约束)

内部实现--画出状态转移图

要存储当前已经存储了多少钱,初始状态时0,可以收到1元和5角

  • IDLE就是当前系统是空闲状态,没有收到任何的投币
  • 这是一个Moore类型的有限状态机,输出只与当前的状态有关
    Moore有限状态机电路特点
  1. 输入与当前的状态有关,所以需要一个寄存器存储当前的状态
  2. 寄存器存储的状态输入给组合逻辑之后,进行输出
  3. 输入与当前的状态值,经过组合逻辑之后,输入给寄存器
  4. 时序清晰,输入和输出,没有一条直接的组合逻辑路径;如果输入经过组合逻辑,没有经过寄存器,直接输出,这样的设计不好;因为不知道周围环境的组合逻辑的时序是多少

Code

module drink_status_moore(
  input clk,
  input reset,
  input half,
  input one,
  output out,
  output cout
);
  parameter [2:0] s0 = 3'b000,
                  s1 = 3'b001,
                  s2 = 3'b010,
                  s3 = 3'b011,
                  s4 = 3'b100,
                  s5 = 3'b101,
                  s6 = 3'b110;   //定义6个状态
  reg [2:0] curr_state;     //当前状态  CS
  reg [2:0] next_state;     //下一个状态 NS  reg定义的信号不一定是寄存器
  
  //第一段:声明一个寄存器,state transfer
  always @ (posedge clk ,negedge reset) begin
    if(~reset)
     curr_state <= s0;      //这里时钟来了之后,就寄存器传输,寄存器功耗比较大,需要给寄存器传输添加条件
    else
     curr_state <= #1 next_state; 
  end
  //第二段,根据条件写出中间状态转移
  always @ (curr_state,half,one) begin
    case(curr_state)
      s0:begin
         if(half)           next_state = s1;    //如果两个投币口,就会出现问题,一次投入可能为1.5元,所以要给输入添加约束
         else of(one)       next_state = s2;    //文件和文件之间需要进行一些约束
         else               next_state = S0;
         end
      s1:begin
         if(half)           next_state = s2;
         else of(one)       next_state = s3;
         else               next_state = S1;
         end
      s2:begin
         if(half)           next_state = s3;
         else of(one)       next_state = s4;
         else               next_state = S2;
         end
      s3:begin
         if(half)           next_state = s4;
         else of(one)       next_state = s5;
         else               next_state = S3;
         end
      s4:begin
         if(half)           next_state = s5;
         else of(one)       next_state = s6;
         else               next_state = S4;
         end
      s5:begin
                            next_state = s0;
         end
      s6:begin
                            next_state = s0;
         end
      default:              next_state = s0;
  end
  //第三段,写出输出
  assign out = (curr_state == s5) || (curr_State = s6) ? 1:0;
  assign cout = (curr_state == s6) ? 1:0;
endmodule

FSM 三段式的书写方式

mealy FSM-自动售货机

  • 相当于在当前状态,考虑之后输入的状态
  • 输入经过组合逻辑之后直接得到输出
module drink_status_moore(
  input clk,
  input reset,
  input half,
  input one,
  output out,
  output cout
);
  parameter [2:0] s0 = 3'b000,
                  s1 = 3'b001,
                  s2 = 3'b010,
                  s3 = 3'b011,
                  s4 = 3'b100;  //定义6个状态,变量名需要更加具有含义

  reg [2:0] curr_state;     //当前状态  CS
  reg [2:0] next_state;     //下一个状态 NS  reg定义的信号不一定是寄存器
  
  //第一段:声明一个寄存器,state transfer
  always @ (posedge clk ,negedge reset) begin
    if(~reset)
     curr_state <= s0;      //这里时钟来了之后,就寄存器传输,寄存器功耗比较大,需要给寄存器传输添加条件
    else
     curr_state <= #1 next_state; 
  end
  //第二段,根据条件写出中间状态转移
  always @ (*) begin
    case(curr_state)
      s0:begin
         if(half)           next_state = s1;    //如果两个投币口,就会出现问题,一次投入可能为1.5元,所以要给输入添加约束
         else of(one)       next_state = s2;    //文件和文件之间需要进行一些约束
         else               next_state = S0;
         end
      s1:begin
         if(half)           next_state = s2;
         else of(one)       next_state = s3;
         else               next_state = S1;
         end
      s2:begin
         if(half)           next_state = s3;
         else of(one)       next_state = s4;
         else               next_state = S2;
         end
      s3:begin
         if(half)           next_state = s4;
         else of(one)       next_state = s0;
         else               next_state = S3;
         end
      s4:begin
         if(half)           next_state = s0;
         else of(one)       next_state = s0;
         else               next_state = S4;
         end
      default:              next_state = s0;
  end
  //第三段,写出输出
  assign out = ((curr_state == s4) & (half | one)) ? 1:
               ((curr_state == s3) & (one)) ? 1 : 0;
  assign cout = (curr_state == s4) & (one) ? 1 : 0;
endmodule

FSM有限状态机的设计步骤

  1. 接口定义(信号\位宽\约束)
  2. 状态定义和编码
  3. 状态转换图
  4. 按照三段式风格实现RTL代码
  5. 编写Testbench
  6. 使用QuestaSim进行编译和仿真
  7. 通过波形工具查看激励\状态信号和输出信号
  • Moore机输出只与当前状态有关
  • Mealy输出不仅与当前的状态有关,还与当前的输入有关

状态机的电路逻辑图

FSM要注意的问题

  1. case语句,要将所有的case列全
  2. 使用default语句还原状态;如果不写default,就需要写够所有可能

序列检测器

  • 输入就是1bit的x,输出的y也是1bity
  • 定义当前的状态,存储之前存储的序列是怎样的状态,初始为IDLE,中间状态可能会出现中间状态
  • IDLE在定义的时候,检测的序列是从1开始的,IDLE可以直接设计为初始值为1,中间状态出现01,10等不对的状态,可以取消掉


标签:11,输出,状态,状态机,state,verilog,input,输入
From: https://www.cnblogs.com/Icer-newer/p/17113640.html

相关文章

  • Go语言学习11-数据初始化
    数据初始化书接上篇,我们了解了Go语言的指针类型。那到目前为止,Go的数据类型就差不多介绍完了,下面就是讲解更优雅地对Go数据的初始化了。这里的数据初始化是指对某个......
  • macos big sur 11(大苏尔)v11.7.3正式版
    macOSCatalina让你喜欢的种种Mac体验都更进一步。大胆的新经验。同样的Mac魔术。你可以领略音乐、播客这两款全新Macapp的表演;在Mac上畅享各款自己心爱的iPadap......
  • 如何在Debian 11上安装Docker Swarm集群
    DockerSwarm是一个用于管理Docker主机的工具。我们可以构建一个高可用性、高性能的Docker集群,其中应用部署在许多服务器上。Dockerswarm由管理主机和工作节点构建。您可......
  • 如何在Debian 11上安装Docker Swarm集群
    DockerSwarm是一个用于管理Docker主机的工具。我们可以构建一个高可用性、高性能的Docker集群,其中应用部署在许多服务器上。Dockerswarm由管理主机和工作节点构建。您......
  • springboot开发日记(11)——请求参数处理
    请求映射Rest风格(使用HTTP请求方式动词来表示对资源的操作) /user  GET-获取用户DELETE-删除用户PUT-修改用户POST-保存用户在index.html中添加表单标签:<forma......
  • 11th Feb
    1、单例模式:---饿汉式 单例有问题,结果不一样:32min的时候就不明白了静态内部类都不会被加载???bilibili.com/video/BV1UA411G7YN/?p=2&spm_id_from=pageDriver&vd_so......
  • 从空项目开始建立MFC程序导致1189错误解决办法
    错误提示:严重性代码说明项目文件行源禁止显示状态工具错误(活动) E0035 #error指令:BuildingMFCapplicationwith/MD[d](CRTdllversion)requiresMFC......
  • win10 0x0000011b共享打印机无法连接
    提供打印共享的win10由于升级后,其它需要使用打印机的windows电脑在连接共享的打印机时会有这个报错网上说在这台打印服务器上删除补丁即可,可以我没有找到,如:KB5005565补丁......
  • day11- 20.有效括号|1047.删除字符串中所有相邻重复项
    20.有效括号leetcode题目链接:https://leetcode.cn/problems/valid-parentheses/题目描述:给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字......
  • m基于FPGA的MSK调制解调系统verilog开发,并带FPGA误码检测模块和matlab仿真程序
    1.算法描述整个模型的基本框图为软件无线电是现代通信技术的重要研究领域和发展方向,目前发展迅速.快速发展的软件无线电技术与落后的硬件计算资源之间的矛盾越来越突出.......