!!!ステートマシン !!入出力ポート , ,ポート,ビット数,  ,入力,clk,1,グローバルクロック ,入力,reset,1,グローバルリセット ,入力,run,1,1のときclkの立ち上がりで状態繊維 ,入力,cont,1,1のときEXECAからEXECBに遷移 ,入力,halt,1,1のときEXECAからIDLEに遷移 ,出力,cs,3,現在の状態 !!状態 ,状態,CPUの動作 ,IDLE,アイドル状態(動作開始待ち) ,FETCHAとFETCHB,命令フェッチ(メモリから命令を取り出し命令レジスタに格納) ,EXECAとEXECB,命令実行(命令レジスタの命令コードにしたがって実行) !!ステートマシンの遷移規則 ,現在の状態,reset,run,cont,halt,次の状態,  ,-,0,-,-,-,IDLE,非同期リセット ,IDLE,1,0,-,-,IDLE,動作開始待ち ,IDLE,1,1,-,-,FETCHA,動作開始 ,FETCHA,1,-,-,-,FETCHB,  ,FETCHB,1,-,-,-,EXECA,  ,EXECA,1,-,0,0,FETCHA,次の命令へ ,EXECA,1,-,1,-,EXECB,命令実行にさらに1サイクル必要 ,EXECA,1,-,-,1,IDLE,動作停止 ,EXECB,1,-,-,-,FETCHA,  !!ソースコード `include "defs.v" module state(clk,reset,run,cont,halt,cs); input clk, reset, run, cont, halt; output [2:0] cs; reg [2:0]cs; always @(posedge clk or negedge reset) if(!reset) cs <= `IDLE; else case(cs) `IDLE: if(run) cs <= `FETCHA; `FETCHA: cs <= `FETCHB; `FETCHB: cs <= `EXECA; `EXECA: if(halt) cs <= `IDLE; else if(cont) cs <= `EXECB; else cs <= `FETCHA; `EXECB: cs <= `FETCHA; default: cs <= 3'bxxx; endcase endmodule