zoukankan      html  css  js  c++  java
  • Chisel3

     
    演示如何使用switch/is来实现状态机。
     
    参考链接:
    https://github.com/ucb-bar/chisel-tutorial/blob/release/src/main/scala/solutions/VendingMachineSwitch.scala
     
    1. 引入Chisel3
     
     
    2. 继承自Module类
     
     
    3. 定义输入输出接口
     
    创建各项输入输出接口。
     
    val nickel = Input(Bool())
    a. 使用Bool()创建布尔型数,位宽为1;
    b. 使用UInt创建无符号整型数;
    c. 使用Input/Output表示接口方向;
    d. val 关键字表明定义的变量是所属匿名Bundle子类的数据成员;
     
    4. 内部连接
     
     
    1) 创建5个状态:val sIdle :: s5 :: s10 :: s15 :: sOk :: Nil = Enum(5)
     
    2) 使用switch/is判断逻辑嵌套实现状态机;
     
    如同when/elsewhen/otherwise判断结构的实现方式,switch/is分别接收两个参数列表,分别是判断条件和要执行的call-by-name代码块。
     
    5. 生成Verilog
     
     
    可以直接点运行符号运行。
     
    也可以使用sbt shell执行:
     
    生成Verilog如下:
     
    6. 测试
     
     
     
    7. 附录
     
    VendingMachineSwitch.scala:
     
    import chisel3._
    import chisel3.util._
     
    // Problem:
    //
    // Implement a vending machine using a 'switch' statement.
    // 'nickel' is a 5 cent coin
    // 'dime' is 10 cent coin
    // 'sOk' is reached when there are coins totalling 20 cents or more in the machine.
    // The vending machine should return to the 'sIdle' state from the 'sOk' state.
    //
    class VendingMachineSwitch extends Module {
    val io = IO(new Bundle {
    val nickel = Input(Bool())
    val dime = Input(Bool())
    val valid = Output(Bool())
    })
    val sIdle :: s5 :: s10 :: s15 :: sOk :: Nil = Enum(5)
    val state = RegInit(sIdle)
     
    switch (state) {
    is (sIdle) {
    when (io.nickel) { state := s5 }
    when (io.dime) { state := s10 }
    }
    is (s5) {
    when (io.nickel) { state := s10 }
    when (io.dime) { state := s15 }
    }
    is (s10) {
    when (io.nickel) { state := s15 }
    when (io.dime) { state := sOk }
    }
    is (s15) {
    when (io.nickel) { state := sOk }
    when (io.dime) { state := sOk }
    }
    is (sOk) {
    state := sIdle
    }
    }
    io.valid := (state === sOk)
    }
     
    object VendingMachineSwitchMain {
    def main(args: Array[String]): Unit = {
    chisel3.Driver.execute(Array("--target-dir", "generated/VendingMachineSwitch"), () => new VendingMachineSwitch)
    }
    }
  • 相关阅读:
    Route the message within a requestresponse receive port
    SQL Server 表连接删除
    RoR(Ruby on Rails)学习笔记(1)
    算法导论学习笔记(1)——快排中hoarePartition的实现(问题已解决)
    RoR(Ruby on Rails)学习笔记(2)
    网络七层协议的形象说明
    Missing requirement: JDT Core patch for GroovyEclipse plugin 2.5.1.xx201106271300e36 (org.codehaus.groovy.jdt.patch.
    小技巧: 实用的一行 Linux 命令
    IE: 如何使用 F12 开发人员工具调试网页
    Grep 用法
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10093536.html
Copyright © 2011-2022 走看看