UFix/SFix
UFix 和 SFix 类型对应于可用于定点算术的位向量。
声明
声明定点数的语法如下:
Unsigned Fixed-Point
Signed Fixed-Point
格式
所选格式遵循使用 Q 表示法定义定点数格式的常用方法。例如 Q8.2 将表示 8+2 位的定点数,其中 8 位用于自然部分,2 位用于小数部分。如果定点数是有符号的,则多使用一位作为符号。分辨率定义为可以用这个数字表示的 2 的最小幂。
为了使表示 2 的幂的数字更不容易出错,在
spinal.core
called 中有一个数字类型,ExpNumber
用于定点类型构造函数。这种类型的便利包装器以exp
函数的形式存在(在本页的代码示例中使用)。
示例
// Unsigned Fixed-Point val UQ_8_2 = UFix(peak = 8 exp, resolution = -2 exp) // bit width = 8 - (-2) = 10 bits val UQ_8_2 = UFix(8 exp, -2 exp) val UQ_8_2 = UFix(peak = 8 exp, width = 10 bits) val UQ_8_2 = UFix(8 exp, 10 bits) // Signed Fixed-Point val Q_8_2 = SFix(peak = 8 exp, resolution = -2 exp) // bit width = 8 - (-2) + 1 = 11 bits val Q_8_2 = SFix(8 exp, -2 exp) val Q_8_2 = SFix(peak = 8 exp, width = 11 bits) val Q_8_2 = SFix(8 exp, 11 bits)
赋值操作
当没有比特丢失时,对定点值的赋值是有效的。任何位丢失都会导致错误。如果源定点值太大,该.truncated
函数将允许您调整源数字的大小以匹配目标大小。
示例
val i16_m2 = SFix(16 exp, -2 exp) val i16_0 = SFix(16 exp, 0 exp) val i8_m2 = SFix( 8 exp, -2 exp) val o16_m2 = SFix(16 exp, -2 exp) val o16_m0 = SFix(16 exp, 0 exp) val o14_m2 = SFix(14 exp, -2 exp) o16_m2 := i16_m2 // OK o16_m0 := i16_m2 // Not OK, Bit loss o14_m2 := i16_m2 // Not OK, Bit loss o16_m0 := i16_m2.truncated // OK, as it is resized o14_m2 := i16_m2.truncated // OK, as it is resized
Scala常量
在分配给 UFix 或 SFix 信号时,Scala BigInt 或 Double 类型可用作常量。
val i4_m2 = SFix(4 exp, -2 exp) i4_m2 := 1.25 // Will load 5 in i4_m2.raw i4_m2 := 4 // Will load 16 in i4_m2.raw
原始值
可以使用该raw
属性读取或写入定点数的整数表示。
val UQ_8_2 = UFix(8 exp, 10 bits) UQ_8_2.raw := 4 // Assign the value corresponding to 1.0 UQ_8_2.raw := U(17) // Assign the value corresponding to 4.25
运算操作
以下运算符可用于该UFix
类型:
算术运算
Comparison
类型转换
其他
Reference
- spinal HDL官方文档