歩き遍路 平成19年春(J1) 記録の準備
UTMI/ULPIでUSB( 2) パソコンパラレルポート
   とのインタフェースハードウエア

 5月に記録した「SPIでUSB( 9) パソコンのパラレルポートから  PIC18F4520のパラレルスレーブポート経由でMAX3421を制御する」のパソコンのパラレルポートと接続するハードウエアとVisualC#のプログラムを作ったので記録します。

●追加したインタフェースハードウエア

 USB3300とCycloneVのハードウエアにパソコンパラレルポートとのインタフェースハードウエアを追加しました。写真の右下がそのハードウエアでCycloneVを実装した基板にインタフェースしています。その下にインタフェースハードウエア部を拡大写真と回路図を示します。
 パソコンのパラレルポートは5VのTTLレベル、CycloneVは3VLVTTLレベルなのでインタフェースハードウエアではバッファ機能とレベル変換をしています。使用ICは、8ビット双方向バッファに74LVCZ245、デコーダに74AC138です。5V⇔3Vのレベル変換に入手性が悪いのではと思いながら74LVCZ245と74AC138を選択したのですが共立電子のエレショップで販売していたので無事入手できました。価格は189円と73円です。







●パソコンのパラレルポートのインタフェースを調べる

 パソコンのパラレルポートと接続してCycloneVを動作させると不安定な動きをするのでパラレルポートの制御信号発生部分を調べました。

●次のパソコンのパラレルインタフェースの制御信号とビット番号を調べるプログラムをVisual C#で作成
//ポートB出力関数
public void out_b(byte outdata)//出力データを受け取る
{
yprio.outportb(yprio.port + 2, 1);//時点@
yprio.outportb(yprio.port + 2, 2);//時点A
yprio.outportb(yprio.port + 2, 4);//時点B
yprio.outportb(yprio.port + 2, 8);//時点C
yprio.outportb(yprio.port + 2, 0);//時点D
yprio.outportb(yprio.port + 2, 1);//時点E
yprio.outportb(yprio.port + 2, 2);//時点F
yprio.outportb(yprio.port + 2, 4);//時点G
yprio.outportb(yprio.port + 2, 8);//時点H
yprio.outportb(yprio.port + 2, 1);//時点I
yprio.outportb(yprio.port + 2, 0);//時点J
}

●プログラムによる制御信号の出力をロジックスコープで観測しました。 @〜Jは、プログラムのコメントと対応




●以上から、パソコンのパラレルインタフェースの制御レジスタ構成は、次の構成と考えられます。




●不安定な動きの原因

 FPGAのCycloneVはVerilogHDL で記述したステートマシンを60MHzで動作しているので、短いノイズやスパイクが有ったら信号と勘違いしてしまいます。あやしいところが無いかハードとソフトの両面から調べました。

●ポート出力の関数があやしいのではと思えてきましたので波形を観測します
 本に記載のプログラムコード(Visual C#)を実行した時のAFeedとStrobe信号です。同じ様な波形をしています。これをデコードするとパソコンのハードウエアやケーブやデコーダのハードウエアのバラつきでデコーディングスパイクが発生してしまいます。


//ポートC出力関数
public void out_c(byte outdata)
{
yprio.outportb(yprio.port+2,7);
yprio.outportb(yprio.port,outdata);
yprio.outportb(yprio.port+2,0);
}



●対策と対策後の波形を観測します
 デコーディングスパイクが発生しないように、確実にストローブするようにプログラムコードを変更します。
 手順は、@アドレスを出力 Aデータを出力 BストローブをON CストローブをOFF DアドレスをOFFです。
 波形を観測するとストローブ信号がアドレスの中間に入っています。


//ポートC出力関数
public void out_c(byte outdata)
    {
yprio.outportb(yprio.port + 2, 6);
yprio.outportb(yprio.port, outdata);
yprio.outportb(yprio.port + 2, 7);
yprio.outportb(yprio.port + 2, 6);
yprio.outportb(yprio.port + 2, 0);
}



 


ホームへ戻る