SSブログ
English Version

3チップ構成68Kマイコンの構想(その13)プリント基板完成 [68K]

3チップ構成68Kマイコンの構想(その11)回路図整理とパターン設計」の記事に書いたように今回は最初からCNCでのプリント基板製造は諦め、プリント基板製造業者に製造を依頼することにしました。

 10/8にポチリ、10/24に到着しました。
 仕上がり具合は特に問題なく、綺麗に作って貰っています。
 今回は青色のソルダレジストにしてみました。トラック幅はCNCで切削し易い設定のままなので太めですw

PCB Top side



PCB Bottom side


 早々に部品を実装してみましたが、CP/Mが立ち上がりません・・orz
 「3チップ構成68Kマイコンの構想」の記事で書いたような簡単なプログラムは動作しましたが、メモリの末尾(0x0007fc00)を使ったPICと68Kとのデータの受け渡しができていないようです・・
 簡易的なモニタプログラムを作成して確認してみようかとも思いましたが、PICと68Kとのパラメータ渡しが出来ていない(メモリの先頭ではokのようですが、どの範囲がNGなのか不明)ので68Kからコンソール入出力ができないため、メモリ編集機能を実装することもできません・・・

 そこでこんなプログラムを作成してみました。
  1. 0x001000~0X07FF00の範囲で0x0100毎にメモリアドレスを書込む。(例 0x001800には0x00001800が書き込まれる)
  2. 次に0x001000~0X07F000の範囲で0x1000毎にメモリに書き込まれたアドレス値を拾い、0x0100からのメモリ領域に書き込む。
  3. 0x0100からのメモリ内容を調べることで68Kのメモリアクセス状況を確認する。また、PIC側からメモリダンプを調べることで68Kとのアクセスアドレスが一致しているかを確認する。(※確認は人手で行う)


 68K側のプログラムはこんな感じです。EASy68Kを使用しています。

メモリ確認用68Kプログラム
00000380 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2018/10/28 0:31:53 00000000 1 * as68 -P -S c: SrcFile -O ObjFile 00000000 2 * lo68 [-S] -Ztext_address -Ddata_addressObjFile -O OutFile 00000000 3 00000000 4 * text 00000000 5 00000380 6 org $0380 00000380 7 00000380 203C 00001000 8 START: move.l #$1000,d0 * start adr 00000386 2600 9 move.l d0,d3 * save para 00000388 223C 00000100 10 move.l #$00000100,d1 * inc width 0000038E 243C 00080000 11 move.l #$00080000,d2 * end adr 00000394 2040 12 loop: move.l d0,a0 00000396 2080 13 move.l d0,(a0) 00000398 D081 14 add.l d1,d0 0000039A B082 15 cmp.l d2,d0 0000039C 66F6 16 bne loop 0000039E 17 0000039E 227C 00000100 18 move.l #$0100,a1 * result save area 000003A4 2003 19 move.l d3,d0 000003A6 2203 20 move.l d3,d1 * inc:$1000 000003A8 2040 21 loop2: move.l d0,a0 000003AA 22D0 22 move.l (a0),(a1)+ 000003AC D081 23 add.l d1,d0 000003AE B082 24 cmp.l d2,d0 000003B0 66F6 25 bne loop2 000003B2 26 000003B2 60FE 27 bra * 000003B4 28 000003B4 29 end START No errors detected No warnings generated SYMBOL TABLE INFORMATION Symbol-name Value ------------------------- LOOP 394 LOOP2 3A8 START 380


 アセンブルしてできたSレコードファイルをバイナリ変換し、picleのステートメントに自動変換後、picleソースに埋め込み、実行した結果は次のとおりでした。


