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())
编码
支持以下枚举编码:
| 编码 | 位宽 | 描述 | 
|---|---|---|
| 
 | 使用VHDL枚举系统,这是默认编码 | |
| 
 | 
 | 使用 Bits 按声明顺序存储状态(值从 0 到 n-1) | 
| 
 | stateCount | 使用位来存储状态。每一位对应一个状态,在硬件编码状态表示中一次仅设置一位。 | 
| 
 | 
 | 将索引(像  | 
自定义编码可以通过两种不同的方式执行:静态或动态。
/*
 * 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)