zoukankan      html  css  js  c++  java
  • Chisel3

    https://mp.weixin.qq.com/s/X5EStKor2DU0-vS_wIO-fg

     
    四位加法器。通过FullAdder级联实现。
     
    参考链接:
    https://github.com/ucb-bar/chisel-tutorial/blob/release/src/main/scala/examples/Adder4.scala
     
    1. 引入Chisel3
     
     
    2. 继承自Module类
     
     
    3. 定义输入输出接口
     
    创建输入和输出接口;
     
    这些接口都是无符号整型数:val A = Input(UInt(4.W))
    a. 使用4.W表示位宽为4位;
    b. 使用UInt创建无符号整型数;
    c. 使用Input/Output表示接口方向;
    d. val 关键字表明定义的变量是所属匿名Bundle子类的数据成员;
     
    4. 内部连接
     
    创建4个全加器,并与输入和输出接口相连。
     
    最终的和(Sum)由4个全加器的和组合而成:
     
    val s0 = Adder0.io.sum
    val s1 = Cat(Adder1.io.sum, s0)
    val s2 = Cat(Adder2.io.sum, s1)
    io.Sum := Cat(Adder3.io.sum, s2).asUInt
     
    这里为什么使用组合呢?
     
    还有其他两种写法:
    a. 直接连接io.Sum的每一位:
    io.Sum(0) := Adder0.io.sum
    io.Sum(1) := Adder1.io.sum
    io.Sum(2) := Adder2.io.sum
    io.Sum(3) := Adder3.io.sum
     
    这种写法会报异常:对io.Sum(0)会调用:
    返回的并不是Sum的第0位,而是新建的已经做了ReadOnlyBinding的Bool()。
     
    由此可见,当前UInt的位选择(bit-select)只能作为“:=”符号的右值(而不能作为左值),即只能作为“:=”方法的参数。
     
    b. 到最后统一组合一次:
    io.Sum := Cat(Adder3.io.sum, Adder2.io.sum, Adder1.io.sum, Adder0.io.sum).asUInt()
     
    这样做是可以的,我认为这种写法更好。只是生成的Verilog不如人意:
    生成了三个组合,而不是直接一个组合。
     
    5. 生成Verilog
     
     
    可以直接点运行符号运行。
     
    也可以使用sbt shell执行:
     
    生成Verilog如下:
     
    6. 测试
     
    参考链接:
     
     
     
    7. 附录
     
    Adder4.scala:
     
    import chisel3._
    import chisel3.util._
     
    //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.Sum := Cat(Adder3.io.sum, Adder2.io.sum, Adder1.io.sum, Adder0.io.sum)
    io.Cout := Adder3.io.cout
    }
     
    object Adder4Main {
    def main(args: Array[String]): Unit = {
    chisel3.Driver.execute(Array("--target-dir", "generated/Adder4"), () => new Adder4)
    // chisel3.Driver.execute(args, () => new FullAdder)
    }
    }
     
  • 相关阅读:
    php解析文本文件呈现在表格上
    nyoj 1058部分和问题
    nyoj 488素数环
    nyoj 82迷宫寻宝(一)
    nyoj58最少步数
    nyoj 325 zb的生日
    nyoj 20 吝啬的国度
    nyoj 349 Sorting It All Out
    nyoj 284
    PPT基础整理
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10093485.html
Copyright © 2011-2022 走看看