トップ 一覧 検索 ヘルプ RSS ログイン

statef.vの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!ステートマシン
高速版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