SSブログ
English Version

SuperSimpleController(その8)メモリ関連のマシン語実装 [OriginalCPU]

 前回の記事でALUとジャンプ関連のマシン語の実装ができたので、今回はメモリ関連のマシン語について書いてみます。
 また、本記事の後半にハード的な問題と対処方法についてメモしておきます。

 今回追加したマシン語は下表の黄色部分のメモリ関連の命令です。

マシン語コード表(作成中) 第2版

★変更 2021/03/13 CFセット機能を追加
★追記 2021/04/28 I/O命令追加の記事に更新したコード表を記載しました


 今回こだわった点の一つとしてコールを1命令で実装したいということがあります。
 ハード的にスタックポインタを持っていませんが、なるべくスタック処理を軽くしようと考えた結果、FFFFHのメモリ内容をスタックの下位バイトとしてスタック上位バイトはFFHに固定することにしました。
 それでもスタック操作では処理数が増えてしまうので上記表に示すようにCALLとRETでは多くのクロック数を必要としています。

 また、メモリアクセス方法としてはアドレス直値指定の方法とベースアドレス(上位アドレス)値を命令内に埋め込んでR0をインデックスにする方式の二通りを準備しました。

 追加したマシン語の動作確認は下記のソースを用いて行っています。

追加したマシン語試験用プログラム(アセンブリ言語)
;++++++++++++++++++++++++++++++++++++++++ ; Simple8Z test program ; by skyriver ; V0.01 2021/02/16 ;++++++++++++++++++++++++++++++++++++++++ .list FFFF STACK EQU 0FFFFH FF3A VAL EQU 0FF3AH 00FF BASE EQU 0FFH 0100 SUB EQU 0100H 0000' ASEG ORG 0 LD_R0 05H ; x7 R0:05 R1:xx 0000 10 + DB 10H 0001 05 + DB 05H WR_R0 VAL ; x18 R0:05 R1:3A 0002 50 + DB 50H 0003 FF3A + DW VAL LD_R0 0FH ; x22 R0:0F R1:3A 0005 10 + DB 10H 0006 0F + DB 0FH RD_R0 VAL ; x33 R0:05 R1:3A NG ->OK 0007 60 + DB 60H 0008 FF3A + DW VAL LD_R1 3CH ; x37 R0:05 R1:3C 000A 18 + DB 18H 000B 3C + DB 3CH LD_R0 0FFH ; x41 R0:FF R1:3C 000C 10 + DB 10H 000D FF + DB 0FFH WR_R1R0 BASE ; x51 R0:FF R1:3C setr SP:FFFF 3C 000E 70 + DB 70H 000F FF + DB BASE LD_R1 0 ; x55 R0:FF R1:00 0010 18 + DB 18H 0011 00 + DB 0 RD_R1R0 BASE ; x65 R0:FF R1:3C NG R1:00 ->OK 0012 80 + DB 80H 0013 FF + DB BASE CALL SUB ; x89 R0:14 R1:FF ADR:0100 0014 B0 + DB 0B0H 0015 00FF + DW (SUB) - 1 HALT ;x147 R0:14 R1:00 0017 FF + DB 0FFH ORG SUB RD_R0 0FFFFH ; x100 R0:3A R1:FF 0100 60 + DB 60H 0101 FFFF + DW 0FFFFH RD_R0 0FF3BH ; x111 R0:00 R1:3A 0103 60 + DB 60H 0104 FF3B + DW 0FF3BH RD_R0 0FF3AH ; x122 R0:14 R1:3A 0106 60 + DB 60H 0107 FF3A + DW 0FF3AH LD_R0 55H ; x126 R0:55 R1:3A 0109 10 + DB 10H 010A 55 + DB 55H RET ; x145 R0:14 R1:00 ADR:0017 010B E0 + DB 0E0H END


 この試験プログラムを最後まで通すのに苦労しましたが、下図が最後のHALT命令まで実行できた際のロジアナ画面になります。
 12:IRW/が命令フェッチ信号なので0の部分がマシン語の区切りになります。
 A1カーソルがPC下位バイトからのキャリによるPC上位バイトのライト信号生成部分(詳細は後述)でA2カーソルが最後のHALT命令を実行したタイミングを示しています(HALT命令はアドレスを進めずに以降も実行し続けます)

テストプログラム完走時のロジアナ画面


 冒頭で書いたようにメモリ関連のマシン語を実装する上で動作が不安定な部分があったのでハード面で対応した内容について以下にメモしておきます。

  1. 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でのライト信号とキャリの合成


  2. 電源電圧とノイズ対策
     今回のオリジナルCPUは現時点では13個のICで構成されています(なるべくTTLを使うようにしていてGALは1個だけ使用)が、消費電流が0.5A程度でブレッドボード上の電源電圧が4Vくらいまで低下していました。
     対策として5V電源からの給電をやめて安定化電源から電源供給するようにしてブレッドボード上で電源電圧が5Vになるように調整しました。またノイズ対策としてパスコンを増やしました。

  3. 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に対するアドレスをグレイコードにする等の対策が必要になります。

  4. データバスのプルアップ
     ハード問題ではないですが、スタック操作する際にPCをFFFFHに設定したいのでデータバスにプルアップ抵抗を追加しました。




[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。