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

news2024/7/6 18:35:09

文章目录

    • 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/617767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode搭建Python环境

文章目录 安装Python解释器vscode 所需插件PythonCode Runner vscode调试Python官网的中文文档 安装Python解释器 打开Python官网 https://www.python.org/ 在 Downloads 下面选择自己的对应系统,本文以 Windows 为例 可以选择最新版本 下载可执行文件类型的安…

【Linux服务器编程总结】网络编程基础知识 (udp初级)

一.预备知识 1.主机字节序和网络字节序: 其实本质就是大小端。通常在网络传输的时候会将要发送的数据转同一转换成大端后再发送。在linux中提供了如下四个函数进行大小端转换。 2. 网络套接字: 我们在网络编程的时候会使用到socktet 套接字。对此我们需要了解so…

SQL语句之DQL语言(一)

说明:DQL(Data Query Language,数据查询语言),用来查询数据库表中的记录。有的书中,会把DQL语言放入到DML(Data Manipulation Language,数据操作语言:数据的增删改&#…

初识TypeScript -基础一

前言 在开始工作之前,就听朋友提过TypeScript,之前也没多想学习,直到vue3出来之后,感觉TypeScript 后面会成为主流,只能硬着头皮学学吧。 读完本片文章,你会收获 1、TypeScript的历史及其优势 2、TypeScri…

Day_39关键路径

目录 一. 关于关键路径 1. 有向无环图 2. AOV网 3. 拓补排序 4. 关键路径 二. 如何实现寻找关键路径 三. 关键路径的代码实现 1. 正向计算 1.1 计算每个节点的入度 1.2 拓扑排序(计算每个节点最早开始的时间) 2. 反向计算 2.1 计算每个节点的出度&…

基于jupyter的线性回归练习

文章目录 练习1:线性回归介绍1 实现简单示例函数1.1 提交解决方案 2 单变量线性回归2.1 绘制数据2.2 梯度下降2.2.1 更新公式2.2.2 实现2.2.3 计算成本J(θ)2.2.4 梯度下降 2.3 可视化成本函数 选做练习3 多变量线性回归3.1 特征标准化3.2 梯度下降 总结 练习1&…

第六章:多表查询

第六章:多表查询 ​ 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 ​ 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键…

SciencePub学术 | 人工智能类重点SCIEI征稿中

SciencePub学术 刊源推荐: 人工智能类重点SCI&EI征稿中!影响因子高,对国人友好。信息如下,录满为止: 一、期刊概况: 人工智能类重点SCI&EI 【期刊简介】IF:7.5-8.0,JCR1区&#xff0…

chatgpt赋能python:Python如何获取图片的尺寸

Python如何获取图片的尺寸 如果你在使用Python编程,常常需要获取图片的尺寸,本文将介绍如何使用Python获取图片的尺寸,同时还会介绍一些常用的Python库用于图像处理。 PIL库 PIL(Python Imaging Library)是Python中…

chatgpt赋能python:Python中如何设置空格

Python中如何设置空格 作为一门流行的编程语言,Python被广泛地应用于各种领域。在编写Python代码时,空格的使用非常重要。适当的空格设置可以让代码易读易懂,同时也有助于提高代码的可维护性和可重用性。 什么是空格 在Python中&#xff0…

shell脚本:循环结束语句二

shell脚本-循环结束语句二 二、循环结束语句:1.break:跳出循环。2.continue:3.while:4.until:条件不成立时,跳出循环。5.总结: 三、操作演练: 二、循环结束语句: 1.brea…

QT CTK插件开发(六) 多对一插件

CTK在软件的开发过程中可以很好的降低复杂性、使用 CTK Plugin Framework 提供统一的框架来进行开发增加了复用性 将同一功能打包可以提供多个应用程序使用避免重复性工作、可以进行版本控制提供了良好的版本更新迭代需求、并且支持动态热拔插 动态更新、开发更加简单快捷 方便…

基于jupyter的逻辑回归练习

文章目录 练习2:逻辑回归介绍1 Logistic回归1.1 数据可视化1.2 实现1.2.1 Sigmoid函数1.2.2 代价函数和梯度1.2.2.1 代价函数1.2.2.2 梯度下降 1.2.3 寻找最优参数1.2.4 评估逻辑回归 2 正则化逻辑回归2.1 数据可视化2.2 特征映射2.3 代价函数和梯度 2.4 寻找最优参…

腾讯云618云服务器优惠活动价格表

2023年腾讯云618年中促销活动已经正式开始了,腾讯云多款云服务都有特惠,下面给大家分享腾讯云618云服务器优惠活动价格表,记得抓住这次上云好时机! 目录 一、腾讯云618活动入口 二、轻量应用服务器优惠价格表 三、CVM云服务器优…

【连续介质力学】二阶张量的图像表示

二阶张量在特定方向的投影 法向和切向分量 二阶张量T投影到 n ^ \hat n n^方向的结果是 t ⃗ ( n ^ ) T ⋅ n ^ \vec t^{(\hat n)}T \cdot \hat n t (n^)T⋅n^,其中 t ⃗ ( n ^ ) \vec t^{(\hat n)} t (n^)可以分解成: t ⃗ ( n ^ ) T ⃗ N T ⃗ S…

指针(三)

文章内容 1. 字符指针 2. 数组指针 3. 指针数组 文章内容 1. 字符指针 指针的概念: 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。 3. 指针…

适配器stack和queue

目录 什么是适配器 模拟实现stack stack的特性 STL中stack的基本框架 接口实现 模拟实现queue queue的特性 STL中queue的框架 什么是适配器 适配器:所谓适配,适配的是容器(vector,list,deque....) 也就是不管是什么容器,都可以套用适…

chatgpt赋能python:Python如何设置输入的SEO

Python如何设置输入的SEO Python是一种高级的编程语言,具有容易上手、可扩展和开源等特点,因此在软件开发过程中得到广泛的应用。然而,如果您想让您的Python项目在搜索引擎上获得更好的排名和流量,您需要考虑如何设置输入的SEO。…

二叉搜索树(Binary Seach Tree)模拟实现

目录 二叉搜索树的性质 二叉搜索树的实现 结点类 接口类(BSTree) 二叉搜索树的插入(insert) 二叉搜索树的查找(find) 二叉搜索树删除(erase) 第二种、删除的结点右子树为空 第三种、删除的结点左子树为空 第四种、删除的结点左右都不为空 实现 二叉搜索树模拟实现代…

基于jupyter的轮廓检测及功能

文章目录 一、实验介绍二、实验步骤三、实验任务任务一:轮廓特征练习一: 找到每个轮廓的方向任务二:边界矩形练习二: 围绕轮廓裁剪图像 总结 一、实验介绍 1. 实验内容 本实验将学习轮廓检测及功能。 2. 实验要点 生成二进制图像来查找轮廓找到并画出…