【SpinalHDL快速入门】4.5、复合类型之Bundle

news2024/12/28 19:03:35

文章目录

    • 1.1、描述
    • 1.2、声明
      • 1.2.1、条件信号(Conditional signals)
    • 1.3、运算符
      • 1.3.1、比较(Comparison)
      • 1.3.2、类型转换(Type cast)
      • 1.3.3、将比特转换回 Bundle
    • 1.4、IO元素方向
      • 1.4.1、in/out
      • 1.4.2、master/slave

在这里插入图片描述

1.1、描述

Bundle是一种复合类型,它定义了一组命名信号(任何SpinalHDL基本类型)在一个名称下。

Bundle可用于建模数据结构、总线和接口

1.2、声明

声明一个 bundle 的语法如下:

case class myBundle extends Bundle {
	val bundleItem0 = AnyType
	val bundleItem1 = AnyType
	val bundleItemN = AnyType
}
case class Color(channelWidth: Int) extends Bundle {
	val r, g, b = UInt(channelWidth bits)
}

例如,一个包含Color的Bundle可以被定义为

1.2.1、条件信号(Conditional signals)

Bundle中的信号可以有条件地定义。除非dataWidth大于0,否则在展开的myBundle中将没有数据信号,如下面的示例所示。

case class myBundle(dataWidth: Int) extends Bundle {
	val data = (dataWidth > 0) generate (UInt(dataWidth bits))
}

1.3、运算符

Bundle类型支持以下运算符:

1.3.1、比较(Comparison)

在这里插入图片描述

val color1 = Color(8)
color1.r := 0
color1.g := 0
color1.b := 0

val color2 = Color(8)
color2.r := 0
color2.g := 0
color2.b := 0

myBool := color1 === color2

1.3.2、类型转换(Type cast)

在这里插入图片描述

val color1 = Color(8)
val myBits := color1.asBits

Bundle的元素将按照定义的顺序映射到其位置。因此,color1中的r将占用myBits(LSB)的0到8位,然后是g和b。

1.3.3、将比特转换回 Bundle

.assignFromBits 运算符可以被视为 .asBits 的反向操作。

在这里插入图片描述

以下示例将名为CommonDataBus的Bundle保存到循环缓冲区(第三方内存)中,稍后读取Bits并将其转换回CommonDataBus格式。

在这里插入图片描述

case class TestBundle () extends Component {
	val io = new Bundle {
		val we 		= in Bool()
		val addrWr 	= in UInt (7 bits)
		val dataIn 	= slave (CommonDataBus())
		val addrRd 	= in UInt (7 bits)
		val dataOut = master (CommonDataBus())
	}
	val mm = Ram3rdParty_1w_1rs (	G_DATA_WIDTH = io.dataIn.getBitsWidth,
									G_ADDR_WIDTH = io.addrWr.getBitsWidth,
									G_VENDOR 	 = "Intel_Arria10_M20K")
	mm.io.clk_in := clockDomain.readClockWire
	mm.io.clk_out := clockDomain.readClockWire
	
	mm.io.we := io.we
	mm.io.addr_wr := io.addrWr.asBits
	mm.io.d := io.dataIn.asBits
	
	mm.io.addr_rd := io.addrRd.asBits
	io.dataOut.assignFromBits(mm.io.q)
}

1.4、IO元素方向

当您在组件的IO定义中定义Bundle时,需要指定其方向。

1.4.1、in/out

如果您的Bundle中所有元素都朝着同一个方向,您可以使用in(MyBundle())或out(MyBundle())。

例如:

val io = new Bundle {
	val input  = in (Color(8))
	val output = out(Color(8))
}

1.4.2、master/slave

如果您的接口遵循master/slave拓扑结构,可以使用IMasterSlave特性。然后,您需要实现函数def asMaster(): Unit设置每个元素相对于master的方向。然后,在IO定义中可以使用master(MyBundle())slave(MyBundle())语法。

有一些被定义为toXXX的函数,例如Flow类的toStream方法。这些函数通常由master调用。此外,fromXXX函数是为Slave设计的。通常情况下,Master可用的功能比Slave多。

case class HandShake(payloadWidth: Int) extends Bundle with IMasterSlave {
	val valid = Bool()
	val ready = Bool()
	val payload = Bits(payloadWidth bits)
	
	// 你需要实现asMaster函数。
	// 这个函数应该从master的角度设置每个信号的方向
	override def asMaster(): Unit = {
		out(valid, payload)
		in(ready)
	}
}

val io = new Bundle {
	val input = slave(HandShake(8))
	val output = master(HandShake(8))
}

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

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

相关文章

《.NET 下最快比较两个文件内容是否相同》之我的看法验证

我对文件对比这一块还是比较感兴趣的,也想知道哪种方式性价比最高,效率最好,所以,根据这篇文章,我自己也自测一下,顺便留出自己对比的结果,供大佬们参考一二。 大致对比方案 我这边根据文章里…

循环队列(Ring Buffer)

背景: 最近在复习数据结构和算法,顺带刷刷题,虽然很长时间不刷题了但还是原来熟悉的味道,每一次重学都是加深了上一次的理解。本次我们看一下 循环队列(Ring Buffer),C语言实现。 循环队列:首先 它是一个队…

chatgpt赋能python:Python安装好后怎么写代码?

Python安装好后怎么写代码? Python是一种高级编程语言,已成为众多开发者的首选工具。根据一些统计数据,Python排名全球第三的流行语言,已经成为Web开发、数据科学和人工智能领域的首选语言。如果您刚刚安装了Python,那…

【LeetCode全题库算法速练】6、N 字形变换

