SpinalHDL之IO口

本文作为SpinalHDL学习笔记第二十五篇,介绍SpinalHDL IO口相关API。

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

SpinalHDL 学习笔记_spinalhdl blackbox-CSDN博客

 

目录:

1.可读开漏 IO(ReadableOpenDrain)

2.三态

1.可读开漏 IO(ReadableOpenDrain)

ReadableOpenDrain 线束定义如下:

case class ReadableOpenDrain[T<: Data](dataType : HardType[T]) extends Bundle with␣
,→IMasterSlave {
val write,read : T = dataType()
override def asMaster(): Unit = {
out(write)
in(read)
}
}

然后,作为主端,可以使用 read 信号读取外部值,并使用 write 设置您想要在输出上驱动的值。

这是一个用法示例:

val io = new Bundle {
val dataBus = master(ReadableOpenDrain(Bits(32 bits)))
}
io.dataBus.write := 0x12345678
when(io.dataBus.read === 42) {
}

2.三态

在许多情况下,三态信号难以处理:

• 它们不是真正的数字性

• 除了 IO 之外,它们不用于数字设计

• 三态概念并不自然地适合 SpinalHDL 内部图。

SpinalHDL 为三态信号提供两种不同的抽象。 TriState 线束和模拟信号和输入输出 信号。两者有不同的目的:

• TriState 应用于大多数目的,尤其是在设计中。该束包含一个附加信号来传递当前的方向。

• Analog 和 inout 应用于设备边界上的驱动以及其他一些特殊情况。

如上所述,推荐的方法是在设计中使用 TriState 。然后,在顶层, TriState 线束被赋值给模拟输入输出,以使综合工具推断出正确的 I/O 驱动。这可以通过输入/出包装器 自动完成,或者根据需要手动完成。

三态

TriState 线束定义如下:

case class TriState[T <: Data](dataType : HardType[T]) extends Bundle with IMasterSlave {
val read,write : T = dataType()
val writeEnable = Bool()
override def asMaster(): Unit = {
out(write,writeEnable)
in(read)
}
}

主端可以使用 read 信号读取外部值,使用 writeEnable 启用输出,最后使用 write 设置输出驱动的值。

这是一个使用示例:

val io = new Bundle {
val dataBus = master(TriState(Bits(32 bits)))
}
io.dataBus.writeEnable := True
io.dataBus.write := 0x12345678
when(io.dataBus.read === 42) {
}

三态阵列

在某些情况下,需要控制每个单独引脚的输出使能(像 GPIO 一样)。在这种情况下,您可以使TriStateArray 线束。

它的定义如下:

case class TriStateArray(width : BitCount) extends Bundle with IMasterSlave {
val read,write,writeEnable = Bits(width)
override def asMaster(): Unit = {
out(write,writeEnable)
in(read)
}
}

它与 TriState 线束相同,不同的是 writeEnable 是一个位 (Bits) 来控制每个输出缓冲区。

这是一个用法示例:

val io = new Bundle {
val dataBus = master(TriStateArray(32 bits)
}
io.dataBus.writeEnable := 0x87654321
io.dataBus.write := 0x12345678
when(io.dataBus.read === 42) {
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千穹凌帝

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

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

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

打赏作者

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

抵扣说明:

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

余额充值