LoginSignup
2

More than 1 year has passed since last update.

Tang-Nano-4Kとパソコンとの、JTAG経由の直接通信

Posted at

目的

 Tang-Nano-4Kに機器追加追加無しで、データのやり取りをやりたい。
 USBシリアルを使えば通信は出来るんだけど、USBシリアル邪魔だものね。
 USBでJTAGが繋がってるから、通信できる可能性は有るのだけど。
 誰かがやってくれるかもしれないが、待ってるだけも何だし。
 ◆◆◆ よし、出来る範囲で頑張ってみるか ◆◆◆
 うーん、資料がないゾ。

経緯

 Tang-Nano-4Kに、別途USBシリアルを繋げば通信できるのは当たり前。
 でもケーブルの結線は邪魔だし、接続を何時迄覚えて居られるかな。
 そもそもは、JTAGのシリアル端子がFPGAに繋がって居れば問題無かった話だが。
  ※多分、端子が足りなかったのだろう。
 其れなら、JTAGやってるBL702の通信モードを変えればと思ったが...。
  ※BL702はFTDI所生のFTD2XX.dllからのコマンドは受け付ける謎仕様。
  ※FTDIの真似っこしているようだが、大部分のコマンドは無視されてる様子。
 謎の壁は厚かったが、突破口として通信可能な条件を見出した、
 謎は解けた、と言っても判ったのはごく一部だとは思うけど。

開発環境

 Tang-Nano-4K      効率よくデバッグするなら2個必要。(何処かで買って)
 GOWIN EDA Education版  verilogのコンパイルに必要。(GOWINに登録して落して)
 ARMコンパイラ      Cortex-M3のプログラムコンパイルに必要。( 〃 )

謎とき(JTAGのコマンド解析)

 JTAG通信を司っているBL702へ書き込まれているプログラムの資料は見つからなかった。
  ※メーカーに公開の義務も無いけど、コマンド位公開してほしいものだ。
 「FTDIのsampleプログラム」でアクセスするとレスポンスが帰ってきた。
 この結果より、FT_Open,FT_Close,FT_Write,FT_Readは動作する模様。
 その他のコマンドは、送っても動作しているかどうか良く判らなかった。
 送信している波形をAnalyzer Oscilloscopeで表示させ、解析回路を作成。
 同様な波形を送信する事により、LoopBack(FTDIのsampleソフト)での通信に成功。
  ※クロックに同期した送信波形。SPI信号、のような。

 送受信波形を下記に示す。左図では1(0x31)を送信、上からTCK,TDI,TDO、
 TCKに同期してTDIにデータ送信、暫くして受信データ(エコー)がTDOに表れてる。
 右図は左波形の拡大、約2.5MHzで通信している事を示す。
jtag_signal.jpg

 ここで問題発生、プログラムを弄ったら通信できなくなった。
 変更点を比較すると、動作正常と動作異常のソフトではテスト用の送信データを変えていた。
  正常 送信データ "0123456789"
  異常 送信データ 0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99
 この結果と、正常時も初回は"0123"が送られずに、"456789"のみ送信されている事より、"0123"はコマンドとして処理されていると判断。
 初期コマンドとして"0123"を送る事にした。

 しかし更に問題発生。13KB程度送受信した処で送信が停止する事態。
 其処で"0123"を色々変更して挙動を確認して次の結果を得た。
  "0" コマンドとは関係なし。送出は不要。
  "1" 送信データ長を指定するコマンド。MSBからの送信となる。
  "23" データ長。0x3332 -1 = 13105Byte が送信データ長と認識される。

システム構成

 開発システムは下記部分で構成。
  ホスト通信ソフト FTD2XX.dllを制御して、パソコン画面ででデータを送受信。
  SPIターミナル   USBの信号を受けて、SPI信号に変換するハード。
  SPI信号交換回路  ホストとモニター間での、SPI信号交換するFPGAによる回路。
  cm3モニター    ホストからの通信で、モニターとして動作。

 開発環境(笑)
 前方右がTang-Nano-4K本体、表示用LED付、右も同様だがターミナルとして使用。
 後方右は電源SW付USBハブ、左にロジアナが見える。その前はURT通信用のUSBシリアル。
kaihtsu-4K.jpg

