- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!ステートマシン
!!入出力ポート
, ,ポート,ビット数,
,入力,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