Synthesijer.Scalaの代入・状態遷移について

Pocket

Synthesijer.Scalaでは,特定の状態でのレジスタへの代入は

sig0 <= (state, sig1)


と,条件付きの状態遷移は

state0 -> (flag, state1)


と記述するようにしていたのですが,美しくないというコメントをいただき,また同時に”*”ではどうか,というご提案をいただいたので対応してみました.

つまり,

sig0 <= state * sig1


あるいは,

state0 * flag -> state1


というように書けるようになります.

いわゆるベンディングマシンの例題であれば,次のような記述になります.

package synthesijer.scala

class VendingMachine(n:String, c:String, r:String) extends Module(n, c, r){

  def this() = this("vendingmachine", "clk", "reset")

  val nickel = inP("nickel")
  val dime = inP("dime")
  val rdy = outP("rdy")
  val seq = sequencer("main")

  val s5,s10,s15,s_ok = seq.add()
  rdy <= seq.idle * LOW

  rdy <= s_ok * HIGH
  seq.idle * nickel -> s5
  seq.idle * dime -> s10

  s5 * nickel -> s10
  s5 * dime -> s15

  s10 * nickel -> s15
  s10 * dime -> s_ok

  s15 * nickel -> s_ok
  s15 * dime -> s_ok

  s_ok -> seq.idle

}


ガードライクに書ける方がいいのでは?というコメントももらったので,後で試してみよう.