ホスト通信ソフト

 送受信動作は、
  FT_Open -> FT_Write(初期化コマンド) -> FT_Write(データ送信) -> FT_Read(データ受信) -> FT_Close
 を無限に繰り返す。
 此処での注意事項として、データ送受信のByte数は同一にすること。
  ※間違えると戻ってこない。
 FT_ReadはFT_Write時に受け取ったデータであり、新たに受信用クロックの送出は行わない。
  ※cm3側の受信処理では、0x00のダミーデータを送信してるが。

 「ホスト通信ソフト」をgithubに上げておく。
 ソフトはUSBTransferをベースに改変したのでC#で書かれており、VS2017でコンパイルした。
 左上の Start Term をクリックして、緑に変われば通信可能になっている。
 その横に表示の Devices はUSBポートに繋がっているデバイス数(x2)。
 接続後デバイスが有効(デバイス数が2又は4)になってからクリックする事。
  ※相手がSPIターミナルで無くとも、通信可能と誤検知する。
jtag-term.jpg

SPIターミナルとJTAG用ピンのユーザー使用について

 本体FPGAとの通信は、Tang-Nano-4K上のBL702を通信デバイスを使用するが、取り得る選択肢が二通りある。

 [本体のBL702を利用]
 Tang-Nano-4Kが一個で事足りるが、Analyzer Oscilloscopeが使えなくなる。
 追加の外部配線は不要。
 JTAGビンは、TCK(input)=7,TDI(input)=3,TDO(output)=4 に設定しておく。

 [別のTang-Nano-4Kを利用]
 Tang-Nano-4Kが余計に必要。
 追加の外部配線として、TCK(16->7),TDI(13->3),TDO(17->4)を接続する。
  ※( )内は(ターミナルデバイス->本体デバイス)への結線を示す。
 ターミナル側のJTAGビンは、TCK(input)=7,TDI(input)=3,TDO(input)=4 と設定しておく。
  ※FPGA側から余計な信号を貰わないように。
 本体側のJTAGビンは、TCK(input)=16,TDI(input)=13,TDO(output)=17 と設定。

 JTAG用のピンをユーザー側で使用する為に下記を設定。
  Project -> Configuration -> Place&Route -> Dual-PurposePin -> Use JTAG as regular IO にチェックを入れると、JTAG用ピンをユーザーが使用可能となる。
 【! 此処で重要な注意事項 !】
 上記操作を実行後は、通常状態ではFPGAへの書き込みが出来なくなる。※当然だな
 この状態で書き込む場合、JTAGSEL(Tg-Nano-4Kの08ビン)をGNDに接続する必要が有る。
  ※Use JTAG as regular IO のチェックを外せば元の状態に戻る。
  ※08ピンをGND接続状態では regular IO は利用できない。※これも当然

SPI信号交換回路

 機能としては、JTAGからのSPI信号をMCUに送る。MCUからのSPI信号を、JTAGに送る。
 どちらも相手はマスターなので、信号交換はSPIスレーブxスレーブとして動作する。
 通信速度が異なるので、バッファ(16Byte)をかましている。
 動作は「githubに上げた」、test_mcu_top.vを見てくれ。
  ※当初はデータ受信動作で誤入力多し。
   JTAGからの信号が弱く、TDOの変化でTCK(クロック)にノイズが乗っているのをAnalyzer Oscilloscopeで確認。
   FPGAの出力低減策として、DRIVE=8->4にする事により誤入力は無くなったが。
   Analyzer Oscilloscopeの動作に影響しそう。真っ当なノイズ除去対策が必要かも。

cm3モニター

 モニターの入出力を、UARTからSPIに振り替えただけ。
  ※USRKEY2を押しながらリセットで、UART入出力に切り替わる。
 「githubに上げておく。
 対応コマンドとして、下記を追加。
  RS SPIからの受信データを表示。
  RG GPIO入力を表示
  WS SPIから送信 ※ WS 30 31 32 33 34(CR)
  WG GPIOに出力  ※ WG 0001(CR)

Analyzer OscilloscopeによるMCU搭載回路のデバック

 前回、mcuのデバックは出来ないと言っていたが、動作限定されるが利用可能で有った。
 先ず、MCU込みの回路とソフトをEEROMに書込んでおく。(旧いProgrammerが必要)
 次に、同一ロジックをAnalyzer Oscilloscopeの操作で書き込み、実行する。(Educationバージョンで)
 MCUが稼働可能な状態で、Analyzer Oscilloscopeでの計測が可能となる。
  ※ロジックを書き換えても問題無く使えたが、何処まで行けるかは不明。

