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)