演示如何使用switch/is来实现状态机。
参考链接:
.scala
1. 引入Chisel3
2. 继承自Module类
3. 定义输入输出接口
创建各项输入输出接口。
(Bool())
a. 使用Bool()创建布尔型数,位宽为1;
b. 使用UInt创建无符号整型数;
c. 使用Input/Output表示接口方向;
关键字表明定义的变量是所属匿名Bundle子类的数据成员;
4. 内部连接
)
2) 使用switch/is判断逻辑嵌套实现状态机;
如同when/elsewhen/otherwise判断结构的实现方式,switch/is分别接收两个参数列表,分别是判断条件和要执行的call-by-name代码块。
5. 生成Verilog
可以直接点运行符号运行。
也可以使用sbt shell执行:
略
生成Verilog如下:
略
6. 测试
略
7. 附录
.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) } }