Logic Analyzer(?) の製作

[Oct.01 2006] まえがき

Logic Analyzer(?) をある程度動くところまで作ったので まとめます。もともと PCE 互換機の開発メモ に書いていたんですが、あっちのページが直接関係ないものでごちゃごちゃしてきたので こっちに移動しました。

目次

PCE 互換機の開発メモ  トップページ


[Jul.23 2006] Logic Analyzer(?) の製作

DRAM (72-pin SIMM) と USB (USBN9604+PIC16F873) と CPLD (XC95108PC84 x 2) を使って ロジックアナライザみたいなものを作ろうとしています。バイナリ値を取り込むだけで、あまりぜいたくな "analyze" 機能を付けるつもりはないので "(?)" 付きです。時間節約のため、メモ風に書いていきます。


↑やっと USB でハードウェアの認識ができた

製作動機

  1. CPU を作るのにステートマシンをなるべくきちんとつくりたい→練習が必要
  2. PCE 互換機のワーク RAM と SCD のバッファ RAM をあわせると結構大容量になる
    → DRAM を使いたい
    → DRAM ってどうやって使うんだっけ?
  3. USB 通信ができれば PC ←→ PCE 互換機の通信がかなり楽になる(RS-232C だとやや能力不足)
  4. ロジックアナライザみたいなものを作っておけば、今後のハードの製作がかなり楽になるはず

所見

とりあえず 後閑氏のページに公開されているプログラム(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
------------------------------------------------------

目次へ戻る  PCE 互換機の開発メモ  トップページ


[Aug.20 2006] Logic Analyzer(?) の回路図 (V0.8)

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


↑回路図 V0.8(クリックで拡大)

所見

CPLD の記述は現在こんな感じです。 シミュレーション上では EDO Page Mode Early Write CycleCBR Refresh Cycle はできてそうです。 CPLD --> DMA 転送機能の記述はまだしてません。 この辺を実装したら1つの CPLD に収まらなくなるかもしれません。

/OE の動作を記述してありますが、後で SIMM モジュールの回路を見たら SIMM は /OE が全部 'L' 固定でした。 やられた。

目次へ戻る  PCE 互換機の開発メモ  トップページ


[Aug.27 2006] Logic Analyzer(?) 配線完了 (V0.9)

配線しました。


↑右側の CPLD は飾り(笑)


↑74VHC244 (SOP20-P-300-1.27)をハンダ面にマウントする技術を会得

所見

回路図は正常動作が確認できたら更新します。

とりあえず PIC と USBN9604 と CPLD の少なくとも一部は動いているので、 PC と通信させてデバッグすることにします。

なんか Logic Analyzer として実用になるのかどうか怪しくなってきましたが、 今回の成果として USB が使えるようになることと、 DRAM コントローラ(ステートマシン)を書けるようになることが できればまぁ OK とします。

目次へ戻る  PCE 互換機の開発メモ  トップページ


[Sep.03 2006]

とりあえず動きました。 アドレスの動作がまだおかしいですが。 SIMM → PC 転送を全て PIC にやらせたら、 転送速度が激遅で使い物になりませんでした(16KB の転送に数秒かかる)。 やはり DMA を実装するしかなさそうです。 あぁ、CPLD 1個に入りきるかなー


[Sep.10 2006]

今回のサブプロジェクトは、なかなか勉強になります。


[Sep.16 2006]

ついに期待通りの動作をするようになりました。

所見


↑またいろいろかき集めてテスト

回路図とかはそのうちまとめて掲載します。

目次へ戻る  PCE 互換機の開発メモ  トップページ


[Sep.17 2006] Logic Analyzer(?) 完成 (V1.0)

とりあえずこれで完成とします。


↑回路図 V1.0(クリックで拡大)

CPLD ソース (HTML) → DramCtrl10.html

CPLD ソース(DramCtrl.v) + pin constraint file (DramCtrl.ucf) → DramCtrl.tar.gz

PC 側プログラム (USB.c) → USB.tar.gz

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

Logic Analyzer (?) −完−

目次へ戻る  PCE 互換機の開発メモ  トップページ


[Sep.23 2006] Logic Analyzer(?) Ver. 1.1

手持ちの全ての SIMM モジュールで動作させようと、 TRAS = 4T, TRP = 3T に変更してみましたが、 相変わらず変な値が帰ってくる箇所がかなりあります。
なんでだー

動く SIMM モジュールは沖電気の M5117405A-60SJ が 9 個実装されているやつで(1個は多分パリティ用)、 動かない SIMM モジュールは富士通の 8117405B-60 が 8 個、814105C-60 (多分パリティ用)が 4 個実装されています。 パリティは使っていないのでとりあえず置いておいて、型番の下 6 ケタ (117405) が同じなので ほぼ互換性のあるチップだと思うんですが、8117405B-60 の方は今のところ使えないです。

一応現行版を置いておきます。タイミングに余裕を持たせたのと、 あとメモリのアクセス部分を少し単純化しました。

CPLD ソース(DramCtrl.v) + pin constraint file (DramCtrl.ucf) Rev. 1.1 → DramCtrl11.tar.gz

目次へ戻る  PCE 互換機の開発メモ  トップページ


[Ock.01 2006] Logic Analyzer(?) まとめ

まとめというか、思ったことを書きます。

こんなところです。また何か思いついたら追加します。

目次へ戻る  PCE 互換機の開発メモ  トップページ


(C) Ki 2006