LoginSignup
1
0

More than 1 year has passed since last update.

Tang-Nano-9Kで動くNESに、ゲームパッドをUSBで繋ぐ

Posted at

目的

 Tang-Nano-9Kで(限定的だが)NESを動かせる事が出来たので、次のステップとして単体動作を夢想する。
 データは内蔵RAMに書き込むか、SDに格納できる筈。
 LCDは見本がそこそこ有るから、後は操作するGamepadの接続かな。
 ちらっと見た限りでは、USB接続のものしか見当たらない。
 配線をばらしてディスクリート接続すると言う手も有るが、
 ◆◆◆ そうだ、Tang-Nano-9KにUSB接続でつなげよう ◆◆◆
 USB1.0なら見本が有るから、何とかなるでしょう。
ukp_全体.jpg

方針

 USBは1.0(1.5Mbps)から始まりUSB4(40Gbps)迄進化してるが、今回は1.0のロースピード。
  ※USB1.1は仕様の明確化のみ、1.0と規格は同一。
 USB1.0には速度の異なる2種類のグレードが規格化されている
  Low-Speed ロースピード 1.5Mbps
  Full-Speed ハイスピード 12Mbps
 12Mbps程度ならFPGAで十分制御可能な筈だが、High-Speed動作では18mAの定電流駆動が必要。
 これは、Tang-Nano-9Kの入出力端子ではドライブできない。
  ※やってみたら、無視できない遅延が発生していた。
 従ってGamepadは、通信がロースピードのみの対応とする。

 FPGAでのUSB接続例はジオシティーズに20年前に公開されていたが閉鎖され今は下記に。
  「FPGAでPC-8001を作る計画
 このプロジェクトのUKP部分を切り出しそのまま使えばよかったのだが...
 新たなconfigデータが必要になる事を考慮し、先行して機能拡張を推進...
 一応拡張できたので取り合えず本家ukpの初期化データで動作させた所、そのまま動作してしまった。
  ※購入したGamepadがHID機器と同一のコマンドで動作するとは。
  ※このGamepad、安かったけどキーストロークが長くアクション操作には不向き。
 やって来た事のかなりの部分が、特に要らない事になってしまった。
 小さくまとめ上げるのであれば、本家ukpを使った方が効率良いと思う。
  ※但し、本家ukpでは外部信号を直接使っている部分が有り、誤動作するかも。

 なお、本家ukpに対し下記を拡張している。
  アドレスを8bitから12bitに拡張。
  12bitアドレスでジャンプ可能なjmp命令追加。
  jmpした番地に戻れるret命令追加。
  送信データのNRZ変換機能を追加。※本家ukpはNRZ変換後のデータを扱う。
 この追加により、新たなコマンドの追加が容易になっている(はず)。

成果物

 「fpganes Tang-Nano-9K バージョン
 「fpganes Tang-Nano-9K ローダー
 「fpganes Tang-Nano-9K モニター

必要な追加機器

 □GamePad ※ロースピード(1.5MHz)で動作するもの。
 □USBコネクタ(メス)

 あると便利
 □ロジックアナライザー
 □USB中継基板

機能概説

 UKPは接続されたデバイスを、HID接続として動作させている。
 以下機能を、UKPハードと、UKPソフトと、UKPI/Fに分けて説明する。

 □UKPハード
  12MHzのクロックで動作し、1/8分周して1.5Mbpsの信号を作成。
   ※PLLが不足しているので、126MHzを1/10.5分周して約12MHzを作成。
    ない物ねだりだが、もそっと何とかならないみのかな。
  ホスト側にはプルダウン抵抗が必要だが、FPGAの内部抵抗で代用。

 □UKPソフト
  ソフトはコマンドの送信と受信から成り立ってる。
  初期化時はsetadr1でUSBチャネルを1に設定後、setconfig1でconfigを送信する。
  コマンド送信後はrcvdtでACKを受信する(が読み飛ばす)。
  初期化後はin10を定期的に発行し、デバイスからのデータを受信する。

  ソフトはukprom.vに、通常のverilogと同形式で書き込む。
  ukp.sをasukpでアセンブルすると、コンパイル可能なukprom.vが出来上がる。
  asukpを動作させるには、perlの動作環境が必要。
   ※今回使用したukp.sとasukpは[fpganes Tang-Nano-9K バージョン]に添付。
   ※当方はmingwin32環境で実行、./asukpと打てば動作する。

 □UKPI/F
  初期化が完了すると、ホストからのリクエストにデバイスが応答を返す。
  下図は応答の一例だが、ukprdyがhiの期間にukpstbが8回動作する。
  そのタイミングでukpdatを読み取る。
  読み取ったデータをukp2nesで、fpganesが必要とする形に変換している。
   ※当方のGamepadでは、押さなくても毎回応答が帰って来てる。
   ※参考資料はGamepadにしか対応していない。
ukp_波形.jpg

ロジアナ

 波形解析とプログラムデバッグには、ロジアナが有効だった。
  ※USB波形解析とか、周期の長い信号の観測に威力を発揮。
  ※USBも含め25種類の解析が出来るらしい。
 20年前はUSB1.0の波形観測も一苦労だったのだろうが、今では簡単に行える。
  ※多少の投資は必要だが、便利な世の中になったものだ。
 最大サンプリング速度は100Mbps。
 計測データはUSB2でパソコンに送るので、HDDが許す限り計測できるだろう。
  ※但し100Mbps計測時は2チャンネルしか使えない、USB2の速度制限だろう。
   更に、別のUSB機器が動作時は速度制限される。
ukp-logic.jpg 
ukp-log_sig.jpg

感想

 UKP機能の切り出しと動作確認中にタイミング処理をミスっていて、keyboardは動作するがGamepadは動作ないと言う珍現象に陥ってしまった。
 この動作により、てっきりconfigから作り直す必要が有ると勘違いして、機能拡張を行った。
 まあこれも、今後別のUSB機器を使う時に役立つ技術だと自己弁護をしておこう。
 なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0