【SpinalHDL快速入门】4.2、基本类型之Bits

news2024/12/24 8:40:48

文章目录

    • 1.1、描述
    • 1.2、声明
    • 1.3、运算符
      • 1.3.1、逻辑运算(Logic)
      • 1.3.2、比较(Comparison)
      • 1.3.3、类型转换(Type cast)
      • 1.3.4、部分赋值/提取操作符(Bit extraction)
      • 1.3.5、杂项(Misc)
      • 1.3.6、MaskedLiteral

在这里插入图片描述

1.1、描述

Bits类型对应于一个不传达任何算术含义的位向量

1.2、声明

声明位向量的语法如下:(方括号中的所有内容都是可选项)

在这里插入图片描述

// Declaration
val myBits = Bits() // the size is inferred
val myBits1 = Bits(32 bits)
val myBits2 = B(25, 8 bits)
val myBits3 = B"8’xFF" 	// Base could be x,h (base 16)
						// d (base 10)
						// o (base 8)
						// b (base 2)
val myBits4 = B"1001_0011" // _ can be used for readability

// Element【这个赋值方式有点意思,之前其他语言都没见过】
val myBits5 = B(8 bits, default -> True) // "11111111"
val myBits6 = B(8 bits, (7 downto 5) -> B"101", 4 -> true, 3 -> True, default -> false) // "10111000"
val myBits7 = Bits(8 bits)
myBits7 := (7 -> true, default -> false) // "10000000" (For assignment purposes, you can omit the B)

1.3、运算符

以下运算符可用于 Bits 类型:

1.3.1、逻辑运算(Logic)

在这里插入图片描述

// Bitwise operator
val a, b, c = Bits(32 bits)
c := ~(a & b) // Inverse(a AND b)

val all_1 = a.andR // Check that all bits are equal to 1

// Logical shift
val bits_10bits = bits_8bits << 2 // shift left (results in 10 bits)
val shift_8bits = bits_8bits |<< 2 // shift left (results in 8 bits)

// Logical rotation
val myBits = bits_8bits.rotateLeft(3) // left bit rotation

// Set/clear
val a = B"8’x42"
when(cond) {
	a.setAll() // set all bits to True when cond is True
}

注意:

  • 1、 这里值得注意的是:&、|、^操作符中x,y的宽度必须保持一致,否则在生成RTL代码时将提示不能正常编译(可使用resized方法自动扩展剪裁位宽),相当于把RTL中的位宽不匹配警报消除在设计阶段。

  • 2、对于逻辑右移操作:x>>y,y变量类型的不同所产生的结果也不同。y为UInt时和Verilog是比较符合的,移位前后位数不变。实验代码如下:

有点意思的东西,可以琢磨一下

SpinalHDL代码:

package test

import spinal.core._


case class BitsInst() extends  Component {
  val data_in1=in Bits(16 bits)
  val data_out1=out Bits()
  val data_out2=out Bits()
  data_out1:=data_in1>>3
  data_out2:=data_in1>>U(3) //类型转换为UInt,默认是Int
}

object MyTopLevelApp extends App{
  SpinalConfig().generateSystemVerilog(BitsInst())
}

注意:直接写数字,代表Scala中的Int

// Generator : SpinalHDL v1.6.0    git head : 73c8d8e2b86b45646e9d0b2e729291f2b65e6be3
// Component : BitsInst



module BitsInst (
  input      [15:0]   data_in1,
  output     [12:0]   data_out1,
  output     [15:0]   data_out2
);

  assign data_out1 = (data_in1 >>> 3); //默认Int移位后进行截断,不会高位补0
  assign data_out2 = (data_in1 >>> 2'b11); //移位后还是原来的位数,高位补0

endmodule

1.3.2、比较(Comparison)

在这里插入图片描述

when(myBits === 3) {
}

when(myBits_32 =/= B"32’x44332211") {
}

1.3.3、类型转换(Type cast)

在这里插入图片描述

将 Bool、UInt 或 SInt 转换为 Bits,您可以使用 B(something):

// cast a Bits to SInt
val mySInt = myBits.asSInt

// create a Vector of bool
val myVec = myBits.asBools

// Cast a SInt to Bits
val myBits = B(mySInt)

1.3.4、部分赋值/提取操作符(Bit extraction)

在这里插入图片描述

对于x(offset,width bits),其意味着从offset比特位开始,向上截取width比特位宽

// get the element at the index 4
val myBool = myBits(4)

// assign
myBits(1) := True

// Range
val myBits_8bits = myBits_16bits(7 downto 0)
val myBits_7bits = myBits_16bits(0 to 6)
val myBits_6bits = myBits_16Bits(0 until 6)

myBits_8bits(3 downto 0) := myBits_4bits

有点意思的东西,可以琢磨一下

Range的三种表示范围

在这里插入图片描述

  • 简而言之:todownto是左右闭区间,until是左闭右开区间。

1.3.5、杂项(Misc)

在这里插入图片描述

注意:validRange仅适用于最小值和最大值适合于有符号32位整数的类型。 (这是由Scala范围类型给出的限制,它使用Int)

println(myBits_32bits.getWidth) // 32

myBool := myBits.lsb // Equivalent to myBits(0)

// Concatenation
myBits_24bits := bits_8bits_1 ## bits_8bits_2 ## bits_8bits_3

// Subdivide
val sel = UInt(2 bits)
val myBitsWord = myBits_128bits.subdivideIn(32 bits)(sel) //根据sel的取值个数,平均分成这么多份!
// sel = 0 => myBitsWord = myBits_128bits(127 downto 96)
// sel = 1 => myBitsWord = myBits_128bits( 95 downto 64)
// sel = 2 => myBitsWord = myBits_128bits( 63 downto 32)
// sel = 3 => myBitsWord = myBits_128bits( 31 downto 0)

// If you want to access in reverse order you can do:
val myVector = myBits_128bits.subdivideIn(32 bits).reverse
val myBitsWord = myVector(sel)

// Resize(有点意思!!!)
myBits_32bits := B"32’x112233344"
myBits_8bits := myBits_32bits.resized // automatic resize (myBits_8bits = 0x44)
myBits_8bits := myBits_32bits.resize(8) // resize to 8 bits (myBits_8bits = 0x44)
myBits_8bits := myBits_32bits.resizeLeft(8) // resize to 8 bits (myBits_8bits = 0x11)

resized 有点意思的东西,可以琢磨一下

1.3.6、MaskedLiteral

MaskedLiteral值是带有“-”的位向量,表示不关心的值。【下面的M就表示MaskedLiteral】

val myBits = B"1101
val test1 = myBits === M"1-01" // True
val test2 = myBits === M"0---" // False
val test3 = myBits === M"1--1" // True

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

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

相关文章

Redis的使用规范小建议

Redis 核心技术与实战 笔记 作者&#xff1a; 蒋德钧 毕竟&#xff0c;高性能和节省内存&#xff0c;是我们的两个目标&#xff0c;只有规范地使用Redis&#xff0c;才能真正实现这两个目标。如果说之前的内容教会了你怎么用&#xff0c;那么今天的内容&#xff0c;就是帮助你用…

ChatGPT的学习过程【分析ChatGPT原理】+如何高效使用GPT

ChatGPT的学习过程【分析ChatGPT原理】如何高效使用GPT 此处借鉴&#xff1a;台湾大学李宏毅老师的讲解 资料&#xff1a;pan.baidu.com/s/1Jk1phne3ArfOERYNTPL12Q?pwd1111 GPTGenerative Pre-trained Transformer生成式预训练转换模型 ChatGPT共有四个学习阶段 学习文字接龙…

Java性能权威指南-总结7

Java性能权威指南-总结7 垃圾收集算法理解Throughput收集器堆大小的自适应调整和静态调整理解CMS收集器 垃圾收集算法 理解Throughput收集器 Throughput收集器有两个基本的操作&#xff1b;其一是回收新生代的垃圾&#xff0c;其二是回收老年代的垃圾。 下图展示了堆在新生代…

Python配置MySQL数据库使用

创建配置文件 config.ini [MySQL] host 172.xxx.xxx.xxx port 3306 user root password ****** db bgp_routing charset utf8创建读取配置文件 readConfig.py import configparser from pathlib import Pathclass ReadConfig():def __init__(self):configDir Path.cwd…

【学习日记2023.6.6】之 Linux环境下部署Java项目

文章目录 5. 项目部署5.1 手动部署项目5.2 基于Shell脚本自动部署5.2.1 介绍5.2.2 推送代码到远程5.2.3 Git操作5.2.4 Maven安装5.2.5 Shell脚本准备5.2.6 Linux权限5.2.7 授权并执行脚本5.2.8 设置静态IP 5. 项目部署 开发的项目绝大部分情况下都需要部署在Linux系统中。下面通…

springboot+vue多维的知识分类管理系统

随着国内市场经济这几十年来的蓬勃发展&#xff0c;突然遇到了从国外传入国内的互联网技术&#xff0c;互联网产业从开始的群众不信任&#xff0c;到现在的离不开&#xff0c;中间经历了很多挫折。本次开发的多维分类的知识管理系统有管理员和用户两个角色。管理员可以管理用户…

Dozzle-解决通过命令方式查看Docker 日志的神器

对于程序员们来说&#xff0c;Docker 一定是不陌生了。Docker 为我们的工作带来的巨大的便利&#xff0c;你可以使用它快速部署和扩展应用程序&#xff0c;并保证隔离性和可移植性&#xff0c;使应用程序在容器内独立运行&#xff0c;而且可以轻松地在不同的主机和操作系统上移…

bpmn是什么?bpmn.js的简单使用

文章目录 一、bpmn.js是什么&#xff1f;二、使用步骤1.引入bpmn2.使用bpmn3.引入bpmn-左侧工具栏4.引入bpmn-左侧工具栏5.引入bpmn数据导出6.数据导出为svg格式7.监听modeler并绑定事件7.监听element点击……8.自定义左侧工具栏图标9.自定义左侧工具栏完整效果 总结 一、bpmn.…

推动体系建设 助推融合发展|2023 开放原子全球开源峰会软件物料清单(SBOM)分论坛即将启幕

软件物料清单对于普通人而言可能很陌生&#xff0c;而对于从业者而言&#xff0c;软件物料清单是以 “开源” 为核心&#xff0c;通过有效识别和记录软件组成成分及相互依赖关系&#xff0c;保障软件全生命周期各环节要素的可控制、可预测、可管理。 由开放原子开源基金会主办…

云原生Docker网络管理和数据卷

Docker网络 Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c; Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c; 同时Docker网桥是每个容器的默认网关。 …

案例26:基于Springboot校园社团管理系统开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

那些你可能遇到的 Linux 命令?什么,你还不知道?赶紧收藏?完善中!

文章目录 一. Linux 进程1. 通过进程名查找进程号1.1 ps aux & ps -ef&#xff1a;diff1.2 ps aux & ps -aux&#xff1a;什么&#xff1f;它们不一样&#xff1f;1.3 grep & awk&#xff1a;取出进程号、取出进程号并 Kill 2. 通过进程号查看进程信息&#xff1a;…

视频理解学习笔记(四)

视频理解学习笔记&#xff08;四&#xff09; 3D CNNC3DI3DNon-local算子 &#xff08;Self-attention替换掉LSTM&#xff09;R (2 1) DSlowFast Video TransformerTimeSformer 总结Reference 3D CNN 双流的缺点&#xff1a;光流抽取太慢——tvl one算法&#xff0c;0.06s抽取…

什么是浅拷贝和深拷贝

javascript 中有不同的方法来复制对象,那么我们怎样才能正确地复制一个对象呢?&#xff0c;本文来介绍一下浅拷贝和深拷贝。 一、什么是浅拷贝(Shallow Copy) 浅拷贝是创建一个新对象&#xff0c;这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型&#xff0c;拷…

遗传算法在数学建模中的应用及MATLAB实现

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 遗传算法基本概念 遗传算法原理 MATLAB实现 1. 使用ga求解遗传算法问题 数学建模案例&#xff1a;旅行商问题&#xff08;TSP&#xf…

操作系统原理 —— 内存连续分配管理方式(二十)

在之前的章节中&#xff0c;我们到了内存管理&#xff0c;其中有一个很重要的功能&#xff0c;就是对操作系统中的内存进行分配和回收。 那如何对操作系统的内存进行分配呢&#xff1f; 整体上可以分为两种方式&#xff1a;连续分配管理方式、非连续分配管理方式。 这里提到的…

【vue3】08-vue的组件化开发-插槽(Slots)的完全指南

Vue插槽&#xff08;Slots&#xff09;的完全指南 插槽的作用插槽的基本使用具名插槽作用域插槽&#xff08;难点&#xff09; 插槽的作用 在开发中&#xff0c;我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示;但是为…

【CVPR2023】TPS详解:联合令牌剪枝与压缩以实现视觉变形器更积极的压缩

【CVPR2023】TPS详解&#xff1a;联合令牌剪枝与压缩以实现视觉变形器更积极的压缩 0. 引言1. 为什么要使用TPS&#xff1f;2. TPS介绍3. TPS 详解3.1 重要性计算3.2 令牌压缩3.2.1 匹配3.2.2 融合 4. 简化版理解5. 总结 0. 引言 虽然 Vision Transformers &#xff08;ViTs&a…

小文智能宣布接入ChatGPT,智能化客户服务,开创全新用户体验

小文智能是一家致力于用AI技术解放劳动力的公司&#xff0c;最近我们接入了ChatGPT技术&#xff0c;深度探索AI在智能对话机器人领域应用的更多可能&#xff0c;这将为我们的客户带来更为优质的人机对话服务和全新的用户体验。 ChatGPT是一种基于人工智能的自然语言处理技术&a…

案例31:基于Springboot企业员工薪酬关系系统开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…