|
開発室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ファイルを作ってから、論理譜に <例> のような一文を記入します。 これでプログラムの実行結果を機能実行として確認で きます。 |