picleソースに埋め込み実行した結果
:l 1:# 3chips MC68008 OneBoard test 2018/10/27 2:# by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7: 8:proc main() { 9: var adr; 10: init(); 11: initPmp(); 12: initSpi(); 13:# initSd(); 14: 15: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 16: 17: PmpOn(); 18: PmpSetAdr(0); 19: MemWr($00); # stack 20: MemWr($02); 21: MemWr($00); 22: MemWr($00); 23: MemWr($00); # PC 24: MemWr($00); 25: MemWr($03); 26: MemWr($80); 27: 28: adr = $0380; # 68K's ADR:00000380 29: PmpSetAdr(adr); 30: 31: MemWr($20); 32: MemWr($3c); 33: MemWr($00); 34: MemWr($00); 35: MemWr($10); 36: MemWr($00); 37: MemWr($26); 38: MemWr($00); 39: MemWr($22); 40: MemWr($3c); 41: MemWr($00); 42: MemWr($00); 43: MemWr($01); 44: MemWr($00); 45: MemWr($24); 46: MemWr($3c); 47: MemWr($00); 48: MemWr($08); 49: MemWr($00); 50: MemWr($00); 51: MemWr($20); 52: MemWr($40); 53: MemWr($20); 54: MemWr($80); 55: MemWr($d0); 56: MemWr($81); 57: MemWr($b0); 58: MemWr($82); 59: MemWr($66); 60: MemWr($f6); 61: MemWr($22); 62: MemWr($7c); 63: MemWr($00); 64: MemWr($00); 65: MemWr($01); 66: MemWr($00); 67: MemWr($20); 68: MemWr($03); 69: MemWr($22); 70: MemWr($03); 71: MemWr($20); 72: MemWr($40); 73: MemWr($22); 74: MemWr($d0); 75: MemWr($d0); 76: MemWr($81); 77: MemWr($b0); 78: MemWr($82); 79: MemWr($66); 80: MemWr($f6); 81: MemWr($60); 82: MemWr($fe); 83: 84: PmpOff(); 85: dump(0); 86:# dump(adr); 87: 88: BusRelease(); 89: LATA[-2]=LATA[-2]|$3; # off reset:a0 halt:a1 90: 91: Timer_=10; 92: while (Timer_) {} # 100ms wait 93: 94: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 95: PrnStr_( "\n-------" ); 96: dump(adr); 97: PrnStr_( "\n-------" ); 98: dump($0100); 99: dump($0180); 100: dump($0200); 101: dump($0280); 102: PrnStr_( "\n-------" ); 103: dump($0400); # 68K's adr:0007fc00 104:} :run 0000 : 00 02 00 00 00 00 03 80 00 00 4D E0 00 00 4D E4 0010 : 00 00 4D E8 00 00 4D EC 00 00 4D F0 00 00 4D F4 0020 : 00 00 4D F8 00 00 4D FC 00 00 4E 00 00 00 4E 04 0030 : 00 00 4E 08 00 00 4E 0C 00 00 4E 10 00 00 4E 14 0040 : 00 00 4E 18 00 00 4E 1C 00 00 4E 20 00 00 4E 24 0050 : 00 00 4E 28 00 00 4E 2C 00 00 4E 30 00 00 4E 34 0060 : EE 28 41 85 9E 4D AA 06 BA 69 2F 1D D6 1B 03 AE 0070 : F7 2B AC FB 37 6A 10 BE 0B 03 1F 12 17 FC 3C 6C ------- 0380 : 20 3C 00 00 10 00 26 00 22 3C 00 00 01 00 24 3C 0390 : 00 08 00 00 20 40 20 80 D0 81 B0 82 66 F6 22 7C 03A0 : 00 00 01 00 20 03 22 03 20 40 22 D0 D0 81 B0 82 03B0 : 66 F6 60 FE FE 00 72 7F 24 D8 51 C9 FF FC 52 40 03C0 : 51 CA FF E8 4E D3 0D 2E 2E 2E 20 6C 6F 61 64 69 03D0 : 6E 67 20 00 02 41 00 FF 00 41 03 00 32 81 4E 70 03E0 : 4E 75 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ------- 0100 : 00 00 10 00 00 00 20 00 00 00 30 00 00 00 40 00 0110 : 00 00 50 00 00 00 60 00 00 00 70 00 00 00 80 00 0120 : 00 00 90 00 00 00 A0 00 00 00 B0 00 00 00 C0 00 0130 : 00 00 D0 00 00 00 E0 00 00 00 F0 00 00 01 00 00 0140 : 00 01 10 00 00 01 20 00 00 01 30 00 00 01 40 00 0150 : 00 01 50 00 00 01 60 00 00 01 70 00 00 01 80 00 0160 : 00 01 90 00 00 01 A0 00 00 01 B0 00 00 01 C0 00 0170 : 00 01 D0 00 00 01 E0 00 00 01 F0 00 00 02 00 00 0180 : 00 02 10 00 00 02 20 00 00 02 30 00 00 02 40 00 0190 : 00 02 50 00 00 02 60 00 00 02 70 00 00 02 80 00 01A0 : 00 02 90 00 00 02 A0 00 00 02 B0 00 00 02 C0 00 01B0 : 00 02 D0 00 00 02 E0 00 00 02 F0 00 00 03 00 00 01C0 : 00 03 10 00 00 03 20 00 00 03 30 00 00 03 40 00 01D0 : 00 03 50 00 00 03 60 00 00 03 70 00 00 03 80 00 01E0 : 00 03 90 00 00 03 A0 00 00 03 B0 00 00 03 C0 00 01F0 : 00 03 D0 00 00 03 E0 00 00 03 F0 00 00 04 00 00 0200 : 00 04 10 00 00 04 20 00 00 04 30 00 00 04 40 00 0210 : 00 04 50 00 00 04 60 00 00 04 70 00 00 04 80 00 0220 : 00 04 90 00 00 04 A0 00 00 04 B0 00 00 04 C0 00 0230 : 00 04 D0 00 00 04 E0 00 00 04 F0 00 00 05 00 00 0240 : 00 05 10 00 00 05 20 00 00 05 30 00 00 05 40 00 0250 : 00 05 50 00 00 05 60 00 00 05 70 00 00 05 80 00 0260 : 00 05 90 00 00 05 A0 00 00 05 B0 00 00 05 C0 00 0270 : 00 05 D0 00 00 05 E0 00 00 05 F0 00 00 06 00 00 0280 : 00 06 10 00 00 06 20 00 00 06 30 00 00 06 40 00 0290 : 00 06 50 00 00 06 60 00 00 06 70 00 00 06 80 00 02A0 : 00 06 90 00 00 06 A0 00 00 06 B0 00 00 06 C0 00 02B0 : 00 06 D0 00 00 06 E0 00 00 06 F0 00 00 07 00 00 02C0 : 00 07 10 00 00 07 20 00 00 07 30 00 00 07 40 00 02D0 : 00 07 50 00 00 07 60 00 00 07 70 00 00 07 80 00 02E0 : 00 07 90 00 00 07 A0 00 00 07 B0 00 00 07 C0 00 02F0 : 00 07 D0 00 00 07 E0 00 00 07 F0 00 97 54 9F D4 ------- 0400 : 00 03 FC 00 00 00 00 00 00 07 FC 22 00 01 27 E8 0410 : 00 00 00 00 60 36 00 00 00 00 00 00 00 00 00 01 0420 : 00 01 00 07 FC 58 00 01 09 58 FF F7 00 01 00 00 0430 : 00 07 FC 4A 00 01 27 E8 00 00 00 00 60 36 00 00 0440 : 00 00 00 00 00 00 00 01 00 01 2E F0 00 01 44 70 0450 : FF F7 17 72 FF FF 00 00 00 01 63 BA 00 01 4C F7 0460 : 00 07 FC 98 00 01 2D B2 00 07 FC 78 00 01 63 BB 0470 : 00 08 00 00 00 01 4C F0 61 36 58 58 00 01 2E F0 :


 上の0x0100部のダンプリスト内容から68K側からのメモリアクセスは特に問題無いようです。
 0x0400部(実メモリ上のアドレスは0X0007fc00)のダンプ結果からPICからの0X07fc00のアクセスはA18がhighにならずlowの状態(結果0x0003fc00が読める)のようです。

 だいぶ状況が判ってきました^^
 次にシンクロでA18がhighになった状態の電圧レベルを確認しました(リファレンスとしてA16と比較)
 黄色がアドレス信号で紫色はトリガを取るためのBG/信号です。

