高速版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
最終更新時間:2007年08月01日 12時37分16秒