命令デコーダ設計できた
verilog上ですが命令デコーダできましたです。というか命令デコーダを含めたCPUの制御ユニットを作りました。(まだデバックしてないですが)1クロックで1命令であるならば必要ないのですが、命令実行にいくつかのクロックが必要ならば、今クロック何回目?というカウンタが必要です。そしてそのカウンタに従ってCPUを制御する訳ですからその制御ユニットが必要なのです。命令デコーダは制御ユニットの配下に存在しています。命令デコーダは命令コード(加算しろとか、減算しろとか)を制御信号に変換するものですから、命令実行サイクルの最後の方に活躍しますね。最初の方は命令を実行するための準備をします。
命令実行サイクル
今のところ1命令あたり7クロックでいこうと思います。こんなかんじ
- ロード先アドレスをアドレスレジスタに保存
- アドレスレジスタが示す先からAレジスタに転送
- ストア先アソレスをアドレスレジスタに保存
- アドレスレジスタが示す先からBレジスタに転送
- オペコードをオペコードレジスタに保存
- 命令を実行
- 命令を実行
AレジスタとBレジスタはALUに繋がっております。オペコードレジスタの先は命令デコーダです。RAMからそれぞれのレジスタに転送して命令実行の準備をして命令を実行する。これを1サイクルとして繰り返します。
命令デコーダ verilog
前回の記事に書いた命令デコーダをverilogで書いた組み合わせ回路部分を置いておこう。
assign CALsig = OP5n & OP4n;
assign FAsig = CALsig & OP3n & OP2p;
assign FAE = ~FAsig;
assign SUBS = FAsig & OP1p;
assign SRAE = ~(CALsig & OP1p & OP2n & OP3p);
assign SLAE = ~(CALsig & OP1n & OP2p & OP3p);
assign ADDECG1 = ~((~(OP2n & OP3n )) & CALsig & OP0n);
assign JPsig = OP4p & OP5n;
assign ARD1 = ~JPsig;
assign ADDECG2 = ~(JPsig & OP3n);
assign JPCZsig = OP1p ? Zflag : Cflag;
assign JPSIGNsig = OP0p ? JPCZsig : ~JPCZsig;
assign PCWR = (~(JPsig & JPSIGNsig & OP3p)) & (~(JPsig & OP2p));
assign STAKsig = OP4n & OP5p;
assign SKSIGNsig = OP0p ? IScutLSB : IScutLSBn;
assign SPEN = ~(STAKsig & SKSIGNsig);
assign SPABOE = ~(STAKsig & ~SKSIGNsig);
assign ARD2 = ~(STAKsig & OP0p & IScutLSBn);
assign ADDECG3 = ~(STAKsig & OP0n & IScutLSB);
assign SPDU = OP0p;