SSブログ
English Version

SuperSimpleController(その3) [OriginalCPU]

 前回記事で構想中のオリジナルCPUのブロック図を書きましたが、回路などを検討すると何ヶ所が変更/修正が必要だったので再整理しています。
 ALUの機能指定ビット数を3bitから4bitに増やして論理演算にも対応しました。その他、複数個所を変更しています。

オリジナルCPU(Simple8Z)概要ブロック図 V0.02

★追記 2021/03/30
 「回路図とパターン設計」の記事にアップデートしたブロック図を掲載しています。


 M27C1024とGAL22V10のピンアサインは下図のように考えています(暫定版です)
 ブレッドボードを3連結すれば組めそうな回路規模です。

ピンアサイン(暫定版)


 GAL部分の設計はそれ程難しくはないのでサクッとできました。現時点でのPLDファイルは下記になります。

Simple8Z GAL設計
Name Super8Z; Partno SK8; Date 2021/02/03; Rev 01; Designer skyriver; Company skyriver; Assembly None; Location None; Device G22V10; /* * Simple8Z : original simple CPU /* /* G22V10 +--- ---+ clock 1| |24 +5V D0 2| |23 QD0 D1 3| |22 QD1 D2 4| |21 QD2 D3 5| |20 QD3 ZF 6| |19 QZF CF 7| |18 QCF !IRW 8| |17 OPLW FLW 9| |16 OPHW PLW 10| |15 !OROM PHW 11| |14 A15 GND 12| |13 !MEM +-------+ */ /** Inputs **/ PIN 1 = clock; /* Register Clock */ PIN 2 = D0; /* IR */ PIN 3 = D1; /* IR */ PIN 4 = D2; /* IR */ PIN 5 = D3; /* IR */ PIN 6 = ZF; /* Zero flag */ PIN 7 = CF; /* Carry flag */ PIN 8 = !IRW; /* IR write */ PIN 9 = FLW; /* flag write */ PIN 10 = PLW; /* PC low write */ PIN 11 = PHW; /* PC high write */ PIN 13 = !MEM; /* MEM/ */ PIN 14 = A15; /* A15 */ /** Outputs **/ PIN 23 = QD0; /* D0 */ PIN 22 = QD1; /* D1 */ PIN 21 = QD2; /* D2 */ PIN 20 = QD3; /* D2 */ PIN 19 = QZF; /* Zero flag */ PIN 18 = QCF; /* Carry flag */ PIN 17 = OPLW; /* PC low write */ PIN 16 = OPHW; /* PC high write */ PIN 15 = !OROM; /* ROM enable */ /* Field definition */ field IRLOW = [D3..0]; /* IR low bits */ field register = [QD0,QD1,QD2,QD3,QZF,QCF,QPLW,QPHW,QR1W,QR0W]; field regALUAD = [QD0,QD1,QD2,QD3]; /* upper address for ALU */ field regCONT = [QZF,QCF,QPLW,QPHW,QR1W,QR0W]; /* control sig */ /* constance definition */ $DEFINE CNDJPZ 'b'0000 $DEFINE CNDJPNZ 'b'0001 $DEFINE CNDJPC 'b'0010 $DEFINE CNDJPNC 'b'0011 $DEFINE CNDJP 'b'0100 /* logic definition */ register.ar = 'b'0; register.sp = 'b'0; regALUAD.oe = !IRW; regCONT.oe = 'b'1; append QD0.d = IRW & D0; append QD0.d = !IRW & QD0; append QD1.d = IRW & D1; append QD1.d = !IRW & QD1; append QD2.d = IRW & D2; append QD2.d = !IRW & QD2; append QD3.d = IRW & D3; append QD3.d = !IRW & QD3; append QZF.d = IRW & ZF; append QZF.d = !IRW & QZF; append QCF.d = IRW & CF; append QCF.d = !IRW & QCF; append OPLW = PLW & IRLOW:CNDJPZ & QZF; append OPLW = PLW & IRLOW:CNDJPNZ & !QZF; append OPLW = PLW & IRLOW:CNDJPC & QCF; append OPLW = PLW & IRLOW:CNDJPNC & !QCF; append OPLW = PLW & IRLOW:CNDJP; append OPHW = PHW & IRLOW:CNDJPZ & QZF; append OPHW = PHW & IRLOW:CNDJPNZ & !QZF; append OPHW = PHW & IRLOW:CNDJPC & QCF; append OPHW = PHW & IRLOW:CNDJPNC & !QCF; append OPHW = PHW & IRLOW:CNDJP; append OROM = MEM & !A15;


 初めにリセット後の動作を検討しています。CPU内のコントロール部分は前々回記事で書いたSuperSimpleComtrollerの仕掛けを踏襲しているのでuCODEのROMの先頭に制御コード(制御信号の遷移データ)を書くことになります。
 15個の制御信号の個々についてON/OFFを指定しながらROMに格納するデータを作成するにはどんな環境がいいだろうか? と考えた結果、マクロアセンブラのマクロ機能を使うことにしました。

 uCODEと言っても言語的な要素があるわけではないので本来のマイクロコードとは違うのですがマシン語に近い生産性の悪さがありますw

 下のリストは0000Hから始まるリセット処理(PCをゼロクリアし、0000H番地のコードをIRにフェッチする)とジャンプ命令(0C4H)に対応する作成中のコード例です。(マシン語の全体のコード体系はまだ考えていません^^;)

 ジャンプ処理では、ジャンプ先の下位番地を一時的にR1レジスタに保存していますが、ALUのファンクション指定ができない・・という詰んだ状態になりましたw
 リセット信号でGAL内のレジスタをクリアする方法も考えられますが、GALは既に全てのピンを使用済みなのでリセット入力できません^^;

 ICを増やせば簡単なのですが、チップ数は最小限にしたいので、解決策としてIRW信号がアクティブな時はGALからALUへ渡す4bitの機能指定信号をフローティング状態にしてプルアップすることでALUからR1レジスタが出力されるようにしました。

 ブレッドボードで仮組中ですが、まだまだ先は長そうです・・・・

