zoukankan      html  css  js  c++  java
  • Chisel3

    https://mp.weixin.qq.com/s/LKiXUgSnt3DzgFLa9zLCmQ

     
    简单的寄存器在时钟的驱动下,逐个往下传值。
     
    参考链接:
    https://github.com/ucb-bar/chisel-tutorial/blob/release/src/main/scala/examples/ShiftRegister.scala
     
    1. 引入Chisel3
     
     
    2. 继承自Module类
     
     
    3. 定义输入输出接口
     
    创建各项输入输出接口。
     
    这些接口都是无符号整型数:val in = Input(UInt(1.W))
    a. 使用1.W表示位宽为1位;
    b. 使用UInt创建无符号整型数;
    c. 使用Input/Output表示接口方向;
    d. val 关键字表明定义的变量是所属匿名Bundle子类的数据成员;
     
    4. 内部连接
     
     
    使用RegNext()创建寄存器。总共创建了4个寄存器,逐个相连,在时钟的驱动下,向下传值。最终从模块输出端口输出。
     
    RegNext(arg)创建一个寄存器,作为arg的下一级。即:arg的值,在经过一个时钟之后,才会传到所创建的寄存器。从意义上讲,命名为RegNextOf()更为达意,但不如RegNext()简洁。熟悉之后并不影响理解。
     
    如:val r1 = RegNext(r0)
    可以理解为:val r1 = RegNextOf(r0)
     
    定义寄存器可以使用如下方法:
     
    a. Reg(): 创建一个孤立的寄存器,后续用于连接和存值;
    b. RegNext(): 基于现有变量,创建一个下级寄存器;
    c. RegInit(): 创建一个带初值的寄存器;
     
    其中RegNext()根据是否带初始值,有两种方法:
     
     
    5. 生成Verilog
     
     
    可以直接点运行符号运行。
     
    也可以使用sbt shell执行:
     
    生成Verilog如下:
     
    6. 测试
     
     
     
    7. 附录
     
    ShiftRegister.scala:
     
    import chisel3._
     
    class ShiftRegister extends Module {
    val io = IO(new Bundle {
    val in = Input(UInt(1.W))
    val out = Output(UInt(1.W))
    })
    val r0 = RegNext(io.in)
    val r1 = RegNext(r0)
    val r2 = RegNext(r1)
    val r3 = RegNext(r2)
    io.out := r3
    }
     
    object ShiftRegisterMain {
    def main(args: Array[String]): Unit = {
    chisel3.Driver.execute(Array("--target-dir", "generated/ShiftRegister"), () => new ShiftRegister)
    }
    }
  • 相关阅读:
    centos6和centos7升级openssh7.5脚本
    开通telnet服务,使用telnet登入
    彻底删除kafka的topic以及其中的数据
    redis集群创建
    curl 命令参数
    nginx.conf配置文件详解,白嫖的
    logstash迁移es数据
    es 常用查询
    pl/sql 存储过程
    es查看集群信息命令_cat和_cluster
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10093496.html
Copyright © 2011-2022 走看看