ハードウェア記述言語と検証
上の状態機械の記述で、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
- A条件に当てはまらないときは今の状態にとどまることを示し、すべての場合でnextに値を決めてラッチを防ぐため
- B状態を毎回IDLEに戻すため
- Cクロックを止めるため
答えと解説を見る
正解:A. 条件に当てはまらないときは今の状態にとどまることを示し、すべての場合でnextに値を決めてラッチを防ぐため
状態機械を、状態を更新するレジスタのブロックと、次の状態を決める組み合わせ回路のブロックに分けて書くのはよくある形です。組み合わせ回路の側では、startやdoneが0のときにnextへの代入がないとラッチができてしまいます。先頭で「next = state;」としておけば、どの条件にも当てはまらないときは今の状態にとどまる、という意図をはっきり表しながらラッチを防げます。
- A. 正しい。デフォルトの値を先に決めています。
- B. 今の状態を保つ意味で、IDLEに戻すわけではありません。
- C. クロックとは関係ありません。