!!!ステートマシン 高速版TINYCPUのステートマシン !!入出力ポート , ,ポート,ビット数,  ,入力,clk,1,グローバルクロック ,入力,reset,1,グローバルリセット ,入力,run,1,1のときclkの立ち上がりで状態繊維 ,入力,halt,1,1のときEXECからIDLEAに遷移 ,出力,q,2,現在の状態 !!状態 ,状態,CPUの動作 ,IDLEA,アイドル状態(動作開始待ち) ,IDLEB,実行準備 ,EXEC,命令実行 全ての命令を1クロックサイクル(EXEC)で実行する. IDLE状態を2つ(IDLEAとIDLEB)にしているのは念のため. 1状態だけだとシステムリセット直後にrunが1であり,状態EXECに遷移するとメモリの0番地が正しく読み出されず,誤動作する可能性があるため. !!ステートマシンの遷移規則 ,現在の状態,reset,run,halt,次の状態,  ,-,0,-,-,IDLEA,非同期リセット ,IDLEA,1,-,-,IDLEB,動作開始 ,IDLEB,-,-,-,EXEC,動作開始準備 ,EXEC,1,-,0,EXEC,動作継続 ,EXEC,1,-,1,IDLE,動作停止 `include "defsf.v" module statef(clk,reset,run,halt,cs); input clk, reset, run, halt; output [1:0] cs; reg [1:0] cs; always @(posedge clk or negedge reset) if(!reset) cs <= `IDLEA; else case(cs) `IDLEA: if(run) cs <= `IDLEB; `IDLEB: cs <= `EXEC; `EXEC: if(halt) cs <= `IDLEA; else cs <= `EXEC; default: cs <= 2'bxx; endcase endmodule