Chisel 语言(Scala)学习 2 实例化模型和向量操作

Chisel 语言学习 2 实例化模型和向量操作

系列文章主要用来记录学习Chisel和scala过程中遇到的难点或知识点

实例化模型:

带有进位的加法器
Chisel 语言(Scala)学习 2 实例化模型和向量操作_第1张图片

Chisel代码如下:

// A 4-bit adder with carry in and carry out
class Adder4 extends Module {
  val io = IO(new Bundle {
    val A    = Input(UInt(4.W))
    val B    = Input(UInt(4.W))
    val Cin  = Input(UInt(1.W))
    val Sum  = Output(UInt(4.W))
    val Cout = Output(UInt(1.W))
  })
  // Adder for bit 0
  val Adder0 = Module(new FullAdder())
  Adder0.io.a   := io.A(0)
  Adder0.io.b   := io.B(0)
  Adder0.io.cin := io.Cin
  val s0 = Adder0.io.sum
  // Adder for bit 1
  val Adder1 = Module(new FullAdder())
  Adder1.io.a   := io.A(1)
  Adder1.io.b   := io.B(1)
  Adder1.io.cin := Adder0.io.cout
  val s1 = Cat(Adder1.io.sum, s0)
  // Adder for bit 2
  val Adder2 = Module(new FullAdder())
  Adder2.io.a   := io.A(2)
  Adder2.io.b   := io.B(2)
  Adder2.io.cin := Adder1.io.cout
  val s2 = Cat(Adder2.io.sum, s1)
  // Adder for bit 3
  val Adder3 = Module(new FullAdder())
  Adder3.io.a   := io.A(3)
  Adder3.io.b   := io.B(3)
  Adder3.io.cin := Adder2.io.cout
  io.Sum  := Cat(Adder3.io.sum, s2).asUInt
  io.Cout := Adder3.io.cout
}

向量操作

val myVec = Vec(Seq.fill( of elements> ) { type> })

eg:

val ufix5_vec10 := Vec(Seq.fill(10) { UInt(5.W) })

定义一个向量寄存器:

val reg_vec32 = Reg(Vec(Seq.fill(32){ UInt() }))

定义一个16位加法器(向量的值包含实例时,我们用io来定义):

val FullAdders = 
  Vec(Seq.fill(16){ Module(new FullAdder()).io })

为了使代码简洁,我们可以用下面这种写法:

val initValues = Seq.fill(4) { 0.U(8.W) }
  val delays = RegInit(Vec(initValues))

你可能感兴趣的:(硬件编程语言,嵌入式学习,计算机系统,scala,实例,chisel,向量,寄存器)