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

state.vの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!ステートマシン
!!入出力ポート
, ,ポート,ビット数, 
,入力,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 "defsf.v"
 `include "defs.v"
 
 module statef(clk,reset,run,cont,halt,cs);
 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