A16の信号波形 A18の信号波形


 A16ももう少し高い電圧の方がいいのですが(今回は回路を限界的に簡略化しているのでこれでOKとします・・LEDの数は多めだけどw)、A18は明らかに電圧が低くなっています・・・・

 ボードから電源を抜いた状態でA18とGND間の抵抗を計ってみると2.6Kほどでした(他のアドレス線は15K程度)
 一応、半田付け状態も確認しましたが、問題なさそうだったのでメモリを抜いてみると抵抗が他のアドレス線と同じ15K程度になりました。

 このことからメモリチップが原因である可能性大です。今回使用している512KBのメモリは2個しか持っていないのでブレッドボードで使っているメモリを抜いてPCBに付けてみたところ無事にCP/M-68Kが立ち上がりました(^^)/

 消費電流を計ってみたところ、CP/M起動状態での通常時は170mA、SDカードアクセス時に190mA程度でした。
 通常時(キー入力待ち状態)は68KはバスをPICに引き渡して何もしていない状態ですが、使用しているMC68008P10はHMOSプロセスで製造されてるので消費電流はスイッチング速度によらず一定です。

 最後にCP/M-68Kが動作中のボード写真を貼っておきます^^
 メモリはブレッドボードで使用していたものに交換したのでピン番号と信号名の書かれた紙が貼ってありますw

