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

这篇具有很好参考价值的文章主要介绍了【SpinalHDL快速入门】4.2、基本类型之Bits。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1.1、描述

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

1.2、声明

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

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

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

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

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

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

when(myBits === 3) {
}

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

1.3.3、类型转换(Type cast)

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

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

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

对于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的三种表示范围

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

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

1.3.5、杂项(Misc)

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

注意: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】文章来源地址https://www.toymoban.com/news/detail-474201.html

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

到了这里,关于【SpinalHDL快速入门】4.2、基本类型之Bits的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust 基础入门 —— 基本类型

    在Rust 中,作为强类型语言,自然会独立一块内容用作类型管理工作,而rust 中 为应用领域的扩展, 兼容了很多的数学计算方面的 内容,加到了基本类型中,例如 复数, 在有向图和 矢量图计算中的应用,rust 通过自带的类型设计避免了 程序员再开发的任务难度。 总的来说

    2024年02月12日
    浏览(30)
  • Redis入门 - 5种基本数据类型

    原文首更地址,阅读效果更佳! Redis入门 - 5种基本数据类型 | CoderMast编程桅杆 https://www.codermast.com/database/redis/five-base-datatype.html 说明 在我们平常的业务中基本只会使用到Redis的基本数据类型(String、List、Hash、Set、Sorted Set),特殊类型(Geo、Bitmap、Hyperloglog)类型只有在特殊

    2024年02月09日
    浏览(24)
  • 【openGauss基本概念---快速入门】

    👈【上一篇】 💖The Begin💖 点点关注,收藏不迷路💖 【下一篇】👉 🔰 1.1 openGauss openGauss是一款 关系型数据库管理系统 —RDBMS。关系型数据库是指采用了关系模型来组织数据的数据库, 以行和列的形式存储数据 。 openGauss的数据库节点负责存储数据,其 存储介质是磁盘

    2024年02月09日
    浏览(29)
  • Kotlin系列一(快速入门,kotlin的数据类型)

    kontlin可以写脚本 创建一个\\\"script.kts\\\"文件 编写脚本内容 使用 kotlinc -script script.kts 命令运行kotlin脚本 创建一个文件\\\"HelloWorld.kt\\\" 编写内容 使用 kotlinc HelloWorld.kt 编译kotlin代码 使用 kotlin HelloWorld Kt运行编译后的字节码 使用\\\"var\\\"定义变量,变量定义后值可以改变,且可以在定义

    2024年02月03日
    浏览(32)
  • 【RabbitMQ】快速入门及基本使用

    Ⅰ、什么是消息队列?         消息队列是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及

    2024年01月20日
    浏览(27)
  • Spring Cloud 快速入门基本介绍

    😀前言 本篇博文是关于Spring Cloud 基本介绍,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰 如果文

    2024年02月10日
    浏览(30)
  • Shell编程——弱数据类型的脚本语言快速入门指南

    目录 Linux Shell 数据类型 变量类型 运算符 算术运算符 赋值运算符 拼接运算符 比较运算符 关系运算符 控制结构 顺序结构 条件分支结构 if 条件语句 case 分支语句  循环结构 for 循环 while 循环 until 循环 break 语句 continue语句 函数 函数定义  函数名 函数体 返回值 参数 函数的

    2024年02月12日
    浏览(47)
  • 4.2 Spark SQL数据源 - 基本操作

    案例演示读取Parquet文件 查看Spark的样例数据文件users.parquet 1、在Spark Shell中演示 启动Spark Shell 查看数据帧内容 查看数据帧模式 对数据帧指定列进行查询,查询结果依然是数据帧,然后通过write成员的save()方法写入HDFS指定目录 查看HDFS上的输出结果 执行SQL查询 查看HDFS上的输

    2024年02月08日
    浏览(31)
  • 快速入门Maxwell基本操作流程(3D部分)

    作者:金广林 第一步:建模 先绘制出五边形(截面) 再绘制框线的路径 将四段框线合并 (全选中后unite) 选中路径和截面,Draw- sweep- along path(让截面沿着路径扫过) 确定之后模型如图所示  添加材料    双击后点击edit,挑一个材料 这里选了铜copper 第二步:添加激励源 首

    2024年02月06日
    浏览(57)
  • JAVA包装类和基本数据类型------JAVA入门基础教程

    public class WrapperTest {     public static void main(String[] args)     {         int i1 = 10;         Integer i11 = new Integer(i1);         System.out.println(i11);         float f1 = 12.3F;         f1 = 32.2F;         Float ff1 = new Float(f1);         System.out.println(ff1);         String s1 = \\\"32.1\\\";         F

    2024年02月02日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包