MCU

 MCUに付属のGPIOは Enable GPIO をチェックするだけでは、inoutとしてビンへの接続しか出来ず内部使用不可。
 しかしその下の、 Enable GPIO I/O のチェックを外すと入出力が分離される。
この状態では、GPIOの信号がFPGA内で信号として利用可能となる。
  ※専用のIOポートを作らなくても、GPIOを使ってFPGA部との信号のやり取りが出来る。

 MCUのRAMとして、ディフォルトでは16KB割り割り当てられるが、これは20KBしか無い貴重なBSRAMの無駄遣い。
 EMPU設定画面で SRAM部 をダブルクリックして 設定画面を開けば SRAM SiZE の変更設定が可能。
  ※BSRAMが多く残れば、Analyzer Oscilloscopeでのキャプチャー範囲が増やせる。
   MCUが必要なRAMはコンパイル画面のdataセクションの表示で判る。(多分)
   現状は1084Byteと表示されている。設定で4KBを割り当てている。2KBに減らしても良いかも。

BSRAMの使用について

 通信バッファを構成しているが、バッファを256byteとした場合、BSRAMを使用していた。
 バッファを32byteにした場合、BSRAMは使用されなくなったが、LUTの使用が200LUT程度増加。
 最適なバッファ容量も有るだろうが、BSRAMとLUTのどちらを使うかを天秤にかける事も出来る。
  ※BSRAMがもっと多ければ何の問題も無いが、コストに絡むのだろう。
   BSRAMが必要なのはAnalyzer Oscilloscopeの使い勝手向上の為であり、素人的運用だけど。

Analyzer Oscilloscopeの利用について

 設定ファイル作成時には、 For Post-Synthesis を推奨しているが、 For RTL Design の方が使い勝手が宜しい。
 この状態ではロジックで作成した信号名だけが表示される。中間的な信号は無い方が素人は判りやすい。
 また、他社の物の様に、信号が存在しませんと言われない。
 この状態ではその分、最適化されて無いと言う事だろうけども。
 なにより、この程度の規模ではコンパイルは爆速、ロジックをガシガシ組み替えて動作確認が出来るのは嬉しい。
  ※シミュレーター環境組むほどの能力も根気も無いからね。

 Programmerと同様、USBにデバイスを1個以上接続すると動いてくれない。
 従って、書き込み時は本体のみにして行うが、Analyzer Oscilloscope動作時はそうも行かない。
 そこで、まず本体のみ接続しておきAUTO(連続再起動)で起動し、追加デバイスは起動後に繋ぐ。
 JtagTermは後から繋いだ方と通信するので、その儘で計測続行が可能。
  ※本体をUSBハブの上流に置かないと駄目かも知れない。
 但し、都合よくトリガが掛かるように考慮しないと、再トリガで波形が流れてしまう。
  ※MCUからGPI経由でトリガ信号を制御すれば問題無し。

 凄く便利なんだけど、設定の判り難さは何とかならないものか。
 特にトリガ条件の設定。Valueの設定が、RとかF,0,1とか言われても判るかな。
  ※トリガ信号を一本に絞り、自前でトリガ条件回路作れば済む話だけど。

感想

 今回のデバックでも活用したが、コンパイル速度が速いのと相まってAnalyzer Oscilloscopeが超便利。
 ものの数十秒でロジックの動作再確認が可能になる。これなら半田付けよりも早いぜ。
 昔からFPGAで戯れてる身としては、ターンアラウンドの改善には驚異さえ感じてしまう。
 こんな機材を使う勉強と、紙上でand,orなんて言ってるレベルでは、競争にならないだろうな。
 パソコンと基板一枚あれば、技術レベルは飛躍的に向上。でも日本の教育ではやんないだろうね。
 高級な機材を有する教育期間も有るだろうが、其れじゃあ遅いんだな。
 プログラム教育が問題になってるが、ハードウェアはそれ以前じゃ無いかな。なんてね。

 JtagTermが使えるレベルになっているとは思うが、制約が面倒くさいので、使うかどうかは微妙。
 なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。

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
2