XMP CPLD内部の説明

Section 1. CPLDの内部構造
Section 2. CPLDの内部レジスタ
Section 3. デバイス識別用内部コード
Section 4. XMPコマンド
Section 5. パラレルポートの動作
Section 6. デバイスとのインターフェース

Section 1. CPLDの内部構造

 本機では2つのCPLDを使いますが、その内部構造は次の図のようになっています。 CPLD内部構造

 XMP1ではタイミングの発生やホストPCなどとのインターフェースを、XMP2ではアドレス・データの発生と個々のデバイスへの対応を行っています。

Section 2. CPLDの内部レジスタ

 XMP1,2の内部には多くのレジスタが存在します。ここではそれらについて紹介します。 内部レジスタ

タイマーのセット方法は下の図のようになっています。 タイマーレジスタ

この図の18ビットの値が実際にタイマーにプリセットされる値です。タイマーは4MHzのクロックでカウントダウンされ、0になると動作を終了します。そのため、最長で40msくらいの時間を計ることができます。

Section 3. デバイス識別用内部コード

 本機で使用しているデバイス識別用の内部コードは下の表のようになっています。これらのコードはXMP内部のレジスタに記憶され、そのデバイスが扱えるようにCPLD内部のさまざまな個所が調節されます。
コード(16進表記)対応するデバイス コード(16進表記)対応するデバイス
00未選択 1028PIN EPROM (2764/27128)
01シリアルEEPROM(SPI) 1128PIN EPROM (27256)
02シリアルEEPROM(MicroWire) 1228PIN SRAM,EEPROM
03シリアルEEPROM(I2C) 1328PIN EPROM (27512)
04PIC16系 1432PIN EPROM (27010/020/1001/2001)
05GAL16V8 1532PIN EPROM (27040/4001)
06GAL20V8 1632PIN SRAM,EEPROM
07GAL22V10 1732PIN EPROM (27080/8001)
   1840PIN EPROM (271024/2048)
   1940PIN EPROM (274096)
08〜0F予約 1A40PIN SRAM,EEPROM
1C〜1F予約 1B40PIN EPROM (278192)

Section 4. XMPのコマンド

 ホストPCからプリンターポートを経由してXMP1に送られるコマンドは下の表のようになっています。
コード(16進表記)コマンド名引数の有無動作
00NOP×なにもしない
01INC×アドレスカウンタをインクリメントする
02予約×
03予約×
04DLREAD×デバイスからデータ下位を読んで、シリアルパラレル変換回路にセットする
05DHREAD×デバイスからデータ上位を読んで、シリアルパラレル変換回路にセットする
06REVREAD×XMP1のリビジョンを読んで、シリアルパラレル変換回路にセットする
07予約×
08DLSENDデータ下位をレジスタにセットして、EPROM系デバイスに書きこむ
09DHSENDデータ上位をレジスタにセットして、EPROM系デバイスに書きこむ
0AALSETアドレス下位レジスタに書きこむ
0BAHSETアドレス上位レジスタに書きこむ
0CDLSETデータ下位レジスタに書きこむ
0DDHSETデータ上位レジスタに書きこむ
0ECSETコントロールレジスタに書きこむ
0FDEVSETデバイス識別内部コードをセットする
10TIMLOSETタイマー下位レジスタに書きこむ
11TIMHISETタイマー上位レジスタに書きこむ
12OPORTSET汎用ポートレジスタに書きこむ
13VOLTSET電圧設定レジスタに書きこむ
14WAITTIM×内蔵タイマーを動作させる

Section 5. パラレルポートの動作

 パラレルポートからXMP1へデータが送られるときのタイミングは下の図のようになっています。 CPLD内部構造

 まず、パラレルポートにデータを出力し、それを保ちながら#STB端子にパルスを与えます。引数をとらないコマンドの場合は、パルスは1回です。 CPLD内部構造

 逆に、XMP1からパラレルポートへデータを送るときには、8ビットのデータをシリアルに分解して送ります。XMP1にREVREAD、DLREAD、DHREADなどのコマンドを与えると、シリアルでデータを転送するモードに入ります。なお、このときのタイミングも#STB端子を使います。

Section 6. デバイスとのインターフェース

 デバイスに書き込むコマンド(DHSEND、DLSEND)をXMP1に与えると、下の図に示したような動作を行います。 CPLD内部構造

 XMP1中にあるメインのステートマシンは、XMP2に出力バッファを開いて、アドレス・データ・レジスタの値をデバイスに対して書き込むよう指令をだします。そして、XMP2内はその指令を受けて#PGMや#OEなどの制御線にパルスを送り、デバイスに対して書き込み動作を行います。XMP1がXMP2に指令を出す時間はタイマーで設定されているので、デバイスに対して与えられる書き込みパルス幅はタイマーで設定された時間と等しくなります。
 デバイスからデータを読み出すコマンド(DHREAD、DLREAD)をXMP1に与えると、下の図に示したような動作を行います。 CPLD内部構造

 XMP1中にあるメインのステートマシンは、XMP2のバッファを開いて、アドレス・レジスタの値をデバイスに対して与え、デバイスの出力したデータの値をXMP1に流します。そして、XMP2内はその指令を受けて#PGMや#OEなどの制御線にパルスを送り、デバイスに対して書き込み動作を行います。XMP1がXMP2に指令を出す時間はタイマーで設定されているので、デバイスに対して与えられる書き込みパルス幅はタイマーで設定された時間と等しくなります。この期間の最後の瞬間にXMP1のシリアルパラレル変換回路がデータをラッチします。

Section 7. 動作の実際例

 ここでは、本機がワードサイズのROMにデータを書き込む手順を例として紹介します。
1:TIMLOSET xx		//タイマーレジスタをセット
2:TIMHISET xx		//タイマーレジスタをセット
3:VOLTSET xx		//電圧設定レジスタをセット
4:DEVMOD 18		//デバイスを271024にセット(デバイスに電圧印加)
5:ALSET 0		//
6:AHSET 0		//
7:CSET  0		//アドレスを00000番地にセット
8:do{
9:DLSET 下位バイト	//下位バイトをデバイスに印加
10:DHSET 上位バイト	//上位バイトをデバイスに印加してライトパルス
11:タイマー待ちループ
12:INC			//XMP2内のアドレスカウンタをインクリメント
13:}while(最終アドレスに書き込んだか?)
14:DEVMOD 0		//デバイスに印加していた電圧を落とす
15:終了


       平成11年11月26日 なひたふ記す
先頭へもどる
このWebページ上で紹介したすべての回路、情報、内容に関する著作権は「なひたふ」が所有します。無断転載を固く禁じます。
(C)Copyright 1999-2000 Nahitafu