文章目录 一、题目🔸题目描述🔸样例1🔸样例2🔸样例3 二、代码参考 作者:KJ.JK 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &a…

YOLOv5/v7 添加注意力机制,30多种模块分析①,SE模块,SK模块

目录 一、注意力机制介绍1、什么是注意力机制?2、注意力机制的分类3、注意力机制的核心 二、SE模块1、SE模块的原理2、代码实例3、实验结果4、应用示例(1)在 models/yolo.py 文件中定义 SEModule 类,用于实现SE模块。(…

pyautogui实现自动连接GP VPN

支线小小项目(pyautogui实现自动连接GP VPN) 用了pyautogui做了一个懒人小脚本,主要是在家上班,每天要连公司vpn, 然后还要等好久,公司用的GP(global protect) VPN, 长这个样子 主要问题每次点击connect后需要等他先出来windows NT的login认…

Web安全总结

目录 网站架构一般web服务器结构相比于传统的网络攻击,基于web的攻击有什么不同?HTTP协议HTTP响应拆分攻击HTTPS针对HTTPS协议的攻击那么如何保证证书的唯一性? HTTP会话Cookie和Session的关系HTTP会话攻击解决方案 Web访问中的隐私问题Web应…

【读书笔记】《贫穷的本质》- [印度] Abhijit Banerjee / [法] Esther Duflo

文章目录 前言第一章 再好好想想第一部分 生活案例第二章 饥饿人口已达到10亿?第三章 提高全球居民健康水平容易吗?第四章 全班最优 前言 扶贫政策方面充斥着会取得立竿见影的效果的泡沫,事实证明这一点儿也不奇怪。要想取得进展,…

sed:命令讲解一

sed的使用: sed的使用 一、sed1.定义:2.工作流程:读取,执行,显示。3.基本操作格式:4.sed操作符:5.扩展: 一、sed 1.定义: 一种流编辑器,会在编辑器处理数据…

浅谈发改委强化电力需求侧管理缓解电力系统峰值压力方案设计 安科瑞 许敏

摘要:近年来全国用电负荷特别是居民用电负荷的快速增长,全国范围内夏季、冬季用电负荷“双峰”特征日益突出,恶劣气候现象多发增加了电力安全供应的压力。具有随机性、波动性、间歇性特征的可再生能源大规模接入电网对电力系统的稳定性带来新…

MySQL 索引及查询优化总结

一个简单的对比测试 前面的案例中,c2c_zwdb.t_file_count表只有一个自增id,FFileName字段未加索引的sql执行情况如下: 在上图中,typeall,keynull,rows33777。该sql未使用索引,是一个效率非常低…

chatgpt赋能python:Python安装HanLP:一个强大的NLP工具

Python安装HanLP:一个强大的NLP工具 HanLP是一个基于Python编写的神经网络自然语言处理工具,它提供给我们强大的文本处理和分析能力。在这篇文章中,我们将介绍如何在Python中安装并使用HanLP工具。如果你是一个文本处理和分析的爱好者或者工…

chatgpt赋能python:Python安装到U盘——实现随时随地的编程

Python安装到U盘——实现随时随地的编程 Python是一种广泛使用的动态解释型编程语言,简单易学,适用性广泛,被广泛应用于数据分析、Web开发、人工智能等领域。想要充分发挥Python的优势,随时随地进行编程,我们可以将Py…

人工智能正迎来量子飞跃——

光子盒研究院 6月1日,量子计算领域的行业领导者IonQ公布了其应用量子计算机模拟人类认知的一项早期研究结果。这篇论文描述了世界上第一个公开的方法:研究团队已将一个基本的人类认知模型在量子硬件上运行,这为模仿人类思维方式的改进决策模型…

Day_42哈希表

目录 一. 关于哈希表 二. 如何实现哈希表 1. 散列函数 2. 散列表 3. 散列函数的构造方法 4. 处理冲突的方法 三. 代码实现 1. 构造函数构造哈希表 2. 哈希表的查找 四. 代码展示 五. 数据测试​编辑 六. 总结 一. 关于哈希表 在前面介绍的线性表的查找中,记录在表中的位置…

RabbitMQ入门案例之Simple简单模式

RabbitMQ入门案例之Simple简单模式 前言什么是Simple模式Simple模式操作RabbitMQ管理界面的部分介绍 前言 本文将介绍RabbitMQ的七种工作模式的第一种Simple模式的代码实现,编程工具使用的是IDEA,在RabbitMQ中的工作模式都是生产消费模型 生产者消费模型…

Android系统的Ashmem匿名共享内存子系统分析(4)- Ashmem子系统的 Java访问接口

声明 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法,记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾…文中参考了很多书籍及博客内容,可能涉及的比较…

【云原生】Docker镜像的创建

1.Dokcer镜像的创建 创建镜像有三种方法,分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 1.1 基于现有镜像创建 (1)首先启动一个镜像,在容器里做修改 docker run -it --name web centos:7 /…

2023年6月 国内大语言模型对比【国内模型正在崛起】

先说一下这个文章怎么来的。因为朋友问我大语言模型可以生成公务员面试回答不,我说可以啊。之前看文心有这个服务。我想最近好几个模型也没用了测一把!结果!大吃一惊!我觉得我的三个傻孩子长大了!(chatglm1…

chatgpt赋能python:Python如何降低版本:提升代码兼容性与SEO效果

Python如何降低版本:提升代码兼容性与SEO效果 在大多数情况下,使用Python的最新版本是最好的选择。新版本通常提供更好的性能和更多的功能,同时也有更好的安全性和稳定性。然而,有些情况下,我们需要运行旧版本的Pytho…