Tang-Nano-4Kの性能を確認する

#目的
　Tang-Nano-4Kを購入した。
　無印のTang-Nanoが出てから約２年、4Kは無印の後継機と言う事だろう。
　値段を言うのは無粋だが、カメラ、USBケーブル付きで1980円也。
　この機能で之は安いと思う。パソコンさえ有れば之だけでFPGA三昧できるぞ。
　Tang-NanoよりもLUTは4608LUTと４倍、ＳＲＡＭは２．５倍に増量、
　MCUとしてCortex-M3も組み込み、とどめに8MBのDRAMまで内蔵。
　更にボード上に4MBのFlashを搭載し、HDMIのポート迄付けるとは。
　◆◆◆　これはフ〇ミコンミニを作れという信託ですか　◆◆◆
　も、もちろんカートリッジを持っている範囲だよ。![Tang_nano_4K.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/1c2b59b4-11b8-7932-bc6d-9aa2e2d42fe0.jpeg)

#経緯
　ウェ～ブをなんとなく見ていたら、Tang-Nano-4Kのライセンスへの記述に目が行った。
　[GOWIN EDA Education版がライセンスファイル不要で使えることの検証](https://elchika.com/article/dfc470d9-e343-4b03-b4b2-9d1a1d873c6b/)
　実はTang-Nanokを使いあぐねる原因として、ちと小さいって事も有るが、ライセンス認証制度も原因。
　通常ライセンスは１年で切れるし、ネット認証は継続性を信用しがたい。
　　※GOWINへのライセンス依頼の返答は無しの礫。
　　※某商社様のご厚意で頂いたTang-Nanoのライセンスは、既に切れていた。
　Education版であれば、ずっと使えるだろう。バグフィックなんかは無いだろうけど。

#開発環境
　Tang-Nano-4K　　　　　　※無ければ話にならないな。
　GOWIN EDA Education版 　※verilogのコンパイルに必要。
　ARMコンパイラ 　　　　　※Cortex-M3のプログラムコンパイルに必要。
　RS232C-USB変換ケーブル　※プログラムのデバッグ出力に使う、別にLEDを並べても構わないだろう。

#GOWIN EDA Education版
　GOWINへの登録(住所とかメールアドレス)が必要だが、登録すれば即座に各種ダウンが可能となる。
　当然Education版では、GW1NSR-LV4CQN48PC6/I5 のみに限定だが、Tang-Nano-4Kの開発には問題無かった。
　V1.9.6.02Beta、Gowin_V1.9.8も使えるが、違いは認識出来なかった。
　　※V1.9.6.02Beta以外では、Flashへの書き込みが失敗する。
　　※V1.9.8.01はネット認証が有効にならない、多分サーバーが未対応なのだろう。

#GMD Education版
　Tang-Nano-4KはCortex-M3を内蔵しているおり、Ｃプログラムのコンパイラが必要。
　Keilが推奨らしいが、ウン十万円は一寸と言う貴方に朗報、無料の開発環境が有りまっせ。
　と言ってもEclipseに自社の表紙を付けただけのようですが。
　　※GOWINのサイトから落とせる。
　　※Education版はC:\\にしか入れられな様子、大した問題では無いが。

#予め注意
　私の環境では、最新の書き込みプログラムからはFlashに書き込みが出来なかった。
　　※RAMへの書き込は正常動作。
　対応策として、ツールは最新と共に旧のソフトも落としておき、
　「Programmer」のディレクトリ一式を旧の物に差し替えた。
　　※但し、旧ではAnalyzer Oscilloscopeが動かないので適宜差し替えが必要。
　　※MCUへの書き込みはFlashに行うようだ、従ってAnalyzerでのデバッグは不可。悲しい。

#サンプルプログラムとドキュメントについて

　◇[TangNano-4K-example](https://github.com/sipeed/TangNano-4K-example)
　　LEDとHDMI及びカメラを使用したサンプル。ちとショボいかな。

　◇Gowin_EMPU(GW1NS-4C)_V1.1.3　(GOWINから落す)
　　MCUとHyperRAMのロジックサンプル、及びMCUのソフトサンプル

　◇[国内FPGA+国内オペレーティングシステム（GW1NSR-LV4C+RT-Thread）でSPILCD駆動](https://picture.iczhiku.com/weixin/message1634040158383.html)
　　[(文中で説明に使用しているソフト)](https://github.com/hi631/tang-nano-4K/tree/master/cm3_test)　
　　ロジックとMCUの接続法補についての解説　※中国語、少し説明不足だな

　◇日本語ドキュメント類
　　Gowin_V1.9.8.01のセットアップで \IDE\doc\JPN に日本語ドキュメントが格納される。
　　　※GOWINの日本に対する本気度が伺われる。多分日本の商社(丸文)が頑張ったのだろう。
　　　　但し、日本語以外のドキュメントの方が詳しい場合も有るので要注意。
　　　※下記は含まれてない、多分GOWINから落とせる。探せば他にも有るかも。
　　　　・Gowin Programmer ユーザーガイド SUG502J.pdf
　　　　・IPUG922-1.1J_Gowin_EMPU_M3ソフトウェアプログラミング リファレンスマニュアル.pdf

#Lチカ
　◇MCUを使わないバージョン
　　[TangNano-4K-example](https://github.com/sipeed/TangNano-4K-example)　を落し「led_test」で試行可能。
　　　※違う開発環境用のピン配置が異なるものも有ったので要注意。
　◇MCUを使うバージョン
　　[cm3_mcu](https://github.com/hi631/tang-nano-4K/tree/master/cm3_mcu)　と　[cm3_led](https://github.com/hi631/tang-nano-4K/tree/master/cm3_led)　を落してコンパイル、
　　書き込み時にMCUプログラム(cm3_led.bin)を同時に書き込む。
　　　※MCUの取扱いは、下方に別途記載。

#カメラ
　[TangNano-4K-example](https://github.com/sipeed/TangNano-4K-example)　を落せば「dk_video」で試行可能。
　HDMIに表示データが現れる。
　テストパターン表示後、白黒画像が表示される。
　　※当方の環境ではパターン表示がガタガタに表示される。何故だろう。
　　※画像が白黒で小さいのは、DRAMの使用が難しかった為なのだろう。<- この推論は誤りDRAMは使っている。
　　　画像が白黒なのはカメラからベイヤー(RAW10,10bit)で出力し、白黒として16bit拡張しているため。
　　　カラー化するにはDSP等でのカラー合成が必要。
　　　カメラからRGB565で出力も可能だが、8bit->16bit処理が必要、正しいカメラ初期化も大変。

#ＤＲＡＭ
　GW1NSR-LV4CはHiparRAM搭載なんて言ってるが、DRAM(DDRAM)を混載しているだけ。
　(それでも凄いとは思うが)
　「Gowin_HyperRAM_Memory_Interface_embedded_refDesign」(GOWINから落とす)
　に試験ソフトが有るが、別の開発基板用のようなのでちょこっと改変。
　[test_hpram](https://github.com/hi631/tang-nano-4K/tree/master/test_hpram)　を動作させてもErrorにはならないので、正しく動いているのだろう(多分)。
　　※ErrorでLEDが点灯するように設定している。
　当方の環境では135MHz(27MHz*5)ではErrorとならないが、162MHz(27MHz*6)ではError発生となった。
　Analyzer Oscilloscopeを設定しているので、興味あるなら動作を確認されたし。
　　※HyperRAMは200MH対応の筈だがそれ以前でコケるのはなぜ、勘違い若しくは個体差か。
![hpram_err.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/cb9a1cf0-f370-0d43-8ab9-11a7e2b750d8.jpeg)
　※Error発生時の波形、１バースト(16バイト)が読み込み出来ていない。

#ＭＣＵ(ハード)
　ロジックにMCUを追加するには、Tools -> IP Core Generator と選択。
　IP Core画面で、Soft IP Core -> Microprocessor System -> Hard-Core-MCU -> Gowin_EMPU[GW1NS-4C) と選択。
　ダブルクリックで Gowin EMPUが開くので、画面上で必要とする回路ボックスをダブルクリックする。
　　※マウスオーバー時に青くなるやつ。
　各ブロックの活性化画面が開くので、 Enable **** を選択して、OK押下。(それだけ)
　　※cm3_mcuでは、UART0とGPIOのみを活性化している。
　元の画面でOKすれば、プロジェクトに取り込まれる。
  　※テンプレートとしてsrc\gowin_empu\gowin_empu_tmp.vが表示されるので、これを親モジュールにコピペして信号名を合わせばMCUモジュールが追加される。

　ＰＬＬも同様であり、IP Core画面から Hard Module -> CLOCK -> PLLVRと選択。
　ダブルクリックで表れた画面で、CLKINのClock Frequency を 27MHzに、
　CLKOUTのExpected Frequency を 75MHz(若しくは必要な周波数)に設定する。
　当方の環境では追加して、PLL Reset と Enable LOCK もネタ元に合わせ設定している。
　OKすれば、プロジェクトに取り込まれるので、テンプレート内容を親モジュールにコピペする。

#ＭＣＵ(ソフト)
　お金持ちはKeilを使えるだろうが、GMDで我慢しようね。タダだから。
　GMDのインスツールが出来ていれば、起動後左のProject ExplorerにWorkspaceの内容が表示されている筈。
　File -> Open Projects From File System と選択し、Import画面を表示させる。
　Directory..を選択し、cm3_led(若しくはコンパイルしたい奴) のディレクトリを選択、
　Folder内のチェックを確認してから、 Finish を選択。
　ワークスペース内に cm3_led が反映している事を確認。
　 cm3_led を左クリックで選択した状態で、 Build(ハンマーマークのアイコン)を選択。
　Consolet画面が流れ出し、Finished building: cm3_led が見えれば大成功。
　Debugディレクトリに、cm3_led.bin が出来ている筈。
　　※cm3_ledは周期的に、LEDの点滅と、UARTへの文字入出力を行うプログラムに改変している。
　　　キー入力が有った場合、其れも表示する。
　　※UARTの動作確認にはRS232C-USB変換ケーブルが必要です。
　　　Tang-Nano-4Kのピン3-08を出力(tx)、3-09を入力(rx)に設定している。
　　　従って、ケーブルのRXを3-08に、TXを3-09に繋ぐ事によりUARTの信号が確認できる。
　　　ピンを変えたい場合は、led_test.cstを書き換える。

#ＭＣＵ(デバック)
　MCUとしてのデバッグ用として、簡単なモニタを作った。
　　[cm3_mon](https://github.com/hi631/tang-nano-4K/tree/master/cm3_mon)
　ロード方法はcm3_ledと同様。(というか、main.cが違うだけ)
　使用できるコマンドは下記の２つ
　　◇Dxxxxxxxx 
　　　　xxxxxxxx番地から128バイトのメモリをダンプする。
　　◇Mxxxxxxxx 若しくは MWxxxxxxxx
　　　　xxxxxxxx番地の内容を表示して書き換える。
　　　　(ret)で次の番地、(.)でコマンド終了。
　現時点では殆ど使う意味は無いだろうが。今後のペリフェラルの動作検証や、
　アセンブラともリンクさせた、デバッガに出来ないかと思慮中。
　　※ROM 0-3ffff(25kKB),RAM 20000000-20007fff 以外にはアクセスできない。
　　※GMDで、project -> properies -> C/C++ Build -> Setting -> Tool Settings -> Cross ARM C Compiler ->Miscellaneous -> Geenerate assembler listing にチェックを入れると、
　　　Debug\USERにアセンブルリストmain.o.lstが出来上がる。
![cm3_mon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/5cd488b3-4c39-abe9-f738-e530f1d946a7.jpeg)
#書き込み
　GOWIN EDA Education版で、cm3_led を指定してコンパイルを実行後、Program Device を選択。
　Operation(最初はSRAM Programを表示)をダブルクリックして、Device configuration 画面を表示。
　Access Mode を Mcu Mode に変更。Operation を Firmware Erase,Program に変更。
　FW/MCU/Binary Input Option の Firmware/Binary File に cm3_led.bin を登録、 save を選択する。
　元の画面に戻るので、登録内容を確認して Program 釦を押す。
　操作が正しければ、FPGAのconfigとMCUへのプログラム転送が同時に行われる。
　　※Programmerのバージョンに注意、ダメな場合はcableなんちゃらと出ており、書き込みは失敗している。
　　※FTDI製のシリアルをUSBに繋げると通信失敗。BL702がFTDIの振りをしているので誤認識するのだろう。

#UARTとprintf
　◇UARTの使い方
　　UART0とGPIOはMCU作成時にEnableにしてるので、ソフトから使用可能となっている。
　　UART0とGPIOの初期化は、見本をコピペした。。
　　UART0のクロックはTimer0で設定するように書かれているが、MCUのクロック設定に影響される。
　　当方では、MCUが80MHzで正常動作しなかったので、75MHz動作としている。
　　　※MCUとしては動いているようだが、UARTの動作が不安定。
　　　※MCUが80MHzで動作しないのは個体差とも考えるが、チップがマニュアル性能を持っていない疑惑も。
　　　MCUクロックを75MHzとしたので、UART0の通信速度設定に、115200*80/75と補正が入っている。
　　　※system_gw1ns4c.cに有る__XTAL(160MHz)との記載変更でも可だが、この方が分かり易いだろう。

　◇printfの使い方
　　サンプルプログラムは随所にprintfを使用されてるが、
　　これを使用するには、UART0が有効にならないと出力されない。
　　　※retarget.cの中で、printfの下請けルーチンがUART0にリダイレクトしている。
　　　※cm3_ledではTang-Nano-4Kのピン3-08を出力(tx)、3-09を入力(rx)に設定している
　　　※UARTの使用方法はPERIPHERAL\Sources\gw1ns4c_uart.cを見れば多分判るだろう。
　　　※printfが動けば、mcuソフトのデバッグは何とかなる気がする。
　　　※printfを使うだけで6メモリKB程度消費している感じ、サイズを気にするのなら自前で出力するべき。

#個人的なお願い
　こんな所にこんなこと書いても、大した影響無いとは思うけど、
　折角お値段以上の性能をブッコんでいるのに、こんな所は少々勿体ない。
　・ProgrammerのFlash書き込み不動作は、何とか解決してほしいものだ。
　・FTDIのチップがUSBに繋がっていると書込み失敗する。誤認識しない様にならないのかな。(前からだけど)
　・GMDの格納位置が固定、好きな所に格納さしてほしいな。
　・UARTの信号をUSBに通す事が出来ないので、外部に通信ケーブルが必要。
　　JTAG信号を弄るとかして何とかなりませんか。
　・GW1NSR-LV4CQNとして、もっとアピールすべきだ
　　　GW1N-1のシリーズなのだろうが、別物って言っても良いほど機能ＵＰしているのに。
　・TangNano-4Kの情報をもっと出してほしい(なるべく日本語で)
　　　多分、TangNano-4KはSipeedの製品で、商社(丸文)では取り扱っていないからなのだろう。
　　　だからTangNano-4Kとしてのサンプルが少ないと邪推。
　　　でも、目的はチップの拡販でしょう。取扱い開発キットに拘る事無いと思うけど。

#感想
　[過去にこんな事を書いた](https://qiita.com/hi631/items/d68c3b40c118588723f)
　「Tang-Nanoはライセンスの有り方が先行き不安なので、これ以上は利用しない予定。
　　値段安くて、コンパイル早いから、使いやすいんだけどもね。多分日本を相手にしていないのだろう。
　　アマチュアとしてはサポート無くても使える体制を望みたいものだ。まあ、販売元の自由だろうが。」
　が、問題点が解消されちまったので、継続して遊べそうだな。

　驚愕の事実だが1980円で、之だけ出来る環境が構築できるとは。世も末だな。
　FPGAチップもせいぜい2,300円って所じゃ無いのかな。
　USB通信チップなんて、32-bit RISC-V,fmax 144MHz,132KB RAM,192KB ROM,512KB Flashだとさ、
　FPGA搭載MPUより強力とは、笑っちゃうけど。
　過去に12800円のスターターキットが出た時以来の、パラダイムシフトじゃ無いかな。
　
　しかし、ＦＰＧＡフリークは日本では少数民族なのだろう。FPGAマガジン終わってるし。
　でもそれで良いのか日本。
　折角安くていいタマなんだから、将来の為に高校生当たりにばら撒くってのは考えられないのか。
　外国製が嫌ならGOWINに頭下げて、日本がセカンドサプライヤーになれば良いだけの話だろうに。

　更に、こんなモノをなんで日本で作れないのか。プロセスは高々55nだってよ。
　作れる技術は有るだろうが、作るもの売れる物を考えられないのだろう。
　先行投資となる種蒔をケチっていては先細りだろうに。なんて言っても詮無きこと。
　アマチュアは中国製FPGAを、有り難く使わせてもらいましょう。

　あ、念の為に私はGOWINの回し者では有りません。(商社のご好意でライセンスを一回だけ貰ったけど)
　別にGOWINはアマチュアの事を考えてやってる訳では無いと思うが、ここ迄の公開には素直に感謝してる。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。