吃透Chisel语言.05.Chisel基础(二)

您所在的位置:网站首页 不二cat 吃透Chisel语言.05.Chisel基础(二)

吃透Chisel语言.05.Chisel基础(二)

2023-12-17 23:36| 来源: 网络整理| 查看: 265

Chisel基础(二)——组合电路与运算符

组合逻辑电路从数学的角度来讲,就是用布尔代数的操作符来描述的数字逻辑电路,也就是一系列布尔代数运算符的组合。Chisel中,这些布尔代数的操作符跟C、Java、Scala以及其他编程语言中定义的是类似的,比如,&是按位与操作符,|是按位或操作符。这一部分就详细介绍Chisel中基本的位运算符、算术运算符、逻辑运算符、比较运算符等,以及Chisel中的一个高阶组合电路运算符——多路选择器。

一个简单组合逻辑电路的例子

下面这一行代码,定义了一个组合电路,它用一个与门连接信号a和b,然后把这个与门的输出和信号c用或门连接在一起:

val logic = (a & b) | c

这个表达式对应的电路示意图如下:

在这里插入图片描述

可以看到基础语法是很简单的,需要注意的是,这个电路中与门和或门的输入信号可以是单个比特,也可以是比特向量。

Chisel中的位运算符

下面的例子分别演示了四种基本的位运算,用的是Scala中的标准运算符,他们的操作数可以是UInt、SInt和Bool:

val and = a & b // 按位与 val or = a | b // 按位或 val xor = a ^ b // 按位异或 val not = ~a // 按位取反

这几种基本的位运算都很基础,还有两个移位操作,他们的操作数可以是UInt或SInt:

val shiftleft = a b

需要注意的是,对于SInt类型的操作数,右移或会进行符号拓展,即算术右移。

总结Chisel中的位运算符如下:

操作符描述数据类型&按位与UInt、SInt、Bool``按位或^按位异或UInt、SInt、Bool~按位取反UInt、SInt、Bool对于UInt是逻辑右移,对于SInt是算术右移UInt、SInt Chisel中的算术运算符

下面是Chisel中使用Scala标准运算符进行的算术运算,他们的操作数可以是UInt或SInt:

val add = a + b // 加法 val sub = a - b // 减法 val neg = -a // 取相反数 val mul = a * b // 乘法 val div = a / b // 除法 val mod = a % b // 取余

需要注意这里的位宽推断:

对于加减法,结果宽度为操作数中最宽的那个宽度;对于乘法,结果宽度为操作数的宽度之和;对于除法和取余,结果宽度通常为被除数的宽度;

另外,对于加法和减法,还可以指定是否进行位宽拓展保留进位,在+或-后加上%就是不进行位宽拓展,加上&就是不保留进位,默认是不进行位宽拓展。

总结Chisel中的算术运算符如下:

操作符描述数据类型+或+%加(不保留进位)UInt、SInt+&加(保留进位)UInt、SInt-或-%减(不保留进位)UInt、SInt-&减(保留进位)UInt、SInt*乘UInt、SInt/除UInt、SInt%取余UInt、SInt Chisel中的逻辑运算符

逻辑运算符是针对Bool类型的值进行运算的,有逻辑与、逻辑或和逻辑非这三种,和Scala以及其他编程语言是类似的:

操作符描述数据类型&&逻辑与Bool``!逻辑非Bool Chisel中的比较运算符

对于小于、小于等于、大于和大于等于,Chisel和Scala是一致的,但在等于和不等于上表示不一样。比较运算符的操作数为UInt或SInt,总结如下:

操作符描述数据类型>大于UInt、SInt,返回Bool>=大于等于UInt、SInt,返回Bool


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3