HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2022/06/25

FPGA Spartan-6 XC6SLX16でファミコンを動かす! FPGA Spartan-6 XC6SLX16でファミコンを動かす!

(Xilinx FPGA Spartan-6 XC6SLX16 NES clone in ALINX AX309)

Tags: [FPGA], [電子工作], [Xilinx XC6SLX9], [FPGA 2022]




● FPGA Spartan-6 XC6SLX16でファミコンを動かす!

 Xilinx FPGA Spartan-6 XC6SLX16 NES clone in ALINX AX309

fpga_nes
 オリジナルの Digilent Nexys 3版の fpga_nes

 元が Digilent Nexys 3の基板を使っていますが、使っている FPGAは私の購入した AX309 cloneと同じ XC6SLX16を使用しています。

[AX309] XILINX Spartan-6 XC6SLX9 FPGA Development Board LX9 - Spartan6 - ALINX Electronics Technology (Shanghai) Co., Ltd.

alinxalinx / AX309

Digilent Nexys 3 Spartan-6 FPGA board


● Digilent Nexys 3基板と ALINX AX309基板との違いに対応する

 Digilent Nexys 3基板と ALINX AX309基板との違いは下記の 3箇所です。
 a) 入力クロックの周波数(Nexys 3基板は 100MHz、AX309基板は 50MHz)
 b) I/O部分のピン配置(基板配線が異なるから)
 c) ボタン入力の論理(Nexys 3基板は正論理、AX309基板は負論理)

・ a) 入力クロックの周波数
 入力クロックの周波数の違いは Nexys 3は 100MHz、AX309 cloneは 50MHzなので
 a) 内部の回路実装のクロック分周を半分にする
 b) FPGAの DCMの機能を使って 50MHzを 100MHzにする
 のそれぞれの修正で対応できましたが、(a)のクロック分周の箇所は複数有るので (b)の方法が手軽で簡単です。

Digital Clock Manager (DCM) Module
 DCM = 簡単に言うと好きな周波数を指定して出力できるモジュール。
 Spartan-6でも使えます。

・ b) I/O部分のピン配置(基板配線が異なるから)
 I/O部分のピン配置の違いは .ucfファイルのピン定義の書き換えで対応しました。
 UCF = User Constraints Fileの略で、FPGAの回路を FPGAのどのピンに割り当てるか?クロックのタイミング等を記述するファイル。

Constraints Guide
 UG625 (v. 13.4) January 18, 2012

 ちなみに新しい開発ツール Vivaoの場合は XDCと言い、ISEの UCFとは記述方法が異なる。
ISE to Vivado Design Suite Migration Guide

ISE から Vivado Design Suite への移行ガイド
 重要: デザインにタイミング制約または物理制約を適用するには、 UCFをザイリンクス デザイン制約 (XDC) フォーマットに変換する必要があります。
 XDC = Xilinx Design Constraintsの略、Vivado Design Suiteで使う。従来の ISEの UCFに相当する。

・ c) ボタン入力の論理(Nexys 3基板は正論理、AX309基板は負論理)
 topレベルのデザインに論理反転の記述を追加しました。

・Digilent Nexys 3基板と ALINX AX309基板との違いに対応する
Digilent Nexys 3基板と ALINX AX309基板との違いに対応する
 fpga_nesの AX309版のブロック図。
 topレベルのデザインに 100MHz生成の DCMとボタン入力の論理反転を追加しました。

Digilent Nexys 3基板と ALINX AX309基板との違いに対応する
 FPGAの DCMの機能を使って 50MHzを 100MHzにする

Digilent Nexys 3基板と ALINX AX309基板との違いに対応する
 潰れて見えませんが fpga_nesの内部の構成。


● Nexys 3 Spartan-6 FPGA board用の実装を ALINX AX309 cloneで動く様に改変したもの

 Development Environment
 ・ISE 14.7 WebPack (free)
 ・Visual Studio 2017 Community (free)
 ・ALINX AX309 clone Xilinx FPGA Spartan-6 XC6SLX16

FREEWING-JP/fpga_nes
 Nexys 3 Spartan-6 FPGA board用の実装を ALINX AX309 cloneで動く様に改変した fpga_nes

 オリジナルの https://github.com/brianbennett/fpga_nes に
brianbennett#34
denghongcai@021a890のパッチ を適用しています。

・オリジナルの https://github.com/brianbennett/fpga_nes
 ・Windowsパソコンと FPGAとの UART通信が 38400bps
 ・本物のファミコンのコントローラを FPGAの I/Oに接続する
 ・RGB出力が 256色(RGB332)
[Windows PC] nesdbg.exe -- (38400bps) -- [Nexys 3 Spartan-6 FPGA board] -- VGA display (RGB332,640x480,31KHz)
                                                      +-- [actual NES Controller(4021 shift register)]

・ denghongcai改造版 https://github.com/denghongcai/fpga_nes
 ・Windowsパソコンと FPGAとの UART通信が高速化 256000bps
 ・Windowsパソコンに USBジョイパッドを接続して FPGAに通信で転送
 ・RGB出力が 4096色(RGB444)
