ハードウェア記述言語と検証

上の状態機械の記述で、2つ目のalwaysブロックの先頭に「next = state;」を書いている理由として正しいものはどれか。

always @(posedge clk)
    state <= next;
always @(*) begin
    next = state;
    case (state)
        IDLE: if (start) next = RUN;
        RUN:  if (done)  next = IDLE;
    endcase
end
  1. A条件に当てはまらないときは今の状態にとどまることを示し、すべての場合でnextに値を決めてラッチを防ぐため
  2. B状態を毎回IDLEに戻すため
  3. Cクロックを止めるため
答えと解説を見る

正解:A. 条件に当てはまらないときは今の状態にとどまることを示し、すべての場合でnextに値を決めてラッチを防ぐため

状態機械を、状態を更新するレジスタのブロックと、次の状態を決める組み合わせ回路のブロックに分けて書くのはよくある形です。組み合わせ回路の側では、startやdoneが0のときにnextへの代入がないとラッチができてしまいます。先頭で「next = state;」としておけば、どの条件にも当てはまらないときは今の状態にとどまる、という意図をはっきり表しながらラッチを防げます。

  • A. 正しい。デフォルトの値を先に決めています。
  • B. 今の状態を保つ意味で、IDLEに戻すわけではありません。
  • C. クロックとは関係ありません。
この分野を解く 分野ページへ

ハードウェア記述言語と検証のほかの問題

  1. ミーリ型の状態機械の特徴として正しいものはどれか。
  2. 状態機械の状態の符号化で、ワンホット符号化の特徴として正しいものはどれか。
  3. 3つの状態を持つ状態機械で、状態を覚えるのに必要なフリップフロップの数の組み合わせとして正しいものはどれか(バイナリ符号化/ワンホット符号化)。
  4. 上の4ビットのカウンタで、countが15のときにクロックが立ち上がると、countはいくつになるか。
  5. Verilogで8ビットの信号aとbを足し、その結果を8ビットの信号sに代入した(assign s = a + b;)。注意すべき点として正しいものはどれか。