SSブログ
English Version

レトロマイコン86ボードの構想(その2) [8086]

 86ボード制作ですが、PIC24FJのPMP(パラレルマスタポート)機能について実験してみました。

 今回はシリアル通信をアサインするピンを変更するのでブートローダー側のシリアルも変更が必要でPic24FJ用ブートローダーのOneBitLoaderを入れるところからです。
 久々にOneBitLoaderの最初の立ち上げ画面を見ました。
 次にローダーを使ってpicleコンパイラを書込み、その後はpicleのセルフコンパイル環境でソースを変更し、コンパイルの繰り返し作業なのでローダーすらほとんど使いません。

OneBirLoaderの最初の立ち上げ画面


 V20(8088相当品)を使用することを想定しているので8bitのデータバスに下位アドレスがマルチプレクスする半多重化アドレッシングモードを使用します。
 データ線とアドレス線がマルチプレクスされることでPIC24側のI/Oに少し余裕ができます。
 PMP機能では下図のようにタイミングをパラメータにより色々設定可能なので数通りのパラメータパターンについてロジアナで確認してみました。

PMP半多重化アドレッシングタイミング


 タイミングの調整要素としては上図に書かれているように WAITB,WAITM,WAITE(それぞれBegin、Middle、Endの略だと思う)があり、全てゼロの場合の最速タイミングが下図です。PIC24のクロックは内蔵クロックを使用して32MHzにしています。
 モニタした信号はメモリアクセスのための下記の信号です。
  • MCS/ チップセレクト
  • OE/ リードストローブ
  • WR/ ライトストローブ
  • LATCH 下位アドレスラッチ用のHC573へのG信号
  • AD0 データ線のLSBビットの信号

PMPライトタイミング(wait無し)


 今回もアクセスタイムが70nsのメモリを使用する予定なので WR/ はもっと広げないと駄目ですね。LATCHもマージンを大きくし、ノイズの発生も少なくするためにもっと広げたいと思います。
 下の図が3通りのパラメータで設定した場合のロジアナ波形です。WR/幅が140nsでlatch幅が80nsでlatch後20ns程度アドレスを保持しているWAITB:1,WAITM:2,WAITE:1 を採用することにします。
 その時、PIC の PMCON と PMMODE のレジスタの設定値はそれぞれ 0x0ba0、0x0a49 になります。
★2019/07/15 修正
 採用パターンのWAITEを0から1に修正(latch後のアドレス保持時間の確保のため))

PMPライトタイミング(WAITB:1, WAITM:1, WAITE:1)


PMPライトタイミング(WAITB:1, WAITM:2, WAITE:1)


PMPライトタイミング(WAITB:1, WAITM:2, WAITE:0)


 参考として WAITB:1,WAITM:2,WAITE:1 時のメモリリードタイミングが下図です。

PMPリードタイミング(WAITB:1, WAITM:2, WAITE:1)


 今回の確認に使用したpicleソースと実行結果を貼っておきます。

PMP機能確認用picleソース
:l 1:# V20 memory test 2019/07/13 2:# by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7:var Pcon; 8: 9:proc initP() { 10: PMCON=$0600; #PMMODE[1],PMADDR[2] 11: PMMODE=$0602; 12: PMADDR=$0604; 13: PMDAT=$0608; 14: PMAEN=$060c; 15: PMSTAT=$060e; 16: 17: Pcon=$0ba0; # 0000 1011 1010 0000 18: PMCON[0]=Pcon; 19: PMMODE[0]=$0a49; #0000 1010 0100 1001 20: PMAEN[0]=$4701; # PMAEN 0100 0111 0000 0001 21:} 22: 23: 24:proc PmOn() { 25: BusReq(); 26: while ((LATC[-1]&$100)=0) {} # wait HOLDAC 27: PMCON[0] = Pcon|$8000; 28:} 29: 30: 31:proc PmOff() { 32: PMCON[0] = Pcon; # PMP off 33:} 34: 35: 36:proc MemDsp( adr ) { 37: var i,j; 38: PmpSetAdr( adr ); 39: i = MemRd(); 40:# for ( i= 0; i < 16; i=i+1 ) { 41: for ( i= 0; i < 1; i=i+1 ) { 42: PrnStr_( "\n" ); 43: PrnHex_( adr ); 44: PrnStr_( " :" ); 45: for ( j=0; j< 8; j=j+1 ) { 46: PrnStr_( " " ); 47: PrnHexB_( MemRd() ); 48: } 49: adr = adr + 16; 50: } 51:} 52: 53:proc main() { 54: var adr; 55: init(); 56:# initPmp(); 57: initP(); 58:# initSpi(); 59:# initSd(); 60: 61: LATA[0]=LATA[0]|1; # on reset:a0 62: 63:# PmpOn(); 64: PmOn(); 65: PmpSetAdr(0); 66: MemWr($01); 67: MemWr($02); 68: MemWr($04); 69: MemWr($08); 70: MemWr($10); 71: MemWr($20); 72: MemWr($40); 73: MemWr($80); 74: 75: MemDsp(0); 76: 77:# BusRelease(); 78: LATA[0]=LATA[0]&$fffe; # off reset:a0 79:} :run 0000 : 01 02 04 08 10 20 40 80 :



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

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