CP/M-68K動作中の写真


★2018/11/03 追記
 「3チップ構成68Kマイコンの構想(その11)回路図整理とパターン設計」の回路図で
  • PL3
    1-2 の接続を解除
  • PL4
    1-2 -> 2-3 にジャンパピン変更

にジャンパピンを変え、PICの31ピンから16MHzが出力されるようにconfigを変更、更にバスリクエスト(BR/:low)時にBG/チェックをしなようにPIC側のソフトを変更することで、MC68008P10(10MHz版)への供給クロックを16MHzにしてみました。

 この状態でCP/M-68Kを起動したところ、Cold Boot Loaderが出力している「...booting」が表示された後、「ERAC」のLEDが点灯(メモリ実装外のアドレスをアクセス)して反応がなくなりました^^;
 (メモリのアクセスタイムは70nsなので大丈夫だと思いますが)やはり68Kの10MHz版では16MHz動作は厳しいようです。


★2018/12/04 追記
 ebayで注文していた512KBのSRAMが届いたのでブレッドボード用にラベルの付けたメモリからラベル無しのものに交換しました。
 記念として撮った写真を貼っておきます。TOP面のR23がDCジャックと若干干渉気味ですがDCジャック用の丸穴が大きめなので位置調整で何とか入りそう(若干削るといいかも^^;)
 初期バージョンとしてはまぁまぁのできではないでしょうか?

Pic24CPM68K部品実装写真(top面)


Pic24CPM68K部品実装写真(bottom面)


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

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

3チップ構成68Kマイコンの構想(その12)Blocking/Deblocking [68K]

 前回の記事でプリント基板化のためのパターン設計について書きましたが、プリント基板製造をSeeedさんに注文し待ち状態です^^

 今回はCP/M-68KのSDカードアクセス時のブロッキング/デブロッキング処理を追加しました。
 3チップ構成のCP/M-80の時はCP/Mのメモリサイズを最大の64KBにしたいこともあってSDカードアクセス処理でブロッキング/デブロッキング処理には対応していませんでした。
 今回のCP/M-68KではBIOSのメモリサイズをあまり気にしなくてもいいこと、及びコマンドのサイズがCP/M-80と比較して大きめなのでコマンド実行時に少し待ち時間が発生してしまうのでブロッキング/デブロッキング処理に対応しました。

 SDカードのブロック長は512バイトなのでCP/Mのセクタ(128バイト)の4つ分に該当します。
 今回の対応で変更したワークエリアは
  1. PICと68K間のSDデータ渡し用の領域(SDバッファ)を128バイトから512バイトに変更
  2. SDバッファ内のデータがSDに書き込み済みでない場合の変更フラグを追加
  3. SDバッファの属性としてsector番号での管理をSDのブロック番号の管理に変更

