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

news/2025/2/15 21:41:45/

文章目录

    • 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 = AnyTypeval bundleItem1 = AnyTypeval 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 := 0val color2 = Color(8)
color2.r := 0
color2.g := 0
color2.b := 0myBool := 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.readClockWiremm.io.clk_out := clockDomain.readClockWiremm.io.we := io.wemm.io.addr_wr := io.addrWr.asBitsmm.io.d := io.dataIn.asBitsmm.io.addr_rd := io.addrRd.asBitsio.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.ppmy.cn/news/252471.html

相关文章

C++与Qt深度融合:高效设计多线程应用框架

C与Qt深度融合:高效设计多线程应用框架 1. C与Qt线程的混合使用1.1 C线程与Qt线程的基本概念1.2 线程间的相互依赖关系1.3 设计合理的代码框架 二、深入理解C和Qt线程模型2.1 C线程模型2.2 Qt线程模型2.3 C和Qt线程模型的比较 三、C和Qt线程间的互操作性3.1 std::th…

Linux命令学习之文本查看命令cat、head和tail

for i in {1..100} do echo $i >> good.txt done把1到100写入到good.txt文件中。接下来使用good.txt这个文件来演示查看文本查看命令。 cat man cat可以看一下帮助使用说明,按q可以退出。 cat是连接文件并把文件内容输出到标准输出上。cat good.txt就可以…

内网安全:隧道技术详解

目录 隧道技术 反向连接技术 反向连接实验所用网络拓扑图及说明 网络说明 防火墙限制说明 实验前提说明 实战一:CS反向连接上线 - 拿下Win2008 一. 使用转发代理上线创建监听器 二. 上传后门执行上线 隧道技术 - SMB协议 SMB协议介绍 实战二&#xff1a…

用Python写一个天天酷跑

感觉上次写的植物大战僵尸与俄罗斯方块的反应还不错,这次这个文章就更有动力了 这次就写一个天天酷跑吧 Python源码、问题解答学习交流群:773162165 写出来的效果图就是这样了 下面就更新一下全部的代码吧 还是老样子先定义 import pygame,sys import r…

几行代码就做出一个天天酷跑,你学会了吗?

首先看效果,是这样滴: 下面就更新一下全部的代码吧,还是老样子先定义。 import pygame,sys import random写一下游戏配置 width 1200 #窗口宽度 height 508 #窗口高度 size width, height scoreNone #分数 myF…

用 Python 写一个天天酷跑 | 内附源码

写出来的效果图就是这样了: 相关文件 小伙伴们可以关注小编的Python源码、问题解答&学习交流群:733089476 有很多的资源可以白嫖的哈,需要源码的小伙伴可以在君羊领取 下面就更新一下全部的代码吧 还是老样子先定义 import pygame,sys import …

如何用python做出一个游戏——《天天酷跑》

众所周知,python的功能非常强大,可以发展的方向有很多!这里也包括了制作一些中小型的游戏,当然!大型游戏也是可以做的!但是不常见用python! 今天给大家分享一个用python做出一个简易版的《天天…

用Python写了一个天天酷跑(附源码)

感觉上次写的植物大战僵尸与俄罗斯方块的反应还不错,这次这个文章就更有动力了 这次就写一个天天酷跑吧 写出来的效果图就是这样了 下面就更新一下全部的代码吧 还是老样子先定义 import pygame,sys import random学习Python加V:tz16494 写一下游戏配置…