SpinalEnum

描述

Enumeration (枚举)类型对应于命名值的列表。

声明

枚举数据类型的声明如下:

object Enumeration extends SpinalEnum {
  val element0, element1, ..., elementN = newElement()
}

在上面的示例中,使用的是默认编码。VHDL (默认)使用本地枚举类型,Verilog (默认)使用二进制编码。

可以通过如下定义来强制设置指定枚举的编码:

object Enumeration extends SpinalEnum(defaultEncoding=encodingOfYourChoice) {
  val element0, element1, ..., elementN = newElement()
}

备注

如果要将枚举定义为给定组件的 in/out,则必须执行以下操作: in(MyEnum())out(MyEnum())

编码

支持以下枚举编码:

编码

位宽

描述

native

使用VHDL枚举系统,这是默认编码

binarySequential

log2Up(stateCount)

使用 Bits 按声明顺序存储状态(值从 0 到 n-1)

binaryOneHot

stateCount

使用位来存储状态。每一位对应一个状态,在硬件编码状态表示中一次仅设置一位。

graySequential

log2Up(stateCount)

将索引(像 binarySequential 中使用的数)编码为二进制格雷码。

自定义编码可以通过两种不同的方式执行:静态或动态。

/*
 * Static encoding
 */
object MyEnumStatic extends SpinalEnum {
  val e0, e1, e2, e3 = newElement()
  defaultEncoding = SpinalEnumEncoding("staticEncoding")(
    e0 -> 0,
    e1 -> 2,
    e2 -> 3,
    e3 -> 7)
}

/*
 * Dynamic encoding with the function :  _ * 2 + 1
 *   e.g. : e0 => 0 * 2 + 1 = 1
 *          e1 => 1 * 2 + 1 = 3
 *          e2 => 2 * 2 + 1 = 5
 *          e3 => 3 * 2 + 1 = 7
 */
val encoding = SpinalEnumEncoding("dynamicEncoding", _ * 2 + 1)

object MyEnumDynamic extends SpinalEnum(encoding) {
  val e0, e1, e2, e3 = newElement()
}

示例

实例化一个枚举信号并为其赋值:

object UartCtrlTxState extends SpinalEnum {
  val sIdle, sStart, sData, sParity, sStop = newElement()
}

val stateNext = UartCtrlTxState()
stateNext := UartCtrlTxState.sIdle

// You can also import the enumeration to have visibility of its elements
import UartCtrlTxState._
stateNext := sIdle

运算符

以下运算符可用于 Enumeration 类型:

比较运算

运算符

描述

返回类型

x === y

等价性判断

Bool

x =/= y

不等价判断运算

Bool

import UartCtrlTxState._

val stateNext = UartCtrlTxState()
stateNext := sIdle

when(stateNext === sStart) {
  ...
}

switch(stateNext) {
  is(sIdle) {
    ...
  }
  is(sStart) {
    ...
  }
  ...
}

类型

为了使用枚举(例如在函数中),您可能需要其类型。

值的类型(例如 sIdle 的类型)是

spinal.core.SpinalEnumElement[UartCtrlTxState.type]

或等效的

UartCtrlTxState.E

线束类型(例如 stateNext 的类型)是

spinal.core.SpinalEnumCraft[UartCtrlTxState.type]

或等效的

UartCtrlTxState.C

类型转换

运算符

描述

返回类型

x.asBits

二进制转换为 Bits

Bits(w(x) bits)

x.asBits.asUInt

二进制转换为 UInt

UInt(w(x) bits)

x.asBits.asSInt

二进制转换为SInt

SInt(w(x) bits)

e.assignFromBits(bits)

Bits转换为枚举

MyEnum()

import UartCtrlTxState._

val stateNext = UartCtrlTxState()
myBits := sIdle.asBits

stateNext.assignFromBits(myBits)