の変更を行いました。

 BIOS内のWriteSectorコール時にD1レジスタに下記の情報が渡されます。
  1. d1.w = 0 : normal write
  2. d1.w = 1 : write to a directory sector
  3. d1.w = 2 : write to first sector of new block

 WriteSector処理での追加処理としては最初にSDバッファがヒット(今回の書込みセクタが含まれている)場合はSDの先読みは不要で含まれていない場合は変更フラグがオンならSDバッファをSDに書き込み後、先読みが必要か判断します。
 3)の場合は先読み不要でそれ以外の場合は先読みが必要になります。
 DMAの内容をSDバッファに書き込み、変更フラグをオンにし、2)の場合は即座にSDバッファ内容をSDに書き込みます(変更フラグはオフにする)。

 ReadSector処理に関してはSDバッファにヒットしている場合はSDバッファからセクタ内容を読み取り、ヒットしない場合は変更フラグがオンの場合SDバッファを書込んだ後、必要なSDブロックの内容をSDバッファに読込みます。
 SDバッファにヒットした場合、変更フラグがオンでもSDへの書込みは不要ですが、今回は長時間変更フラグがオンになる(その間、電源断等が発生すると書込み情報が失われる)のを避けるため、ReadSector処理ではありますがSDへの書込みを行うようにしました。

 文章で書くと少しややこしいですが、プログラム的には若干の追加で対応可能です。
 (ワークエリアはSDバッファが4倍に増えるけどプログラムコードのサイズはあまり増えない)

 参考に今回対応したBIOSのReadSectorとWriteSectorの部分の抜粋を以下に貼っておきます。

