Logic Analyzer(?) をある程度動くところまで作ったので まとめます。もともと PCE 互換機の開発メモ に書いていたんですが、あっちのページが直接関係ないものでごちゃごちゃしてきたので こっちに移動しました。
DRAM (72-pin SIMM) と USB (USBN9604+PIC16F873) と CPLD (XC95108PC84 x 2) を使って ロジックアナライザみたいなものを作ろうとしています。バイナリ値を取り込むだけで、あまりぜいたくな "analyze" 機能を付けるつもりはないので "(?)" 付きです。時間節約のため、メモ風に書いていきます。

とりあえず 後閑氏のページに公開されているプログラム(usbdvc1)を以下のように変更して使用しています。
; usbsym.h の最初の2行をコメントアウト ;#DEFINE USBINT PORTB,0 ;RB0 ;#DEFINE USBCS PORTB,1 ;RB1
; USBN9604 ←→ PIC16F873 接続 #DEFINE USBINT PORTB,0 ;RB0 #DEFINE USBA0 PORTA,0 ;A0 #DEFINE USBCS PORTA,1 ;/CS #DEFINE USBRD PORTA,2 ;/RD #DEFINE USBWR PORTA,3 ;/WR #DEFINE USBDATA PORTC ;DATA
; マクロ追加 (usbmac.h) USBDATA_IN MACRO BANK1 movlw 0ffh movwf TRISC BANK0 ENDM USBDATA_OUT MACRO BANK1 movlw 0 movwf TRISC BANK0 ENDM
init_PIC BANK1 movlf 0x6,ADCON1 ;RA0-5, RE0-2 = Digital movlf 0x00,TRISA ;RA0-5 = OUT movlf 0x01,TRISB ;RB0=INT movlf 0xff,TRISC ;RC0-7 = IN BANK0 BSF USBCS ;USBN9602 CS = 1 USBN9602 OFF BCF USBA0 ; A0 = L BSF USBRD ; /RD = H BSF USBWR ; /WR = H CLRF USTATUS ;USB用変数の初期化 CLRF STALLD ;USB用変数の初期化 CLRF DATAPID ;USB用変数の初期化 RETURN
; ディスクリプタ送信 (SENDDESC) 部分 NXT630 USBDATA_OUT MOVLW TXD0 IORLW 0xC0 BSF USBA0 MOVWF USBDATA BCF USBCS BCF USBWR BSF USBWR BCF USBA0 LP67 MOVF DESC_INDEX,W CALL DESC MOVWF USBDATA BCF USBWR BSF USBWR INCF DESC_INDEX,F DECFSZ G_CNT,F GOTO LP67 BSF USBCS USBDATA_IN
; PIC16F873 ← USBN9604 読み出し RD_USB ; write address MOVWF UADR USBDATA_OUT MOVFF UADR, USBDATA BSF USBA0 BCF USBCS BCF USBWR BSF USBWR BCF USBA0 ; read data from the address USBDATA_IN BCF USBRD MOVF USBDATA, W BSF USBRD BSF USBCS RETURN
; PIC16F873 ← USBN9604 連続読み出し RD_USB_BURST ; write address USBDATA_OUT BSF USBA0 MOVFF UADR, USBDATA BCF USBCS BCF USBWR BSF USBWR BCF USBA0 ; read data from the address USBDATA_IN LP20 BCF USBRD MOVFF USBDATA, INDF BSF USBRD INCF FSR,F DECFSZ G_CNT,F GOTO LP20 BSF USBCS RETURN
; PIC16F873 → USBN9604 書き込み WR_USB ; write address USBDATA_OUT BSF USBA0 MOVF UADR, W IORLW 0x80 MOVWF USBDATA BCF USBCS BCF USBWR BSF USBWR BCF USBA0 ; write data to the address MOVFF UDAT, USBDATA BCF USBWR BSF USBWR BSF USBCS USBDATA_IN RETURN
; PIC16F873 → USBN9604 連続書き込み WR_USB_BURST ; write address USBDATA_OUT BSF USBA0 MOVF UADR, W IORLW 0xC0 MOVWF USBDATA BCF USBCS BCF USBWR BSF USBWR BCF USBA0 ; write data to the address LP17 MOVFF INDF, USBDATA BCF USBWR BSF USBWR INCF FSR, F DECFSZ G_CNT,F GOTO LP17 BSF USBCS USBDATA_IN RETURN
PIC16F873 ←→ USBN9604 接続 (あとで回路図描きます) ------------------------------------------------------ RC0-RC7 ←→ D0-D7 RA0 → A0 RA1 → /CS RA2 → /RD RA3 → /WR RB0 ← INTR CLKIN ← CLKOUT /MCLR = H /RESET= H VDD = +5V MODE0 = MODE1 = DRQ = AGND = GND VSS = GND V3.3 → 1.5kOhm → D+ その他はNC VCC = +5V ------------------------------------------------------

