spinal HDL - 10 - 状态机

简介: spinal HDL - 10 - 状态机

状态机


介绍


在 SpinalHDL 中,您可以通过使用枚举和 switch/case 语句来定义您的状态机,就像在 VHDL/Verilog 中一样。但在 SpinalHDL 中,您也可以使用专用语法。

下面的状态机在以下示例中实现:

image.png

风格一:

import spinal.lib.fsm._
class TopLevel extends Component {
  val io = new Bundle {
    val result = out Bool()
  }
  val fsm = new StateMachine {
    val counter = Reg(UInt(8 bits)) init (0)
    io.result := False
    val stateA : State = new State with EntryPoint {
      whenIsActive(goto(stateB))
    }
    val stateB : State = new State {
      onEntry(counter := 0)
      whenIsActive {
        counter := counter + 1
        when(counter === 4) {
          goto(stateC)
        }
      }
      onExit(io.result := True)
    }
    val stateC : State = new State {
      whenIsActive(goto(stateA))
    }
  }
} 

风格二:

import spinal.lib.fsm._
class TopLevel extends Component {
  val io = new Bundle {
    val result = out Bool()
  }
  val fsm = new StateMachine{
    val stateA = new State with EntryPoint
    val stateB = new State
    val stateC = new State
    val counter = Reg(UInt(8 bits)) init (0)
    io.result := False
    stateA
      .whenIsActive(goto(stateB))
    stateB
      .onEntry(counter := 0)
      .whenIsActive {
        counter := counter + 1
        when(counter === 4) {
          goto(stateC)
        }
      }
      .onExit(io.result := True)
    stateC
      .whenIsActive(goto(stateA))
  }
}

状态机


StateMachine是基类。它管理 FSM 的逻辑。

val myFsm = new StateMachine {
  // Definition of states
}

StateMachine还提供了一些访问器:

姓名 返回 描述
isActive(state) Bool True当状态机处于给定状态时返回
isEntering(state) Bool True当状态机进入给定状态时返回

入口点


通过扩展 EntryPoint trait,可以将状态定义为状态机的入口点:

val stateA = new State with EntryPoint

或通过使用setEntry(state)

val stateA = new State
setEntry(stateA)

过渡


  • 转换由 表示goto(nextState),它将状态机安排nextState在下一个周期。
  • exit()安排状态机在下一个周期处于启动状态(或者,在 中StateFsm,退出当前嵌套状态机)。

这两个函数可以在状态定义中使用(见下文)或 using ,它始终适用,优先于状态。always { yourStatements }``yourStatements

状态


可以使用多种状态:

  • State(基地之一)
  • StateDelay
  • StateFsmStateParallelFsm

它们中的每一个都提供了以下函数来定义与它们关联的逻辑:

image.png

state.隐含在块中:new State

image.png

val stateB : State = new State {
  onEntry(counter := 0)
  whenIsActive {
    counter := counter + 1
    when(counter === 4) {
      goto(stateC)
    }
  }
  onExit(io.result := True)
}

状态延迟


StateDelay 允许创建一个状态,该状态在执行语句之前等待固定数量的周期。使用它的首选方法是:whenCompleted {...}

val stateG : State = new StateDelay(cyclesCount=40) {
  whenCompleted {
    goto(stateH)
  }
}

也可以写成一行:

val stateG : State = new StateDelay(40) { whenCompleted(goto(stateH)) }

状态机


StateFsm允许描述包含嵌套状态机的状态。当嵌套状态机完成(退出)时,执行中的语句。whenCompleted { ... }

有一个 StateFsm 定义的例子:

// internalFsm is a function defined below
val stateC = new StateFsm(fsm=internalFsm()) {
  whenCompleted {
    goto(stateD)
  }
}
def internalFsm() = new StateMachine {
  val counter = Reg(UInt(8 bits)) init (0)
  val stateA : State = new State with EntryPoint {
    whenIsActive {
      goto(stateB)
    }
  }
  val stateB : State = new State {
    onEntry (counter := 0)
    whenIsActive {
      when(counter === 4) {
        exit()
      }
      counter := counter + 1
    }
  }
}

在上面的示例中,exit()使状态机跳转到启动状态(内部隐藏状态)。这通知StateFsm了内部状态机的完成。

StateParallelFsm


StateParallelFsm允许处理多个嵌套状态机。当所有嵌套状态机都完成后,执行中的语句。whenCompleted { ... }

例子:

val stateD = new StateParallelFsm (internalFsmA(), internalFsmB()) {
  whenCompleted{
    goto(stateE)
  }
}

进入状态注意事项


上面定义的进入状态的方式使得在复位和第一次时钟采样之间,状态机处于启动状态。只有在第一次时钟采样之后,定义的进入状态才会激活。这允许正确进入入口状态(在 中应用语句onEntry),并允许嵌套状态机。

虽然它很有用,但也可以绕过该功能并直接让状态机引导到用户状态。

为此,请使用makeInstantEntry()而不是定义。该函数返回开机状态,复位后直接激活。new State


目录
相关文章
|
存储 开发工具 异构计算
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑(下)
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑
963 0
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑(下)
|
芯片 异构计算
第三章 硬件描述语言verilog(三)功能描述-时序逻辑
第三章 硬件描述语言verilog(三)功能描述-时序逻辑
279 0
第三章 硬件描述语言verilog(三)功能描述-时序逻辑
|
算法 异构计算
基于状态机方法的按键消抖模块FPGA实现,包括testbench
基于状态机方法的按键消抖模块FPGA实现,包括testbench
161 0
|
开发工具 芯片 异构计算
Verilog 设计方法
Verilog 的设计多采用自上而下的设计方法(top-down)。即先定义顶层模块功能,进而分析要构成顶层模块的必要子模块;然后进一步对各个模块进行分解、设计,直到到达无法进一步分解的底层功能块。这样,可以把一个较大的系统,细化成多个小系统,从时间、工作量上分配给更多的人员去设计,从而提高了设计速度,缩短了开发周期。
177 1
|
存储 算法 异构计算
基于Verilog HDL的状态机描述方法
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
168 0
基于Verilog HDL的状态机描述方法
|
算法 异构计算
Verilog HDL函数与任务的使用
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
125 0
Verilog HDL函数与任务的使用
|
Scala
spinal HDL - 05 - Spinal HDL - 函数和时钟域
spinal HDL - 05 - Spinal HDL - 函数和时钟域
303 0
spinal HDL - 05 - Spinal HDL - 函数和时钟域
|
算法 异构计算
Verilog HDL数据流建模与运算符
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
214 0
Verilog HDL数据流建模与运算符
|
算法 异构计算
Verilog HDL门级建模
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
148 0
Verilog HDL门级建模
Verilog模块例化
这种方法将需要例化的模块端口与外部信号按照其名字进行连接,端口顺序随意,可以与引用 module 的声明端口顺序不一致,只要保证端口名字与外部信号匹配即可。
345 0