BIOS内ブロッキング/デブロッキング処理
212 * caliculate sector number 213 * d2 -> logical sector number in buffer 214 * d3 -> SD block No 215 CalSdSec: 216 0000017A 4283 clr.l d3 217 0000017C 363900000002 move.w track,d3 218 00000182 ED8B lsl.l #SEC_TR_SFT,d3 219 00000184 4282 clr.l d2 220 00000186 343900000004 move.w sector,d2 221 0000018C D682 add.l d2,d3 222 0000018E 2403 move.l d3,d2 223 00000190 028200000003 andi.l #$03,d2 * logical sec in buffer 224 00000196 E48B lsr.l #SD_SFT,d3 225 00000198 4E75 rts 226 227 * read sector 228 * d0.w -> 0:no error, 1:error 229 read: 230 0000019A 610000A8 bsr flush * if no error then d0.w=0 231 0000019E 66000038 bne rdend * if error 232 000001A2 61D6 bsr CalSdSec 233 000001A4 B6A90002 cmp.l OSdSec(a1),d3 234 000001A8 67000014 beq rd010 * if hit buffer 235 236 000001AC 12BC0004 move.b #FC_READ,(a1) 237 000001B0 23430002 move.l d3,OSdSec(a1) 238 000001B4 4E70 reset 239 000001B6 30290006 move.w ORetVal(a1),d0 * get return val 240 000001BA 6600001C bne rdend * if error 241 242 000001BE C4FC0080 rd010: mulu #SEC_SIZE,d2 243 000001C2 D4BC0007FE00 add.l #PICDMA,d2 244 000001C8 2042 move.l d2,a0 245 000001CA 247900000006 move.l dma,a2 246 000001D0 747F moveq #(SEC_SIZE-1),d2 247 000001D2 14D8 rdcpy: move.b (a0)+,(a2)+ * DMA is able to be odd 248 000001D4 51CAFFFC dbf d2,rdcpy 249 000001D8 4E75 rdend: rts 250 251 252 * write sector 253 * d1.w <- 0:normal write 1:directory write 2:write to first sector of new block 254 * d0.w -> 0:no error, 1:error 255 write: 256 000001DA 4280 clr.l d0 * set no error value 257 000001DC 619C bsr CalSdSec 258 000001DE B6A90002 cmp.l OSdSec(a1),d3 259 000001E2 67000024 beq wr010 * if hit buffer 260 261 000001E6 6100005C bsr flush 262 000001EA 66000056 bne wrend * if error 263 264 000001EE 23430002 move.l d3,OSdSec(a1) 265 000001F2 B27C0002 cmp.w #2,d1 266 000001F6 67000010 beq wr010 * if new block 267 268 000001FA 12BC0004 move.b #FC_READ,(a1) 269 000001FE 4E70 reset 270 00000200 30290006 move.w ORetVal(a1),d0 * get return val 271 00000204 6600003C bne wrend * if error 272 273 00000208 C4FC0080 wr010: mulu #SEC_SIZE,d2 274 0000020C D4BC0007FE00 add.l #PICDMA,d2 275 00000212 2042 move.l d2,a0 276 00000214 247900000006 move.l dma,a2 277 0000021A 747F moveq #(SEC_SIZE-1),d2 278 0000021C 10DA wrcpy: move.b (a2)+,(a0)+ 279 0000021E 51CAFFFC dbf d2,wrcpy 280 281 00000222 13FC000100000001 move.b #1,ChgFlg * set change flag 282 0000022A B27C0001 cmp #1,d1 283 0000022E 66000012 bne wrend * if not directory wite 284 285 00000232 423900000001 clr.b ChgFlg 286 00000238 12BC0005 move.b #FC_WRITE,(a1) 287 0000023C 4E70 reset 288 0000023E 30290006 move.w ORetVal(a1),d0 * get return val 289 00000242 4E75 wrend: rts 290 291 292 * flush disk 293 * d0.w -> 0:no err, $ffff:cann't flush 294 00000244 4240 flush: clr.w d0 295 00000246 103900000001 move.b ChgFlg,d0 296 0000024C 67000012 beq flend 297 00000250 423900000001 clr.b ChgFlg 298 00000256 12BC0005 move.b #FC_WRITE,(a1) 299 0000025A 4E70 reset 300 0000025C 30290006 move.w ORetVal(a1),d0 * get return val 301 00000260 4E75 flend: rts 302 303


 ブロッキング/デブロッキング対処後の動作例として「XMODEMアプリの作成」の記事で載せたxmodemでのファイル送信中のロジアナ波形のbefore/Afterを貼っておきます。

Before


 対処後は下図の赤丸部分に示すようにSDカードのアクセス回数が減少しています。

After


★2018/10/17 追記
 コメントに書いたようにCP/MからBIOSのWriteSectorには新たに確保したブロックの最初のセクタ書込み(D1レジスタ=2)であるという情報が渡されています。
 今回はCP/Mのブロックサイズを2048バイトにしているので、この情報からSDカードの4ブロック分(SDカードのブロックサイズは512バイト)、先読み無しで書込んでも問題ないはずなので改善してみました。
 ワークエリアとして新たに先読み不要カウンタと先読み無しで書込んだブロック番号の保存用ワークを追加して、念のためにSDカードのブロック番号が連番であることも確認するようにしています。
 また、ワークエリアを絶対アドレス指定でアクセスするとコード効率が悪くなるのでアドレスレジスタとのオフセットでアクセスするように一部変更しました。

 CP/Mの2ブロック分をバイナリモードで単純に書き込むテストプログラムを作りSDカードへの書込み動作を確認してみました。新規ファイルへの書込み動作のみを確認するためにファイルオープン後の書込み開始前と書込み終了後のファイルクローズ前にキー入力処理を入れることでファイルへの書込み中の波形をロジアナで確認しました。

 下のキャプチャがロジアナ波形のBefore/After比較になります。

 対処前はCP/Mブロックの最初の書込みだけ先読みがない状態なのでSDへの書込みの4回に3回は先読みが発生しています。