回路図書いてみました。汚いですが...

CPLD の記述は現在こんな感じです。 シミュレーション上では EDO Page Mode Early Write Cycle と CBR Refresh Cycle はできてそうです。 CPLD --> DMA 転送機能の記述はまだしてません。 この辺を実装したら1つの CPLD に収まらなくなるかもしれません。
/OE の動作を記述してありますが、後で SIMM モジュールの回路を見たら SIMM は /OE が全部 'L' 固定でした。 やられた。
配線しました。


回路図は正常動作が確認できたら更新します。
とりあえず PIC と USBN9604 と CPLD の少なくとも一部は動いているので、 PC と通信させてデバッグすることにします。
なんか Logic Analyzer として実用になるのかどうか怪しくなってきましたが、 今回の成果として USB が使えるようになることと、 DRAM コントローラ(ステートマシン)を書けるようになることが できればまぁ OK とします。
とりあえず動きました。 アドレスの動作がまだおかしいですが。 SIMM → PC 転送を全て PIC にやらせたら、 転送速度が激遅で使い物になりませんでした(16KB の転送に数秒かかる)。 やはり DMA を実装するしかなさそうです。 あぁ、CPLD 1個に入りきるかなー
今回のサブプロジェクトは、なかなか勉強になります。
ついに期待通りの動作をするようになりました。

回路図とかはそのうちまとめて掲載します。
とりあえずこれで完成とします。