[Windows PC] nesdbg.exe -- (256000bps) -- [Nexys 3 Spartan-6 FPGA board] -- VGA display (RGB444,640x480,31KHz)
       +-- USB joypad

・ FREE WING改造版 https://github.com/FREEWING-JP/fpga_nes
 単純に denghongcai改造版を AX309で動く様にした
 制限事項:音が非常にノイジー
[Windows PC] nesdbg.exe -- (256000bps) -- [ALINX AX309 clone Spartan-6 FPGA board] -- VGA display (RGB444,640x480,31KHz)
       +-- USB joypad


● fpga_nesの FPGAに USB HIDの GAMEPADを接続してコントローラとする事に成功

 USB GAMEPADを FPGAに接続します。

[Windows PC] nesdbg.exe -- (256000bps) -- [ALINX AX309 clone Spartan-6 FPGA board] -- VGA display (RGB444,640x480,31KHz)
                                                          +-- USB joypad

 GitHubにプロジェクトをアップロードしています。

https://github.com/FREEWING-JP/fpga_nes/tree/feature/support_usb_gamepad

 下記の「なんちゃって FPGA USB HOST」を fpga_nesに組み込んで、FPGAに直接 USBデバイスを接続してゲームコントローラとする事に成功しました!!


2022/07/23
USB HOST機能を FPGAに実装する方法、FPGAの GPIOに USB HIDデバイスを接続したい!!
USB HOST機能を FPGAに実装する方法、FPGAの GPIOに USB HIDデバイスを接続したい!!

  FPGAに USB HOST機能を実装して Low Speedの USB HIDデバイスを接続するのら


● FPGA NESにファミカセのゲーム イメージ .nesファイルを転送する方法

 ファミカセのイメージ(.NESファイル)は USBのシリアル COM portでパソコンから転送します。(Visual Studioで作成した C++のアプリ nesdbg.exeを使用する)

 1) nesdbg.exeを COM port番号を指定して起動する。
 2) Fileメニューの Load ROM...を選択して .nesファイルを転送する。

rem 123 as COM port COM123
nesdbg.exe 123

rem Select File and Load ROM...

・FPGA NESにファミカセのゲーム イメージ .nesファイルを転送する方法
FPGA NESにファミカセのゲーム イメージ .nesファイルを転送する方法




● fpga_nesは Mapper 0だけの対応です。("Only mapper 0 is supported.")

 Mapper 0 = プログラム領域 16/32KB、キャラクタ定義 8KB

 と言う訳でファミコンと言えば当時爆発的大ヒットのスーパー マリオ ブラザーズ。

 スーパー マリオ ブラザーズが動くと言う事は Mapper 0を使ってる…ってコト!?
 スーパー マリオ ブラザーズのプログラムサイズって 32KBで済んでいるの?凄い!

・AX309 clone XC6SLX16とファミカセ
AX309 clone XC6SLX16とファミカセ


・Spartan-6 XC6SLX16で fpga_nesでスーパー マリオ ブラザーズを動かした所
Spartan-6 XC6SLX16で fpga_nesでスーパー マリオ ブラザーズを動かした所



 任天堂の公式のスーパーマリオブラザーズのマニュアル PDF
https://www.nintendo.co.jp/clv/manuals/ja/pdf/CLV-P-HAAAJ.pdf

● HVC-SM SUPER MARIO BROS. NES Cassette teardown PCB

 これが日本中(世界も)を熱狂させたゲームの正体!

 プログラムとキャラクタの合計で 40KB!!!
 40KBと言うサイズは 1GBの 26214分の 1の容量です!!
 1MBの場合は 26分の 1の容量です!!

・スーパー マリオ ブラザーズのファミカセの中身の基板
スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板
 HVC-SM-0 PRG LH235711 8606 D プログラムの 32KB ROM
 HVC-SM-0 CHR LH236720 8606 D キャラクタの 8KB ROM

 LHと言えば SHARPの型番ですね!

 後期ロットは ROMがボンディング(黒丸)になっているらしい。

スーパー マリオ ブラザーズのファミカセの中身の基板



・スーパー マリオ ブラザーズのファミカセの中身の基板
スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板


スーパー マリオ ブラザーズのファミカセの中身の基板




●ファミカセの爪を折らないで分解する方法

 カートリッジの差し込み部分の左側の所を手で少し広げて隙間を作る。
 マイナスドライバーを差し込み、カセットの表面側にドライバーを起こす。
 カセット下部の脇の爪が外れる。
 同様に反対の右側の爪を外す。

 カセット上部の左側の空気穴にマイナスドライバーを差し込む。
 カセットの表面側にドライバーを起こす。
 カセット上部の右側の空気穴にマイナスドライバーを差し込む。
 カセットの表面側にドライバーを起こす。

 以上。

 なお、マイナスドライバー(金属)だとカセットのプラスチック側に微妙に凹みが出来ると思って、クレジットカードで試しましたが、強度的にクレジットカードの方が負けました。


