SpinalHDL之模块库工具

本文作为SpinalHDL学习笔记第十七篇,记录使用SpinalHDL模块库的一些实用工具。

SpinalHDL学习笔记总纲链接如下:

SpinalHDL 学习笔记_spinalhdl blackbox-CSDN博客

目录:

1.免状态工具

2.全状态工具

3.特殊工具

1.免状态工具

语法

返回类型

描述

toGray(x : UInt)

返回从 x (UInt) 转换而来的灰度值

fromGray(x : Bits)

UInt

返回从 x (灰度) 转换而来的 UInt 值

Reverse(x : T)

T

翻转所有位 (lsb + n -> msb - n)

OHToUInt(x :Seq[Bool])
OHToUInt(x : BitVector)

UInt

返回 x 中唯一被设置(为 1)的比特位的索引

CountOne(x : Seq[Bool])
CountOne(x : BitVector)

UInt

返回 x 中被设为 1 的位数

MajorityVote(x :Seq[Bool])
MajorityVote(x :BitVector)

Bool

如果设置为 1 的位数 > x.size / 2,则返回 True

EndiannessSwap(that:
T[, base:BitCount])

T

大端 <-> 小端

OHMasking.frst(x : Bits)

对 x 应用掩码以仅保留第一个设为 1 的位

OHMasking.last(x : Bits)

对 x 应用掩码以仅保留最后一个设为 1 的位

OHMasking.roundRobin(
requests : Bits,
ohPriority : Bits
)

对 x 应用掩码以仅保留 requests 中设置 1 的位。
它从 ohPriority 位置开始访问 requests 。
例如,如果 requests 为“1001”且 ohPriority 为
“0010”,则 roundRobin 函数将从第二位开始访问 requests 并
返回“1000”。

MuxOH (
oneHot :
IndexedSeq[Bool],
inputs : Iterable[T]
)

T

根据 oneHot 向量从 inputs 中返回多路复用的 T 。

PriorityMux (
sel: Seq[Bool],
in: Seq[T]
)

T

返回第一个其 sel 为 True 的 in 元素。

PriorityMux (
in: Seq[(Bool, T)]
)

T

返回第一个其 sel 为 True 的 in 元素。

2.全状态工具

语法

返 回 类型

描述

Delay(that: T, cycleCount: Int)

T

返回延迟了 cycleCount 周期的 that

History(that: T, length: Int[,when :
Bool])

List[T]

返回长度为 length 的 Vec其第一个元素是 that ,最后一个元素是延迟了length-1 的 “that“内部移位寄存器会在 when 有效时采样

BufferCC(input : T)

T

返回利用两个触发器同步到当前时钟域的同步输入信号

计数器

计数器工具可用于轻松实例化硬件计数器。

实例化语法

备注

Counter(start: BigInt, end:BigInt[, inc : Bool])

Counter(range : Range[, inc :Bool])

与 x to y x until y 语法兼容

Counter(stateCount: BigInt[, inc :Bool])

从 0 开始,到 stateCount - 1 结束

Counter(bitCount: BitCount[, inc :Bool])

从 0 开始到 (1 << bitCount) - 1 结束

计数器可以通过方法控制,并且可以连线可以被读取:

val counter = Counter(2 to 9) // Creates a counter of 8 states (2 to 9)
// Methods
counter.clear() // Resets the counter
counter.increment() // Increments the counter
// Wires
counter.value // Current value
counter.valueNext // Next value
counter.willOverflow // True if the counter overflows this cycle
counter.willOverflowIfInc // True if the counter would overflow this cycle if␣,→an increment was done
// Cast
when(counter === 5){ ... } // counter is implicitly casted to its current value

当 Counter 溢出(达到最终值)时,它会重新启动下一个周期并设置为起始值。

Note:目前仅支持向上计数器。

CounterFreeRun 构建一个始终运行的计数器: CounterFreeRun(stateCount: BigInt) 。

超时

超时工具可用于方便地实例化一个硬件超时。

实例化语法

备注

Timeout(cycles : BigInt)

在 cycles 个时钟后标记

Timeout(time : TimeNumber)

在持续 time 时间后标记

Timeout(frequency : HertzNumber)

以“frequency“频率进行标记

下方是可以与 Counter 工具一起使用的不同语法句式的示例:

 val timeout = Timeout(10 ms) //Timeout who tick after 10 ms
when(timeout) { //Check if the timeout has tick
timeout.clear() //Ask the timeout to clear its flag
}

Note: 如果使用时间或频率设置实例化 Timeout ,则隐含地 ClockDomain 应该具有频率设置。

复位控制

复位控制 (ResetCtrl) 提供了一些实用工具来管理复位。

asyncAssertSyncDeassert

可 以 使 用 异 步 有 效 同 步 无 效 逻 辑 来 筛 选 异 步 复 位。 为 此可 以 使 用 ResetCtrl.

asyncAssertSyncDeassert 函数返回筛选后的值。

参数名称

类型

描述

input

Bool

被筛选的信号

clockDomain

ClockDomain

返回将使用所筛选值的时钟域 (ClockDomain)

inputPolarity

Polarity

HIGH/LOW (default=HIGH)

outputPolarity

Polarity

HIGH/LOW (default=clockDomain.confg.resetActiveLevel)

bufferDepth

Int

防止亚稳态所需的寄存器级数(默认为 2)

另外还有一个 ResetCtrl.asyncAssertSyncDeassertDrive 版本的工具,它直接使用筛选后的值

为 clockDomain 的复位赋值。

3.特殊工具

语法

返 回 类型

描述

LatencyAnalysis(paths : Node*)

Int

以周期为单位返回经过所有节点的最短路径,
第一个节点到最后一个节点

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千穹凌帝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值