PC 側プログラム (USB.c) は、柏野氏 の Universal USB Driver Ver 2.0β を利用させていただきました。
PIC のプログラム(変更部分)です。参考までに。
init_PIC
BANK1
movlf 0x6, ADCON1 ;RA0-5, RE0-2 = Digital
movlf 0x00, TRISA ;RA0-5 = OUT
movlf 0x03, TRISB ;RB0=INT, RB1=/BUSY
movlf 0xff, TRISC ;RC0-7 = IN
BANK0
BSF USBCS ;USBN9602 CS = 1 USBN9602 OFF
BCF USBA0 ; A0 = L
BSF USBRD ; /RD = H
BSF USBWR ; /WR = H
BSF CPLD_ACQUIRE ; /ACQUIRE=H
BSF CPLD_TRANSFER ; /TRANSFER=H
BCF CPLD_RESET ;RESET CPLD
BSF CPLD_RESET ;RESET CPLD
CALL T200us
CALL T200us
CLRF USTATUS ;USB用変数の初期化
CLRF STALLD ;USB用変数の初期化
CLRF DATAPID ;USB用変数の初期化
RETURN
;-------------------------------------------------------------
DO_TX3_TRANSFER
; pipe 4
; write address
USBDATA_OUT
BSF USBA0
MOVLW TXD3
MOVWF USBDATA
BCF USBCS ; activate USBN9604
BCF USBWR
BSF USBWR
BCF USBA0
movlf 64, G_CNT
USBDATA_IN
; write data to the address
TXBLOOP4
BCF CPLD_TRANSFER
BCF USBWR
BSF USBWR
BSF CPLD_TRANSFER
DECFSZ G_CNT, F
GOTO TXBLOOP4
BSF USBCS
RETURN
;-------------------------------------------------------------
DO_TX3 ;PIPE4 EP5
CALL DO_TX3_TRANSFER
RETURN
;-------------------------------------------------------------
DO_RX1 ;PIPE1 EP2
movlf R1_DAT0,FSR ;GET COMMAND
MOVF INDF,W
XORLW 'A' ; A: Acquire
BTFSC STATUS,Z
GOTO RX1_ACQUIRE
MOVF INDF,W
XORLW 'T' ; T: Transfer
BTFSC STATUS,Z
GOTO RX1_TRANSFER
GOTO RX1_END
RX1_ACQUIRE
; reset cpld
BCF CPLD_RESET
BSF CPLD_RESET
CALL T200us
CALL T200us
; acquire
BCF CPLD_ACQUIRE
WAIT_ACQ:
BTFSS CPLD_BUSY
GOTO WAIT_ACQ
BSF CPLD_ACQUIRE
GOTO RX1_END
RX1_TRANSFER
CALL DO_TX3_TRANSFER
CALL TX3_PID_NO_TGL ;SEND
;-------------------------------------------------------------
RX1_END
RETURN
RX_1
MOVLW RXS1 ;RXステータスを調べる
CALL RD_USB
MOVWF RXSTAT
BTFSS RXSTAT, BSETUP_R
GOTO NXT610 ;setupでないならNXT610へ
GOTO EX_RX1 ;リターン
NXT610 BTFSS RXSTAT, BRX_ERR
GOTO NXT611 ;errorでないならNXT611へ
GOTO EX_RX1 ;リターン
NXT611
movlf R1_DAT0, FSR ;FIFO1からR1_DATへ8Bデータ受信
movlf 8, G_CNT
movlf RXD1, UADR
CALL RD_USB_BURST
CALL FLUSHRX1 ;RX1をオフ
;************* EP2の内部実行処理 ***
CALL DO_RX1 ;処理ルーチンへ
EX_RX1
movlf RXC1,UADR ;RX1を使用可
movlf RX_EN,UDAT
CALL WR_USB
RETURN
;-------------------------------------------------------------
TX_3
MOVLW TXS3 ;TXS3のSTATUSを読む
CALL RD_USB
MOVWF TXSTAT
BTFSS TXSTAT,BACK_STAT ;データ送信が無事終了したか
GOTO TX3_FAIL ;問題があればTX3_FAILへ
BTFSS TXSTAT, BTX_DONE
GOTO TX3_FAIL
;***** 送信データ処理
CALL DO_TX3 ;USER PROCESS
BNOT TGL3PID ;DATA種を反転
CALL TX3_PID_NO_TGL ;TX3 送信可
GOTO EX_TX3
TX3_FAIL ;エラー処理(再送)
BSF PORTB,5
CALL DO_TX3_TRANSFER
EX_TX3
RETURN
手持ちの全ての SIMM モジュールで動作させようと、
TRAS = 4T, TRP = 3T に変更してみましたが、
相変わらず変な値が帰ってくる箇所がかなりあります。
なんでだー
動く SIMM モジュールは沖電気の M5117405A-60SJ が 9 個実装されているやつで(1個は多分パリティ用)、 動かない SIMM モジュールは富士通の 8117405B-60 が 8 個、814105C-60 (多分パリティ用)が 4 個実装されています。 パリティは使っていないのでとりあえず置いておいて、型番の下 6 ケタ (117405) が同じなので ほぼ互換性のあるチップだと思うんですが、8117405B-60 の方は今のところ使えないです。
一応現行版を置いておきます。タイミングに余裕を持たせたのと、 あとメモリのアクセス部分を少し単純化しました。
まとめというか、思ったことを書きます。
| Macrocells Used | Pterms Used | Registers Used | Pins Used | Function Block Inputs Used |
|---|---|---|---|---|
| 95/108 (88%) | 304/540 (57%) | 74/108 (69%) | 61/69 (89%) | 197/216 (92%) |
こんなところです。また何か思いついたら追加します。