●その他

重大度レベル  コード  説明  プロジェクト  ファイル  行  抑制状態
エラー  LNK2019  未解決の外部シンボル __imp__joyGetPosEx@8 が関数 "public: void __thiscall ThreadX::ThreadEntryPoint(void)" (?ThreadEntryPoint@ThreadX@@QAEXXZ) で参照されました。  nesdbg  nesdbg.obj  1

#pragma comment(lib, "winmm.lib")
add Winmm.lib to lib



Tags: [FPGA], [電子工作], [Xilinx XC6SLX9], [FPGA 2022]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

AMD Xilinxの FPGA Spartan-6 XC6SLX16のボードを買ってアーケード ゲームを動かす
AMD Xilinxの FPGA Spartan-6 XC6SLX16のボードを買ってアーケード ゲームを動かす

  ALINX AX309 XC6SLX9の中華クローンの XC6SLX16版を購入しました

AMD Xilinxの FPGAの開発アプリ ISE WebPackをダウンロードして Windows 10で動かす方法
AMD Xilinxの FPGAの開発アプリ ISE WebPackをダウンロードして Windows 10で動かす方法

  Spartan-6の FPGAの開発用に Xilinx ISE WebPack開発ソフトウェアを Windows 10で動かす方法

Xilinxの FPGA Spartan-6の Block RAM RAMB8BWERに初期値を入れて ROMとして使う方法
Xilinxの FPGA Spartan-6の Block RAM RAMB8BWERに初期値を入れて ROMとして使う方法

  Xilinxの FPGA Spartan-6の Block RAM RAMB8BWERに初期値を入れて ROMとして使う方法

Xilinxの FPGA Spartan-6で PicoBlaze KCPSM 8 ビット マイクロコントローラーを動かす!
Xilinxの FPGA Spartan-6で PicoBlaze KCPSM 8 ビット マイクロコントローラーを動かす!

  PicoBlaze KCPSM6 in Spartan-6 with ISE WebPack

Xilinxの FPGA Spartan-6で MicroBlazeを ISE WebPack 14.7で無料ライセンスで動かす方法
Xilinxの FPGA Spartan-6で MicroBlazeを ISE WebPack 14.7で無料ライセンスで動かす方法

  How to MicroBlaze in Spartan-6 with ISE WebPack 14.7 only Free License to Blink LED !

USB HOST機能を FPGAに実装する方法、FPGAの GPIOに USB HIDデバイスを接続したい!!
USB HOST機能を FPGAに実装する方法、FPGAの GPIOに USB HIDデバイスを接続したい!!

  FPGAに USB HOST機能を実装して Low Speedの USB HIDデバイスを接続するのら

USBの通信プロトコルを勉強する
USBの通信プロトコルを勉強する

  今まで漠然としていた USBデバイスの通信方法を理解します

USB HOST機能が欲しいのでワンチップマイコンの GPIOで USB HOST機能を実現する
USB HOST機能が欲しいのでワンチップマイコンの GPIOで USB HOST機能を実現する

  FPGAに USBデバイスを接続したいのですが、USB HOSTの通信を実装できないので困っています

OLIMEX LPC-H40(Philips LPC2106)
OLIMEX LPC-H40(Philips LPC2106)

  MOTHER BOARD for LPC-H40(LPC-H2106) and ASM Sample Program.

線形帰還シフトレジスタ LFSRのまとめ、FPGAの Verilog HDLでの実装例
線形帰還シフトレジスタ LFSRのまとめ、FPGAの Verilog HDLでの実装例

  LFSR Linear Feedback Shift Registerについて調べた

【2022年版】最近流行の RISC-Vプロセッサの環境を WSL Ubuntu上に構築する方法
【2022年版】最近流行の RISC-Vプロセッサの環境を WSL Ubuntu上に構築する方法

  RISC-Vプロセッサの Rocket Chipの開発環境を Windows上に構築して Verilogする方法

XILINX FPGAのBlock RAMをROMとして使う方法
XILINX FPGAのBlock RAMをROMとして使う方法

  FPGAに内蔵のBLOCK-RAMにROMとして初期値を与える方法

スパルタン2で
スパルタン2で"ギャラクシアン基板"を作る!

  Verilog言語で記述してあります

スパルタン2で
スパルタン2で"MIDWAY 8080(TAITO インベーダ基板)"を動かす!

  ハードウェアで本物を作ります

スパルタン2で
スパルタン2で"パックマン"を動かす!

  FPGAでパックマンが動きます

スパルタン2で
スパルタン2で"ド*キーコ*グ"を動かす!

  これもFPGAで動いちゃいます

スパルタン3でアーケードゲームを動かす!
スパルタン3でアーケードゲームを動かす!

  XAPP694の使用例、INVADER/GALAXIAN/PACMAN/D*NKEY-K*NG/TIME PILOT




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2022 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/fpga/xilinx_spartan_6_nes_ax309/