【SpinalHDL快速入门】4.4、基本类型之Enum

文章介绍了SpinalHDL中枚举类型的使用,包括其声明、编码方式(静态和动态)、示例以及比较、类型和类型转换等操作。枚举类型用于表示命名值列表,可以使用自定义编码,并在代码中进行比较和转换。

在这里插入图片描述

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值