文章目录
- 1.1、描述
- 1.2、声明
- 1.2.1、编码
- 1.2.2、示例
- 1.3、运算符
- 1.3.1、比较(Comparison)
- 1.3.2、类型(Types)
- 1.3.3、类型转换
1.1、描述
枚举类型对应于命名值列表。
1.2、声明
枚举数据类型的声明如下:
object Enumeration extends SpinalEnum {
val element0, element1, ..., elementN = newElement()
}
对于上面的示例,使用默认编码。VHDL 使用本机枚举类型,Verilog 使用二进制编码。
可以通过定义枚举来强制进行枚举编码:
object Enumeration extends SpinalEnum(defaultEncoding=encodingOfYourChoice) {
val element0, element1, ..., elementN = newElement()
}
注意:如果您想为给定组件定义枚举类型的输入/输出,需要按照以下方式进行操作:
in(MyEnum())
或out(MyEnum())
1.2.1、编码
支持以下枚举编码:
自定义编码可以通过两种不同的方式进行:静态或动态。
/*
* 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()
}
1.2.2、示例
实例化一个枚举信号并给它赋值:
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
1.3、运算符
枚举类型可用以下运算符:
1.3.1、比较(Comparison)
import UartCtrlTxState._
val stateNext = UartCtrlTxState()
stateNext := sIdle
when(stateNext === sStart) {
...
}
switch(stateNext) {
is(sIdle) {
...
}
is(sStart) {
...
}
...
}
1.3.2、类型(Types)
为了在函数中使用枚举,您可能需要知道它的类型。
值类型(例如sIdle的类型)为:
spinal.core.SpinalEnumElement[UartCtrlTxState.type]
或者等价地
UartCtrlTxState.E
bundle类型(例如stateNext的类型)为:
spinal.core.SpinalEnumCraft[UartCtrlTxState.type]
或者等价地
UartCtrlTxState.C
1.3.3、类型转换
import UartCtrlTxState._
val stateNext = UartCtrlTxState()
myBits := sIdle.asBits
stateNext.assignFromBits(myBits)