Simple8Z uCODE sample in development
;++++++++++++++++++++++++++++++++++ ; uCODE data for Simple8Z ; made by skyriver ; Ver 0.01 2021/02/03 ;++++++++++++++++++++++++++++++++++ ; Simple8Z control signals bit assign 0001 PLW EQU 01H 0002 PHW EQU 02H 0004 FLW EQU 04H 0008 IRW EQU 08H 0010 PCS0 EQU 10H 0020 PCS1 EQU 20H 0040 MEM EQU 40H 0080 ALUR EQU 80H 0100 RD EQU 0100H 0200 WR EQU 0200H 0400 R0W EQU 0400H 0800 R1W EQU 0800H 1000 ALD EQU 1000H 2000 ALR EQU 2000H 4000 AHR EQU 4000H ; low active control signals 63C8 NEGSIG EQU (IRW or MEM or ALUR or RD or WR or ALR or AHR) ; uCode last value inc-mode 62F0 LastVal EQU (NEGSIG OR PCS0 OR PCS1) AND (NOT RD) AND (NOT IRW) 62F0 SIGNAL SET LastVal SETHI macro bit ; set sig high SIGNAL set SIGNAL OR bit endm SETLOW macro bit ; set sig low SIGNAL set SIGNAL AND NOT bit endm ACT macro bit ; set sig active IF bit AND NEGSIG SIGNAL set SIGNAL AND NOT bit ELSE SIGNAL set SIGNAL OR bit ENDIF endm CLR macro bit ; clear sig IF bit AND NEGSIG SIGNAL set SIGNAL OR bit ELSE SIGNAL set SIGNAL AND NOT bit ENDIF endm PCCLR macro ; set PC to clear-mode CLR PCS0 CLR PCS1 endm PCDEC macro ; set PC to decrement-mode ACT PCS0 CLR PCS1 endm PCLOAD macro ; set PC to load-mode CLR PCS0 ACT PCS1 endm PCINC macro ; set PC to incriment-mode ACT PCS0 ACT PCS1 endm CODE macro DW SIGNAL endm 0000' ASEG ; *** reset ORG 0 PCCLR ; clear-mode CODE 0000 62E0 + DW SIGNAL ACT PLW ; set PCL ACT PHW ; set PCH CLR IRW CODE 0002 62EB + DW SIGNAL CLR PLW CLR PHW ACT RD ; memory read PCINC ; set PC to increment-mode CODE 0004 62F8 + DW SIGNAL 62F0 SIGNAL SET LastVal CODE ; set IR 0006 62F0 + DW SIGNAL ; *** JP:0C4H ; JZ:0C0H JNZ:0C1H JC:0C2H JNC:0C3H ORG 0C0H * 2 ACT PLW CODE ; inc PC 0180 62F1 + DW SIGNAL CLR PLW ACT R1W CODE ; save low addr to R1 0182 6AF0 + DW SIGNAL ACT PLW CODE ; inc PC 0184 6AF1 + DW SIGNAL CLR PLW PCLOAD ; set PC to load-mode CODE 0186 6AE0 + DW SIGNAL ACT PHW CODE ; write PC high 0188 6AE2 + DW SIGNAL CLR PHW CLR RD ACT ALUR ; read R1 register CODE 018A 6B60 + DW SIGNAL ACT PLW CODE ; set low addr 018C 6B61 + DW SIGNAL CLR PLW PCINC ; set PC to increment-mode ACT RD CODE 018E 6A70 + DW SIGNAL ACT PLW ; inc addr CODE 0190 6A71 + DW SIGNAL 62F0 SIGNAL SET LastVal CODE ; set IR 0192 62F0 + DW SIGNAL END Macros: ACT CLR CODE PCCLR PCDEC PCINC PCLOAD SETHI SETLOW Symbols: 4000 AHR 1000 ALD 2000 ALR 0080 ALUR 0004 FLW 0008 IRW 62F0 LASTVAL 0040 MEM 63C8 NEGSIG 0010 PCS0 0020 PCS1 0002 PHW 0001 PLW 0400 R0W 0800 R1W 0100 RD 62F0 SIGNAL 0200 WR No Fatal error(s)



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

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー