Tang PrimerでUARTを使ってみる2020

#始めに

久しぶりにTang Primerを使ってみようと、環境設定からやってみました。すると多少はまったので、文章にしておいておこうと思い、書きました。IDEの立ち上げと、確認のために、UARTのループバックテストを動かしてみます。

####2021/8/12変更
- Tang Primerの綴りを間違えていました。恥ずかしい・・・。
- IDEのダウンロードページが移動していたのでURLを更新しました。
- ライセンスが2020/03で切れていたので、ライセンスファイルを変更しました。

#参考ページ

[IDEダウンロードページ](http://dl.sipeed.com/shareURL/TANG/Primer/IDE)

[Tang Premierサポートページ](https://tang.sipeed.com/en/)

[Windows10で署名なしドライバ をインストールする方法](http://pasofami.game.coocan.jp/Win10_DrvIns.htm)

[UARTのコード](https://github.com/yoshiki9636/uart_loop)

#準備物

- Tang Primer
- Windows10 PC
- USB-UART変換器

#IDEのインストール

Tang PrimerのIDEは[IDEダウンロードページ](http://dl.sipeed.com/shareURL/TANG/Primer/IDE)からダウンロードします。ページには、いくつかのバージョンがありますが、ダウンロードできないものがほとんどです。以下の２つのファイルをダウンロードしてください。

- TD1812_win.exe
- Anlogic_202003.lic

TD1812_win.exeの方をクリックすると、インストールが始まります。いろいろ中国語で聞かれますが、適当に押しているとインストールが完了します。
これでは、ライセンスが古いと怒られるので、Anlogic_20220130.licをAnlogic.licにリネームした上で、

C:\Anlogic\TD4.3.815\license

に上書きコピーをしてください。
次に、書き込みのためのドライバをインストールします。
まず、正式な方法を書きます。
Tang PrimerをIDEをインストールしたPCに接続します。すると、デバイスマネージャを開くと、「ユニバーサルシリアルバス」の項目の下に「USB-JTAG-Cable」ができます。これを右クリックして、ドライバの更新を選びます。ここで「コンピュータを参照してドライバーソフトウェアを検索」を選択します。パスに
C:\Anlogic\TD4.3.815\driver\win8_10_64
を入れてそのドライバをインストールします。デバイスマネージャを開くと、ユニバーサルシリアルバスコントローラの下に「Anlogic usb cable v0.1」というドライバがインストールされます。ただ、筆者の場合は、ドライバに警告マークがつき、署名がおかしいといわれます。この状態では、IDEのダウンローダからTang Premierが認識されずに、ビットストリームの書き込みが一切できません。
このような場合になったら、無署名のドライバインストールと同じ方法をとるしかありません。一度ドライバを削除して、[「Windows10で署名なしドライバ をインストールする方法」](http://pasofami.game.coocan.jp/Win10_DrvIns.htm)に従って、無署名のドライバーインストールをする必要があります。うまくいくと、警告マークのないドライバとなります。

# UARTループバックでテスト

環境のテストのために、UARTループバックテストを動かしてみます。
まず、[筆者のレポジトリからUARTテストのコード](https://github.com/yoshiki9636/uart_loop)をダウンロードします。このディレクトリのうち、constraintsとsrc２つのフォルダの中のファイルをIDEのPCに入れてください。IDEを立ち上げ、Project→New Projectで新プロジェクトを作ります。Project NameとProject Pathはお好みで、Device FamilyはEG4、Device NameはEG4S20BG256を選択してください。Hierarchyを右クリック、Add Sourcesで、先ほど用意した.vファイルと制約ファイルを読み込みます。pll.vが無いと出ますので、PLLの設定をします。tools→IP GeneratorでCreate a new IP coreを選択します。Fileのところに「pll」と打ち込みOKを押すと、IPの一覧が出てきます。この中のPhase Locked Loop - PLLの下のPLLという項目を選びます。続くPLLの設定では、input frequency: 24MHz、Bandwidth setting Mediam、Use C0 clock : 48MHz
これでPLLが出来上がります。
あとは、緑色のRunボタンを押せば、合成が始まります。
合成が終わったら、Downloadを選択します。一番上の欄にFPGAの型番が選択されていることを確認してください。No hardwareになっていたら、ケーブル等何かの要因でFPGAが認識されていません。次にAddで合成の結果を選択します。File Selectionに欄が追加されますので、それを選択すると、Runボタンが有効になります。ここで、ModeをJTAGからPROGRAM FLASHに変更してください。これでRunを押すと書き込みが開始します。

書き込みができたら、動作チェックをしてみます。FPGAのピンと、USB-UART変換器のピンを３本接続します。FPGAは、
B15 : tx
B16 : rx
を使っております。
Gnd,Tx,Rxを接続してください。お約束ですが、txはrx,rxはtxに接続してください。

できたら、FPGAに電源を入れて、PCでteratermを立ち上げてください。（無ければインストールしてください。）teratermの新しい接続で、シリアルを選択してください。シリアルが出ない場合は、USB-UART変換器が認識されていないので、ドライバの確認をしてください。
スピードは9600bpsなので、設定してください。キーボードで打つと、キャラクターが一度FPGAまで送信され、ループバックして、画面に表示されています。このとき、FPGAで１キャラクタ受け付ける度にLEDの表示が変化することが確認できると思います。

#ボーレートの変更

ボーレートや、動作周波数は設定変更が必要です。設定には動作クロック周波数と、ボーレート２つの数値を使用します。今回は自分で作るものの都合で動作クロック48MHz、ボーレート9600bpsになっております。
動作周波数clockfreq(MHz)とボーレートbaudrate(bps)の２つの数字から以下の式で算出できます。

TERM = (clockfreq/baudrate) * 1000 * 1000
HALF = TERM / 2

これらの数値をuart_if.vに設定していただければ、お好みのクロック周波数、ボーレートに変更できると思います。
前述の48MHz,9600bpsだと、

TERM = (48/9600) * 1000 * 1000 = 5000
HALF = 5000 / 2 = 2500

という数字になります。

#最後に

最初はTang Nanoでいくつか論理を組んでいたのですが、回路規模が溢れてしまい、Tang Primerを使うことになりました。同じTangシリーズなのにFPGAは全く関連が無いので、IDEから入れ直しなのはなかなかなものです。今回は他でUARTを使う必要が出て、組んでみたのですが、他のFPGAでも使えそうなので、公開することにしました。お役に立てればと思います。