SuperSimpleController(その8)メモリ関連のマシン語実装 [OriginalCPU]
前回の記事でALUとジャンプ関連のマシン語の実装ができたので、今回はメモリ関連のマシン語について書いてみます。
また、本記事の後半にハード的な問題と対処方法についてメモしておきます。
今回追加したマシン語は下表の黄色部分のメモリ関連の命令です。
今回こだわった点の一つとしてコールを1命令で実装したいということがあります。
ハード的にスタックポインタを持っていませんが、なるべくスタック処理を軽くしようと考えた結果、FFFFHのメモリ内容をスタックの下位バイトとしてスタック上位バイトはFFHに固定することにしました。
それでもスタック操作では処理数が増えてしまうので上記表に示すようにCALLとRETでは多くのクロック数を必要としています。
また、メモリアクセス方法としてはアドレス直値指定の方法とベースアドレス(上位アドレス)値を命令内に埋め込んでR0をインデックスにする方式の二通りを準備しました。
追加したマシン語の動作確認は下記のソースを用いて行っています。
この試験プログラムを最後まで通すのに苦労しましたが、下図が最後のHALT命令まで実行できた際のロジアナ画面になります。
12:IRW/が命令フェッチ信号なので0の部分がマシン語の区切りになります。
A1カーソルがPC下位バイトからのキャリによるPC上位バイトのライト信号生成部分(詳細は後述)でA2カーソルが最後のHALT命令を実行したタイミングを示しています(HALT命令はアドレスを進めずに以降も実行し続けます)
冒頭で書いたようにメモリ関連のマシン語を実装する上で動作が不安定な部分があったのでハード面で対応した内容について以下にメモしておきます。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
また、本記事の後半にハード的な問題と対処方法についてメモしておきます。
今回追加したマシン語は下表の黄色部分のメモリ関連の命令です。
マシン語コード表(作成中) 第2版 |
★変更 2021/03/13 CFセット機能を追加 ★追記 2021/04/28 I/O命令追加の記事に更新したコード表を記載しました |
今回こだわった点の一つとしてコールを1命令で実装したいということがあります。
ハード的にスタックポインタを持っていませんが、なるべくスタック処理を軽くしようと考えた結果、FFFFHのメモリ内容をスタックの下位バイトとしてスタック上位バイトはFFHに固定することにしました。
それでもスタック操作では処理数が増えてしまうので上記表に示すようにCALLとRETでは多くのクロック数を必要としています。
また、メモリアクセス方法としてはアドレス直値指定の方法とベースアドレス(上位アドレス)値を命令内に埋め込んでR0をインデックスにする方式の二通りを準備しました。
追加したマシン語の動作確認は下記のソースを用いて行っています。
追加したマシン語試験用プログラム(アセンブリ言語) |
|
この試験プログラムを最後まで通すのに苦労しましたが、下図が最後のHALT命令まで実行できた際のロジアナ画面になります。
12:IRW/が命令フェッチ信号なので0の部分がマシン語の区切りになります。
A1カーソルがPC下位バイトからのキャリによるPC上位バイトのライト信号生成部分(詳細は後述)でA2カーソルが最後のHALT命令を実行したタイミングを示しています(HALT命令はアドレスを進めずに以降も実行し続けます)
テストプログラム完走時のロジアナ画面 |
|
冒頭で書いたようにメモリ関連のマシン語を実装する上で動作が不安定な部分があったのでハード面で対応した内容について以下にメモしておきます。
- PCHのライト信号
プログラムカウンタ(PC)の上位バイト(PCH)へのライト信号はデータロード時などに使うuCODE制御のライト信号と下位バイト(PCL)からのキャリ信号をダイオードORするように回路を組んでいました。
しかし、PCHへのライト信号がダイオードORにより鈍ってしまい動作が不安定でした。下図で水色と黄色がそれぞれダイオードor通過前と通過後の信号です。
ダイオードorによるPCHライト信号の鈍り
そこでPCHライトへのPCLキャリの合成をGALで対応し、それまでGALで対応していたROMのセレクト信号(MEM/=0 & A15=0)をダイオードでANDすることにしました。
下図のロジアナ画面で07:PCL_RCO/がPCLからのキャリで05:QRCO/がGALでラッチ後のRCO/です。
14:PCHWのA1カーソル部で判るようにキャリによりライト信号が自動的に生成されています。
GALでのライト信号とキャリの合成
- 電源電圧とノイズ対策
今回のオリジナルCPUは現時点では13個のICで構成されています(なるべくTTLを使うようにしていてGALは1個だけ使用)が、消費電流が0.5A程度でブレッドボード上の電源電圧が4Vくらいまで低下していました。
対策として5V電源からの給電をやめて安定化電源から電源供給するようにしてブレッドボード上で電源電圧が5Vになるように調整しました。またノイズ対策としてパスコンを増やしました。
- uCODEのグリッチノイズ対策
CALL命令実行時にスタックに書き込んだPCのローバイトがFFHに化ける現象が発生し、悩みました。各制御信号は想定通りに出ていてSRAMのピン上でレベル確認しても問題ない状態でした。
しかも、R0レジスタをメモリに格納する命令"LD (adr),R0"では問題ないのにCALL命令での書込みだけNGとなるという奇妙な現象です。
SRAM(UM61512A-15)のライト信号にグリッチが発生し、メモリ内容が書き換えられているのが原因でした。
このSRAMのライト信号幅の最小値は9ns(さすが高速なSRAM)でロジアナでは見れないグリッチが発生していたようです。グリッチ発生個所はuCODEのアドレスがB9HからBAHに移行する際にBBH(ライトがアクティブ)のデータが一瞬現れたものと推定しています。
対策としてはライト信号を470Ωの抵抗経由で接続することで解決しました(最初は20pF程度のコンデンサも入れる予定でしたがSRAMの入力ピン容量が最大8pFであり抵抗だけで大丈夫でした)
もっと根本的に対処するのであれば、uCODEのROMのOE/を適切に制御(今回は0に固定)するか、uCODEのROMに対するアドレスをグレイコードにする等の対策が必要になります。
- データバスのプルアップ
ハード問題ではないですが、スタック操作する際にPCをFFFFHに設定したいのでデータバスにプルアップ抵抗を追加しました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
2021-02-26 21:46
nice!(0)
コメント(0)
コメント 0