開発室A
8桁プロセッサ

はじめに

一般的な構成による8桁プロセッサを作ります。 一般的とは命令符とデータとスタックを同じメモリ空 間に配置していることです。

同じメモリ空間とは命令符とデータとスタックのそれ ぞれのポインタの指す位置が
同じ値であれば実際のメモリの同じメモリ番地を指す という意味です。

それと1クロックで1命令とするとプロセッサは簡単に なりますが当室のプロセッサ
は1命令が数クロックを必要とするものもある一般的 な方式です。



基本仕様

  • 4個の8桁汎用レジスタ
  • 2個のメモリ番地、ポート番地指定用の番地レジスタ
  • 命令符を指す命令ポインタ
  • スタックを指すスタックポインタ
レジスタと命令符
命令符  レジスタと命令符を決めています。
命令動作  命令符の動作を決めています。
命令解析  命令符の具体的な動作を整理します。





設計

論理譜    基本仕様を具現化していきます。

命令ポインタ スタックポインタ 命令取得 命令行程 命令類別
レジスタ選択 レジスタ設定 番地 出力データ スタック操作
メモリ操作 ポート操作 算術論理演算 メモリ制御 ポート制御
割り込み制御




検証

論理譜を検証していきます。 検証に使う命令符は アセンブラ を使って作ります。


命令符の個別の基本動作を簡単に見ていきます。

MOVI MOVR ADD SUB AND
OR XOR NOT SHU SHD
MOVRX MOVMR MOVRM MOVPR MOVRP
MOVRY MOVXR MOVYR JMP JMPC
JMPZ MOVJ JMPR JMPRC JMPRZ
CALL RET PUSH POP EI/DI
INC/DEC RETI LDSR LDIR STMR
ADDC SUBC ROU ROD CMP
MOVX MOVY MOVS LDCPR STCPR
LDDPR STDPR MOVFR MOVRF INCR2
DECR2




コンパイル

●検証結果を得るためのコンパイルは下のファイルを用意 して

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

●チップ作成のVHDLファイルを得るためのコマンドです 。

コンパイル      LDC cpu8a -vh -opt 0 -qm 0

e0.vhd      チップ作成用ですがテスト端子を含んでいます。
e1.vhd      検証用
s1.vhd      テストベンチ

最終的にチップ化する e0 .vhd は テスト端 子(信号)と機能実行譜を注釈にしたソースをコンパイ ルしたものを使います。





命令ポインタ

命令ポインタは命令符を読み出すメモリ番地を指します。 まず命令ポインタが問題なく更新されていくようにします。

チップ内のレジスタを変える命令を実行しているとき は命令ポインタはひとつずつ増やすだけです。

  • メモリを読み書きする命令。
  • 命令ポインタを変える命令。
上のふたつは単純に増やさない場合です。 メモリへの転送命令では読み書き中のクロックでは命 令ポインタの値を保持します。 命令ポインタを変える命令は「分岐」、「呼び出し」 、「戻り」があります。 命令ポインタへの操作としては 「1増やす」 のと 「保持」 と「代入」があります。

メモリから分岐値を読み出して、そこに分岐します。
JMP JMPC JMPZ CALL RET

分岐レジスタの分岐値を命令ポインタに代入して分岐 します。
JMPR JMPRC JMPRZ

メモリの読み出し中は命令ポインタを保持します。
POP INC DEC MOVJ

メモリの書き込み中は命令ポインタを保持します。
PUSH

スタックポインタ

スタックポインタはスタックに読み書きする位置を指します。

CALL スタックに書き込んでスタックポインタを2減らします。
RET スタックを読み出してスタックポインタを2増やします。
PUSH スタックに書き込んでスタックポインタを減らします。
POP スタックを読み出してスタックポインタを増やします。

命令符取得

プロセッサは命令符取得中か命令符実行中のどちらか にあります。 命令符は1符、2符、3符のものがあって、必要符を読 み終えた後に命令を実行します。

符読み出し順番

1番目の符をメモリデータから読み取って何符の命令 かを判断します。

  • 現在の符が何番目かは cp に記録しています。
  • 何符の命令かは np に記録しています。

MOVI   2符の命令