Before


 改善後は新規書込みの場合、常に先読み無しでSDカードへの書込みが行われていて想定通りの動作になっています。

After


 今回、CPM.SYSを何度か変更して評価するにあたり、CP/M-68Kで採用されているCP/Mローダのおかげで、AドライブのCPM.SYSファイルを入れ替えてCP/Mを再立ち上げするだけでいいので効率的に作業が出来ました。

 CP/Mのファイルセットに含まれているサイズが大きめのDDT68000.68K(431セクタ、54KB)のファイルをpipコマンドで空ディスクにコピーする時間を計ってみたところ 5.2秒から4.9秒に改善されました(あまり変わらないですねw)


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

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

3チップ構成68Kマイコンの構想(その11)回路図整理とパターン設計 [68K]

 前回の記事で書いたようにCP/M-68K用のXMODEMを作り、ネットで公開されているCP/M-68Kのアプリで容易に遊べるようになったので回路図の整理とプリント基板のパターンを設計してみました。

 今回の回路はCP/M-80が動く3チップ構成のPic24CPMと回路構成は共通点が多いです。
 今回は最初からPCB製造をメーカーに出すことを前提にしたのでCNCでの作成のための条件であった「Via処理後はViaが基板面から出っ張るのでTQFPの半田付け作業の邪魔にならないようにTQFPの直下にはViaを打たない」という縛りを無くしました。
 この結果、Pic24CPMの回路と比較し、MC68008(48ピン)はZ80(40ピン)よりピン数が多いですが、CP/M-80の時よりボードサイズを数ミリ小さくできました(基板サイズは96 x 66[mm])。

 回路図は下図のとおりで使用しているICは
  • MC68008P10
    10MHz版のバスが8bit幅の68Kチップ。PICからクロックを供給する関係で8MHzで動作。
  • K6T4008C1B-DB70
    512KBのSRAM。アクセスタイムは70ns。
  • PIC24FJ64GA004
    16bitPICマイコン。セルフコンパイラの独自言語picleを使って制御。

の3チップです。

3チップ構成の68Kマイコンボードの回路図
★2018/10/31 追記
 R3は+5Vにプルアップするつもりでしたが3.3Vへのプルアップでも動作することを確認しました^^;


 次にパターン図ですが、上述したように今回はCNCでの基板作成は考慮せず、CNCのための条件もないので自由にパターンを作成しました。
 TQFP直下にviaを打ってもいいのでTQFP周辺の反対面(bottom面)のパターンも結構込み入っています。
 細い斜めの線はこの時点ではパターン化していないグランドの結線です。グランドをベタパターン化する際に接続される予定です。

パターン図(GNDベタ化前)


 下図がグランドベタ化後のトップ面のパターンです。
 パターンが込み合っているため、グランドをベタパターンにしても孤立した部分(茶色の部分)が多く発生し、グランドに接続できていなかった端子が何個か生じました。このため数個のviaを追加してトップ面とボトム面を接続することでグランドへのパスが出来るようにしています。

トップ面


 下図はボトム面のパターンです。

ボトム面


 おまけでDesignSparkPCBで3D表示した画面を貼っておきます。(上記のトップ面とボトム面接続用のvia追加前のものです)
 512KBのSRAM等、3Dデータがないものは直方体になっています。
 3チップ構成と言いながら4チップあるように見えますが、右端のICのようなものはSDカードホルダです。w

トップ面

ボトム面


 こんな小さなワンボード基板でCP/M-68Kが動くんですよ^^

★2019/11/25 追記
 完成したプリント基板を「3チップ構成68Kマイコンの構想(その13)プリント基板完成」の記事に掲載しました。


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

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