VHDL 等效语法
实体和架构
在 SpinalHDL 中,VHDL 实体和架构都在 Component
内定义。
这是一个具有 3 个输入(a
、b
、c
)和一个输出(result
)的组件。该组件还有一个 offset
构造参数(类似于 VHDL generic)。
case class MyComponent(offset: Int) extends Component {
val io = new Bundle {
val a, b, c = in UInt(8 bits)
val result = out UInt(8 bits)
}
io.result := a + b + c + offset
}
然后实例化该组件,您不需要绑定它:
case class TopLevel extends Component {
...
val mySubComponent = MyComponent(offset = 5)
...
mySubComponent.io.a := 1
mySubComponent.io.b := 2
mySubComponent.io.c := 3
??? := mySubComponent.io.result
...
}
数据类型
SpinalHDL 与 VHDL 相似的数据类型:
VHDL |
SpinalHDL |
---|---|
std_logic |
Bool |
std_logic_vector |
位 |
unsigned |
UInt |
signed |
SInt |
在 VHDL 中,要定义 8 位
unsigned
,您必须给出位范围 unsigned(7 downto 0)
,而在 SpinalHDL 中,您只需提供位数
UInt(8 bits)
。VHDL |
SpinalHDL |
---|---|
records |
Bundle |
array |
Vec |
enum |
SpinalEnum |
这是 SpinalHDL Bundle
定义的示例。 channelWidth
是一个构造参数,类似于 VHDL 泛型,但用于数据结构:
case class RGB(channelWidth: Int) extends Bundle {
val r, g, b = UInt(channelWidth bits)
}
例如,要实例化一个 Bundle
,您需要这样写 val myColor = RGB(channelWidth=8)
。
信号
这是一个关于信号实例化的示例:
case class MyComponent(offset: Int) extends Component {
val io = new Bundle {
val a, b, c = UInt(8 bits)
val result = UInt(8 bits)
}
val ab = UInt(8 bits)
ab := a + b
val abc = ab + c // You can define a signal directly with its value
io.result := abc + offset
}
赋值
在 SpinalHDL 中,:=
赋值运算符相当于 VHDL 信号赋值 (<=
):
val myUInt = UInt(8 bits)
myUInt := 6
在 VHDL 中,条件赋值通过使用 if
/case
语句来完成:
val clear = Bool()
val counter = Reg(UInt(8 bits))
when(clear) {
counter := 0
}.elsewhen(counter === 76) {
counter := 79
}.otherwise {
counter(7) := ! counter(7)
}
switch(counter) {
is(42) {
counter := 65
}
default {
counter := counter + 1
}
}
字面量(Literals)
与 VHDL 中的字面量略有不同:
val myBool = Bool()
myBool := False
myBool := True
myBool := Bool(4 > 7)
val myUInt = UInt(8 bits)
myUInt := "0001_1100"
myUInt := "xEE"
myUInt := 42
myUInt := U(54,8 bits)
myUInt := ((3 downto 0) -> myBool, default -> true)
when(myUInt === U(myUInt.range -> true)) {
myUInt(3) := False
}
寄存器
在 SpinalHDL 中,寄存器是显式指定的,而在 VHDL 中寄存器是推断的。以下是 SpinalHDL 寄存器的示例:
val counter = Reg(UInt(8 bits)) init(0)
counter := counter + 1 // Count up each cycle
// init(0) means that the register should be initialized to zero when a reset occurs
过程块
过程块是一种仿真功能,对于设计 RTL 来说是不必要的。这就是为什么 SpinalHDL 不包含任何类似于过程块的功能,并且您可以在您想要的位置分配您想要的内容。
val cond = Bool()
val myCombinatorial = Bool()
val myRegister = UInt(8 bits)
myCombinatorial := False
when(cond) {
myCombinatorial := True
myRegister = myRegister + 1
}