3符の命令
JMP JMPC JMPZ MOVJ CALL
PUSH POP

上にない命令符は1符の命令です。
1符は1クロックで読み取りますので3符の命令なら3ク ロック後に命令を実行します。

符読み出し

命令の実行中のときを除いてメモリデータを常時、1番目 の命令符として取得しています。

  • codea に 1 番目の符を記録。
  • codeb に 2 番目の符を記録。
  • codec に 3 番目の符を記録。

命令行程

命令行程は命令符の読み取りと命令実行の期間です。

命令行程数設定

命令行程のクロック数です。

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


命令未実行

命令工程にないときは行程数を15にします、命令行程 の終わりには0にします。

命令類別

命令を特定するための補助信号です。
展開される論理を小さくするために用いますが、本信 号でいつも命令を特定する訳ではありません。

JMP JMPC JMPZ MOVJ CALL
PUSH POP INC DEC MOVI
MOVMR MOVRM MOVPR MOVRP


レジスタ選択

命令実行によって変更されるレジスタを選択します。

早期に選択

1番目の符を読み出した次のクロックでレジスタを操作する場合です。

● 算術論理演算

● レジスタ転送

MOVR MOVRX MOVRY MOVXR MOVYR


通常の選択

1番目の符を読み出してからメモリやポートを読み出 して、その次にレジスタ操作がある場合です。

MOVI MOVMR MOVPR MOVJ POP
INC DEC

INC と DEC では 2 番目の符でレジスタを選択します。

レジスタ設定

汎用レジスタ、番地レジスタ、分岐レジスタへの書き 込み操作です。

R0

汎用レジスタ R0 の書き込み操作です。

MOVR MOVPR MOVI MOVMR MOVPR
POP INC DEC MOVXR MOVYR

● 算術論理演算
● RP0 の R0 部分に書き込む場合。

R1

汎用レジスタ R1 の書き込み操作です。

MOVR MOVPR MOVI MOVMR MOVPR
POP INC DEC MOVXR MOVYR

● 算術論理演算
● RP0 の R1 部分に書き込む場合。

R2

汎用レジスタ R2 の書き込み操作です。

MOVR MOVPR MOVI MOVMR MOVPR
POP INC DEC MOVXR MOVYR

● 算術論理演算
● RP1 の R2 部分に書き込む場合。

R3

汎用レジスタ R3 の書き込み操作です。

MOVR MOVPR MOVI MOVMR MOVPR
POP INC DEC MOVXR MOVYR

● 算術論理演算
● RP1 の R3 部分に書き込む場合。

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種類の領 域を共用して使っています。
  • ip 命令符領域
  • sp スタック領域
  • ix,iy データ領域

ポート制御

ポートはメモリと別の空間に配置されていますが番地 とデータの端子を共有しています。 書き込みと読み出しをポート固有の端子にすることで 別の空間を操作します。


割り込み制御

割り込み制御は割り込みの有効と無効を制御します。 有効と無効は状態レジスタの第3桁の指標でPUSH命令 とPOP命令の対象になっています。

EI DI POP


割り込み要求端子は8個あります。

INT0, INT1, INT2, INT3, INT4, INT5, INT6, INT7

INT0 から INT6 は割り込みの有効・無効を設定できます。 INT7 は無効にできない割り込みです。

割り込み要求は割り込みプログラムを呼び出すまで 記憶 されます。

割り込みプログラムを呼び出すまでのプロセッサの動 作はスタックに現在の命令ポインタと指標を書き込む ことです。 割り込み行程 と言います。

割り込み行程は実行中の命令行程を避けて入るように なっています。

割り込み行程直後に呼び出されたプログラムは LDIR で割り込み端子を見て、どの割り込み要求に応じる かを決めます。

割り込み行程直後に呼び出されたプログラムは RETI で戻ります。


プログラム環境

当プロセッサのプログラムはアセンブリ言語で作りま す。 アセンブリ言語から命令符への変換は Electric House さんのAASM用の 当プロセッサのマクロ を作って行います。

論理譜の中にプログラムを組み込むときはアセンブラ でインテルHEXファイルを作ってから、論理譜に

<例> のような一文を記入します。 これでプログラムの実行結果を機能実行として確認で きます。





先頭