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