開発室A 8桁プロセッサ |
はじめに |
一般的な構成による8桁プロセッサを作ります。 一般的とは命令符とデータとスタックを同じメモリ空 間に配置していることです。 同じメモリ空間とは命令符とデータとスタックのそれ ぞれのポインタの指す位置が 同じ値であれば実際のメモリの同じメモリ番地を指す という意味です。 それと1クロックで1命令とするとプロセッサは簡単に なりますが当室のプロセッサ は1命令が数クロックを必要とするものもある一般的 な方式です。 |
基本仕様 |
|
命令符 | レジスタと命令符を決めています。 |
命令動作 | 命令符の動作を決めています。 |
命令解析 | 命令符の具体的な動作を整理します。 |
設計 |
論理譜 |   基本仕様を具現化していきます。 |
命令ポインタ | スタックポインタ | 命令取得 | 命令行程 | 命令類別 |
レジスタ選択 | レジスタ設定 | 番地 | 出力データ | スタック操作 |
メモリ操作 | ポート操作 | 算術論理演算 | メモリ制御 | ポート制御 |
割り込み制御 |
検証 |
論理譜を検証していきます。 検証に使う命令符は アセンブラ を使って作ります。 |
コンパイル |
SAMPLE .ASM | テストプログラム | |
CPU8A .L | 8桁プロセッサ ソースファイル | |
CPU8A .MAC | アセンブラマクロファイル | |
LSIM .LBL | VIEW 用ラベルファイル |
アセンブル |
AASM -Mcpu8a.mac -L sample.asm |
|
コンパイル |
LDC cpu8a -ls -opt 0 -qm 0 |
|
シミュレーション |
SIM t1.sim |
|
結果確認 |
VIEW |
コンパイル |
LDC cpu8a -vh -opt 0 -qm 0 |
e0.vhd | チップ作成用ですがテスト端子を含んでいます。 | |
e1.vhd | 検証用 | |
s1.vhd | テストベンチ |
最終的にチップ化する e0 .vhd は テスト端 子(信号)と機能実行譜を注釈にしたソースをコンパイ ルしたものを使います。 |
命令ポインタ |
命令ポインタは命令符を読み出すメモリ番地を指します。
まず命令ポインタが問題なく更新されていくようにします。 チップ内のレジスタを変える命令を実行しているとき は命令ポインタはひとつずつ増やすだけです。
|
メモリから分岐値を読み出して、そこに分岐します。 | ||||
JMP | JMPC | JMPZ | CALL | RET |
分岐レジスタの分岐値を命令ポインタに代入して分岐 します。 | ||||
JMPR | JMPRC | JMPRZ | ||
メモリの読み出し中は命令ポインタを保持します。 | ||||
POP | INC | DEC | MOVJ | |
メモリの書き込み中は命令ポインタを保持します。 | ||||
PUSH |
スタックポインタ |
CALL | スタックに書き込んでスタックポインタを2減らします。 |
RET | スタックを読み出してスタックポインタを2増やします。 |
PUSH | スタックに書き込んでスタックポインタを減らします。 |
POP | スタックを読み出してスタックポインタを増やします。 |
命令符取得 |
プロセッサは命令符取得中か命令符実行中のどちらか にあります。 命令符は1符、2符、3符のものがあって、必要符を読 み終えた後に命令を実行します。 |
符読み出し順番 |
| |
MOVI | 2符の命令 | |||
3符の命令 | ||||
JMP | JMPC | JMPZ | MOVJ | CALL |
PUSH | POP |
符読み出し |
命令行程 |
命令行程数設定 |
JMP | JMPC | JMPZ | JMPR | JMPRC |
JMPRZ | MOVJ | CALL | RET | PUSH |
POP | INC | DEC | MOVR | MOVMR |
MOVRM | MOVPR | MOVRP |
PUSH と POP は 8 桁レジスタと 16 桁レジスタでは 行程数が変わります。 両命令符は16桁の行程数を最初に与えます、レジスタ の種類は 2 番目の符で分かりますので 8 桁なら適当 な行程に達したところで0にします。 |
PUSH | POP | ||||||||
R0 | R1 | R2 | R3 | SR | R0 | R1 | R2 | R3 | SR |
命令未実行 |
命令類別 |
JMP | JMPC | JMPZ | MOVJ | CALL |
PUSH | POP | INC | DEC | MOVI |
MOVMR | MOVRM | MOVPR | MOVRP |
レジスタ選択 |
早期に選択 |
● 算術論理演算 |
● レジスタ転送 |
MOVR | MOVRX | MOVRY | MOVXR | MOVYR |
通常の選択 |
MOVI | MOVMR | MOVPR | MOVJ | POP |
INC | DEC |
レジスタ設定 |
汎用レジスタ、番地レジスタ、分岐レジスタへの書き 込み操作です。 |
R0 |
汎用レジスタ R0 の書き込み操作です。 |
MOVR | MOVPR | MOVI | MOVMR | MOVPR |
POP | INC | DEC | MOVXR | MOVYR |
R1 |
汎用レジスタ R1 の書き込み操作です。 |
MOVR | MOVPR | MOVI | MOVMR | MOVPR |
POP | INC | DEC | MOVXR | MOVYR |
R2 |
汎用レジスタ R2 の書き込み操作です。 |
MOVR | MOVPR | MOVI | MOVMR | MOVPR |
POP | INC | DEC | MOVXR | MOVYR |
R3 |
汎用レジスタ R3 の書き込み操作です。 |
MOVR | MOVPR | MOVI | MOVMR | MOVPR |
POP | INC | DEC | MOVXR | MOVYR |
RP0 |
汎用レジスタ 連結の RP0 の書き込み操作です。 |
POP | INC | DEC |
RP1 |
汎用レジスタ 連結の RP1 の書き込み操作です。 |
POP | INC | DEC |
IX |
番地レジスタ IX の書き込み操作です。 |
MOVRX | POP | INC | DEC |
IY |
番地レジスタ IY の書き込み操作です。 |
MOVRX | POP | INC | DEC |
JR |
分岐レジスタ JR の書き込み操作です。 |
MOVJ | POP | INC | DEC |
番地 |
番地端子に出力するデータとスタックとポートの書 き込みの番地を選択します。 |
MOVI | MOVMR | MOVRM | MOVPR | MOVRP |
CALL | JMP | JMPC | JMPZ | MOVJ |
PUSH | POP | INC | DEC |
出力データ |
データ端子に出力するデータとスタックとポートの書 き込みのデータを選択します。 |
MOVRM | MOVRP | CALL | PUSH |
スタック操作 |
下記の2個の命令符でスタックの操作を行います。 |
CALL | RET | PUSH | POP |
メモリ操作 |
下記の2個の命令符でデータメモリの操作を行います 。 |
MOVMR | MOVRM |
ポート操作 |
下記の2個の命令符でポートの操作を行います。 |
MOVPR | MOVRP |
算術論理演算 |
演算の選択、対象レジスタの選択、演算指標、零指標 の操作を行います。 |
第一引数と代入先 |
算術論理演算の1番目の対象の汎用レジスタを選択し ます。 |
第二引数 |
算術論理演算の2番目の対象の汎用レジスタを選択し ます。 |
演算 |
演算は算術演算が2種類、論理演算が4種類、桁移動が 2種類の計8種類の演算があります。 |
演算指標 |
演算指標は算術論理演算の実行結果です、状態レジスタ の第7桁に配置しています。 |
零指標 |
零指標は算術論理演算の実行結果です、状態レジスタ の第6桁に配置しています。 |
メモリ制御 |
メモリ空間はスタックと命令符とデータの3種類の領
域を共用して使っています。
|
ポート制御 |
ポートはメモリと別の空間に配置されていますが番地 とデータの端子を共有しています。 書き込みと読み出しをポート固有の端子にすることで 別の空間を操作します。 |
割り込み制御 |
割り込み制御は割り込みの有効と無効を制御します。 有効と無効は状態レジスタの第3桁の指標でPUSH命令 とPOP命令の対象になっています。 |
EI | DI | POP |
割り込み要求端子は8個あります。
INT0, INT1, INT2, INT3, INT4, INT5, INT6, INT7 INT0 から INT6 は割り込みの有効・無効を設定できます。 INT7 は無効にできない割り込みです。 割り込み要求は割り込みプログラムを呼び出すまで 記憶 されます。 割り込みプログラムを呼び出すまでのプロセッサの動 作はスタックに現在の命令ポインタと指標を書き込む ことです。 割り込み行程 と言います。 割り込み行程は実行中の命令行程を避けて入るように なっています。 割り込み行程直後に呼び出されたプログラムは LDIR で割り込み端子を見て、どの割り込み要求に応じる かを決めます。 割り込み行程直後に呼び出されたプログラムは RETI で戻ります。 |
プログラム環境 |
当プロセッサのプログラムはアセンブリ言語で作りま
す。
アセンブリ言語から命令符への変換は
Electric House
さんのAASM用の
当プロセッサのマクロ
を作って行います。 論理譜の中にプログラムを組み込むときはアセンブラ でインテルHEXファイルを作ってから、論理譜に <例> のような一文を記入します。 これでプログラムの実行結果を機能実行として確認で きます。 |