« 2020年2月 | トップページ | 2020年4月 »

2020.03.31

ZYNQ UltraScale+の新しい評価ボード TE0802

TrenzElectronic社から出ているTE0802というZYNQ UltraScale+の評価ボードを買いました。

Te0802_1

面白そうだから、思わず自分用に注文してしまいました。。

いままで個人の趣味でUltraScale+を使ってみるとなると、みんなUltra96一択でした。

確かにUltra96の他には、手ごろな価格のUltraScaleボードが無かったからでしょう。

 

でも、Ultra96一強の時代は終わりました❗❗

新しい低価格UltraScale+評価ボードの登場です。

その名も、TE0802-02-2AEU2-Aです。(覚えにくい💦

https://www.trenz.jp/product/TE0802-02-2AEU2-A

主なスペックは、

  • XCZU2CG-1SBVA484E
  • LPDDR4 1GB
  • ギガビットイーサ
  • USB3.0ホスト
  • M.2 SSD PCIe
  • Display port
  • VGA搭載
  • USB-JTAGとUSB-UARTをオンボードで搭載
  • 4桁の7セグLEDのほかLEDがいっぱい
  • ボタンやスイッチがたくさん
  • PMODが2個
  • 5V単一電源で動作
  • ファンレス

という感じです。

Ultra96と比べて良いなと思うところを赤色にしました。

まず、Ultra96は5Vじゃ動かないのですが、このボードは5V単一電源で動きます。12Vで細口の特殊なACアダプタを用意しなくていいんです!

それに、Digilent互換のUSB-JTAGとUSB-UARTを搭載しているので、書き込みもデバッグもコンソールも、他に何もいりません。

おまけに、使うかどうかわかりませんが、PCIeも付いています。ここにはM2のSSDを乗せるようですね。

FANもないので静かです。

Ultra96がZU3EGなのに対して、このボードはZU2CGと、少し規模が小さいのとGPUが乗っていない点が負けているところです。

Te0802_bot

GPUはありませんが、画像描画が目的でなければあまり関係ないのかもしれません。Ultra96と比べると周辺回路が充実しているので楽しめるでしょう。

 

それではさっそく動かしてみようとしたのですが、SDカードは付属していなかったので、Trenz社の製品ページに行き、Downloadsタブの中からTE0802-test_board-vivado_2018.3-build_07_20190830103019.zip をダウンロードしてきます。

Image2

この中のtest_board\prebuilt\boot_images\2cg_i1gb\u-boot\BOOT.binをSDカードに入れれば、U-bootまでは立ち上がります。

--------------------------------------------------------------------------------

Xilinx Zynq MP First Stage Boot Loader (TE modified)
Release 2018.3 Aug 30 2019 - 08:40:28
Device Name: XCZU2CG

--------------------------------------------------------------------------------
TE0802 TE_XFsbl_BoardInit_Custom
Reset Complete

--------------------------------------------------------------------------------
NOTICE: ATF running on XCZU2CG/silicon v4/RTL5.1 at 0xfffea000
NOTICE: BL31: Secure code at 0x0
NOTICE: BL31: Non secure code at 0x8000000
NOTICE: BL31: v1.5(release):xilinx-v2018.2-919-g08560c36
NOTICE: BL31: Built : 10:34:42, Aug 29 2019
PMUFW: v1.1


U-Boot 2018.01 (Aug 29 2019 - 10:32:05 +0000) Xilinx ZynqMP ZCU102 rev1.0

I2C: ready
DRAM: 1023 MiB
EL Level: EL2
Chip ID: zu2cg
MMC: mmc@ff160000: 0 (SD)
Using default environment

In: serial@ff000000
Out: serial@ff000000
Err: serial@ff000000
Board: Xilinx ZynqMP
Bootmode: SD_MODE
Net: ZYNQ GEM: ff0e0000, phyaddr 1, interface rgmii-id

Warning: ethernet@ff0e0000 using MAC address from ROM
eth0: ethernet@ff0e0000
U-BOOT for petalinux

ethernet@ff0e0000 Waiting for PHY auto negotiation to complete..........

無事U-Bootは起動したのですが、uImageがなく、ここから先の起動はできませんでした。

Te0802_2

ディジタル時計みたいなアプリが動いています。↑

 

アーカイブにLinuxの完全なイメージは含まれていなかったので、PetaLinuxで作るか、どこからかTrenz用Linuxを探してくるかしなければならないようです。

誰か腕試しにLinuxを移植してみませんか?

 

USB-JTAGが乗っているようなので、MITOUJTAGでも見てみました。

MITOUJTAG 3.4でなら、バウンダリスキャンができます。端子の状態も見えます。

Te0802_mj1

I/Oの状態を波形としても見ることができました。

Te0802_mj2

PLはコンフィグされていて、7セグLEDの信号とVGAの信号が激しく動いているようでした。

 

さて、こんな楽しそうな機能がいっぱいのTE0802を輸入して販売いたします。

価格は39,800円。

銀行振込もしくは代引きでご注文いただくと、送料無料です。

 

なお、ドイツの輸出規制にひっかかる商品のため、その都度輸出許可を得る必要があります。

輸出管理の関係上、弊社にストックしておけないので、納期はどうしても1週間くらいかかります。

ですが、頑張って輸出申請書類を書いて、取り寄せます。

 

外出自粛であまり外に出られないご時世ですので、自宅に籠ってUltraScale+のLinuxを極めるなんていうのも素敵な過ごし方ではないかと思います。

PCIeやPMOD、たくさんのLED・スイッチなど、Ultra96では楽しめない要素が盛りだくさんです。

気になったらぜひ見てみてください!

製品紹介ページはこちらです↓

https://www.trenz.jp/product/TE0802-02-2AEU2-A

 

※コロナウィルスの影響で国際輸送網に影響が出始めています。国際輸送が正常に機能している今週中にぜひともご注文ください。メーカーに在庫はたくさんあります。

 

| | コメント (0)

2020.03.28

Cosmo-Z 64chの裏面パネルに大きな穴あけ

いや~もう、このステップドリルビットというアイテムは神!

Cosmoz64_6

私はアルミ加工がめちゃくちゃヘタクソなのですが、このステップドリルを使うことで大きな穴をサクサクあけられるようになりました。

Cosmoz64_7

4mmの穴をあけたら、6mmの穴が開き、次に8mmの穴が開き・・・とい感じでどんどん大きな穴が開いていきます。

テーパーリーマーで汗だくになっていた今までは何だったの!?という感じです。

 

下敷き(ここでは適当な本)の上にアルミ板を乗せて手で固定してドリルで穴開けします。左手で固定して右手でドリルというスタイルは危険だから本当はいけないのでしょうけど。何度か切腹しそうになりました。従業員にはやらせられないですね。

ボール盤とかCクランプとか欲しいけど、置く場所がないし、1年に1回くらいしかアルミ加工しないので、仕方ない。

 

とりあえずこの、電動ドリル一本でここまで加工できました。

Cosmoz64_8

 

| | コメント (0)

2020.03.27

Cosmo-Z 64chに通電

秋葉原に行って、いろいろな小物類を買ってきて、配線をしました。

Cosmoz64_3

電源モジュールから出てくる配線をネジで固定するやつをはじめ、いろいろな小物を買ってきて組み立てました。

電源を入れたところ12Vで2.8Aくらい流れます。ドゥーンという音がするのが緊張感を高めます。

起動時に大きな電流が流れるようで、安定化電源を3Aにセットしていると起動できないこともあります。

GbEのハブは両面テープで電源モジュールの上に固定です。両面テープと言っても、超強力なやつで、つるつるの面同士でくっつけると二度と離れないくらい強力です。

2台の基板の同期をどう取るかを考えたところ、1台をメイン基板にして、

Cosmoz64_4

もう一台をサブ基板にすることにしました。

Cosmoz64_5

そして、メイン基板のGTXを2個使ってクロックと、リセット信号、トリガ信号を送ります。メインのGTXとサブのGTXはそれを受けて、クロックとリセットとトリガを受け取ります。

つまり、メインもサブもGTX経由で受け取ったクロックと、リセット信号、トリガ信号で動くようにするというわけです。

きっと大丈夫。このような感じで100台のカメラをクロック同期させた経験があります。

 

秋月でSMAコネクタと、千石で同軸を買ってきました。

| | コメント (0)

2020.03.26

Cosmo-Zの64ch版を開発中

Cosmo-Zの64ch版を開発しています。

Cosmoz64_1

一つの箱の中に、32chのCosmo-Zを2台入れています。ギガビットイーサのハブと、USBのハブと電源ユニットを入れて、外からは1台の装置に見えるようにするという考えです。

これで、125MHzで12bitで64chの同時サンプリングができるようになります。

Cosmoz64_2

2台の同期をどう取るか、排熱は大丈夫かなど、悩みは尽きません。

 

| | コメント (0)

2020.03.24

突然送られてきたLynsyn Liteを試してみた

SUNDANCEというイギリスの会社から突然、ボードが送られてきました。注文もしていないのに。

「きっと興味を持ってくれるだろう」みたいな手紙が添えられて。

 

Lynsyn1

電源電圧と電流を測定できるボードだそうで、普通に買うと日本円にして1万2千円くらいです。

Lynsyn2

ただの電圧電流測定ボードなら全く興味を持たなかったのですが、JTAGと書いてあるので、思わず動かしてみたくなりました。

 

XILINX JTAGとか書いてあるので、Vivadoから使えるのかしら?

Micro USBを差し込むとUSBシリアルとしてCOMポートが開けるのですが、キーを叩いても特に何も起きません。

JTAGコネクタに変換アダプタをかましてXILINXのPlatform Cable USBにつないでも、特に何も認識されません。

 

ソフトウェアがGitHubにあるらしく、

https://github.com/EECS-NTNU/lynsyn-host-software/releases

からLynsyn host software V1.2.1 というのをダウンロードしてきます。

解凍して、

Lynsyn3

まずは、このzadig-2.4.exeを実行するそうです。

実行してOptions→List All Deviceを実行。

Lynsyn4

こっ、これは、危険なやつじゃん!!

「USBのドライバを別のやつに置き換えるツール」という明らかに危険な香りのするツールを使ってドライバをインストールします。libusbにするんですね。

どんなUSBデバイスのドライバも置き換えられそうですね。

Lynsyn6

そして、lynsyn_viewer.exeを実行します。

サンプリングを開始して、10秒間、待ちます。

Lynsyn5

10秒くらいで波形が出てきますが、それまでの間何も出ないので不安になりますね。

特に何もつないでいないので、電源電圧の半分くらいの電圧が表示されています。

暇になったらUSBとかの電源でも見てみましょうか。

 

それから、XILINXのUSBから認識されるのではなく、このLynsynがUSB-JTAGになるという意味でした。

つまり、Lynsyn LiteをXVCサーバなUSB-JTAGにしてVivadoから接続し、他のボードをコンフィグしたりデバッグしたりできます。XVCサーバになれる他、SVFやXSVFを実行する機能があるそうです。

箱に書いてある「Sampling over JTAG (ARM Cortex A9, A53, A57) with up to 10kHz」のやり方はちょっと分かりませんでした。

| | コメント (0)

2020.03.23

Spartan-7のLUT使用率が100%近くなるとどうなる?

XILINX FPGAのLUT使用率がどこまでいけるかを試してみました。50%くらいでダメになるという噂や、80%くらいで配線が引けなくなるという噂があるので、どこまで本当かを検証してみました。

といってもLUTを埋め尽くすようなロジックを書くのは大変なので、MicroBlazeの標準的なデザインを使って、MicroBlazeの機能をポチポチと設定することで、最大のLUTを目指しました。

ツールはVivado 2019.2、FPGAはXC7S50CSGA324-1です。

回路はこんな感じです。

Design_20200323172201

MicroBlazeはMaximum Performanceに設定するとLUTの使用率が高くなります。そして、CacheのLineLengthを8→16にすると効率よくLUTを消費できます。その他、細かいオプションをON/OFFすることで、限界ギリギリのLUT使用率が達成できました。このSpartan-7には32600個のLUTがあるのですが、ちょっと油断すると32630とかになるので、影響の少なそうなチェックボックスをポチポチやって試行錯誤します。もちろん微調整すれば100%に限りなく近づけることもできますが、時間がかかるのでこのあたりで妥協します。

設定は以下のとおりです。

Cfg1 Cfg3 Cfg2 Cfg4 Cfg5

さて、論理合成をかけてみました。

結果は、LUT使用率97%です。

Util

Util2

最も遅い-1グレードなのでタイミングエラーは出ていますが、place & routeにかかる経過時間を見ても11分で終わっており、LUT使用率が97%とMAXであるのにそれほど長時間かかるわけではありませんでした。

Drc

使用率を図で見てみましょう。

Dev1

はいっ!ほぼ100%埋まっていますね。

拡大すると、

Dev2 

やっぱり、みっちりと詰まっています。

結論を言うと、

  • XILINXのSpartan-7はLUTの使用率が100%近くになっても、配線が引けなくなることはなかった
  • LUT使用率が100%近くになっても、配線が終わらないということはなかった

手を動かして実験してみるのは大事です。さもないと、思い込みから抜けられなくなります。

 

逆に、LUT 50%くらい配線が引けなくなるデザインって、どんななの?」って感じです。

めっちゃ遠いところの入力を使う巨大なテーブルを作りまくればできるのでしょうか?

 

<おまけ>

MicroBlazeだからLUT使用率100%近くでも配線が引けるようなチートがあるのではないか?と疑う人がいるかもしれません。

XILINXのホワイトペーパー wp496に、UltraScale+とArria10で比較した実験の結果が出ています。

 

まぁ、XILINX側の資料なのでXILINXが優勢と書いてあるのは当然なのですが、OpenCoresの中から重そうなコアをいくつか持ってきて、UltraScaleとArria10で勝負したというものですから、MicroBlazeを使ってLUT100%を狙うよりフェアですね。

Wp496

内容を詳しくは読んでいませんが、この表を見ると複雑な演算回路で80%以上のLUT使用率でも問題なく使えそうですね。

Wp496_2

XILINXのAnswer 66134によればこういう問題のことを「密集」というそうです。

https://japan.xilinx.com/support/answers/66314.html

密集をほぐすオプションの設定方法がいろいろと書かれています。

| | コメント (0)

2020.03.21

MPSSE-JTAGで一応バウンダリスキャンに成功

FTDI社のFT2232HにあるMPSSEを用いたUSB-JTAGをMITOUJTAGから使うためのプラグインを作りました。

一応、このように動いています。

Mpsse_jtag

分かってきたことは、DigilentのUSB-JTAGもMPSSEとしてオープンできるということです。Digilent USB-JTAGはMPSSEの上に1枚ラッパを掛けたものなのでしょう。

FTDIのアプリケーションノートAN_129では

ftStatus |= FT_SetLatencyTimer(ftHandle, 16);

と、LatencyTimerを16msに設定していますが、この値にすると毎秒20回くらいのバウンダリスキャンしかできず、遅くなります。

実際にはFT_SetLatencyTimer(ftHandle, 1)で十分なようです。1に設定すると1.6msに1回くらいのバウンダリスキャンができるようになります。Digilentのライブラリも1に設定しているように見えます。

これを0にすると、なぜだかキュルキュルーという音が聞こえるようになります。PCが鳴っているのかFTDIのチップが鳴っているのわかりませんが、0は良くないのでしょう。

MPSSEで苦労することは、FT_ReadでTDOから受信したデータを読み取るときに、最後の1バイトは配列の最後にシフトされた形で入っていますが、それを1つ前のバイトにコピーしてやらねばならないことです。しかも、JTAGのデータ長(bit)が8の倍数かどうかでシフトさせるかどうかが変わるので、

if(len & 7) {
    rx_buffer[bytelen-2] = rx_buffer[bytelen-1] >> (8 - (len & 7));
}
else {
    rx_buffer[bytelen-2] = rx_buffer[bytelen-1];
}

となります。

厄介ですね。

おそらくFT2232Hの中ではシンプルなステートマシンでJTAGの信号を作り出しているためなのでしょう。

 

一応、バウンダリスキャンができるようにはなったのですが、まだまだ不安定なので、データシートとにらめっこしながらデバッグを進めていくことにします。

| | コメント (0)

2020.03.20

Trenz社製品ページの検索機能が動くようにしたった

Trenz社にはいろいろなFPGAボードがあるのですが、本家のサイトが重すぎるので、いろいろな製品を見比べて自分に最も合う製品を探すのはとてもストレスがたまります。

そこで、Trenz社製品の検索ページを作りました。

https://www.trenz.jp/paramtable.html 

160種類くらいのボードをFPGAファミリや、メモリサイズ、イーサの有無、基板サイズなどで検索できます。

在庫と価格も一緒に表示されるので、購入のための選定に便利です。

たとえば、「ZUNQ UltraScale+でギガビットイーサのPHYも乗っているボードはないかな・・」と検索するときにはこんな感じで行います。

Paramtable2

FPGAボードだけではなく、ベースボードや、JTAG基板などのアクセサリも入れたので、ほぼ全製品が検索対象です。

 

面白いなと思うのは、ギガビットイーサを2個持っているTE0782とか、

Te0782

100Mイーサを2つとギガビットイーサを1つ、計3個持っているTE0729とか。

Te0729

うーん何に使うんだろう。個性的すぎますね。

ボードのサイズも入力しました。これはほぼ手作業です。

例えば40mm×50mmというのは、Trenz社の標準サイズなのですが、このサイズで検索にひっかかるボードは

4x5

TE600(Spartan-3)、TE0710、TE0711、TE0712、TE0713、TE0715、TE0720、TE0741、TE0820、TE0821、TE0823、と多岐にわたっています。それぞれどのような違いがあるのか・・という理解を深めるのにもこのページは役立つはずです。

 

我ながらデータベース+Webアプリがワキワキ動くのが面白いと思うので、お暇ならぜひ試してみてください。

https://www.trenz.jp/paramtable.html 

| | コメント (0)

2020.03.19

Trenz製品のパラメータ検索ページを作成中

Trenz製品のパラメータ検索ページを作成しています。

たくさんの製品ページの記事に含まれているFPGAの型番や、/DDR[3-4]L?/や/e\.?MMC/という記述などを正規表現で抽出して、ボードが持っているFPGAの型番や周辺IC一覧をCSVファイルに出力し、それをもとにデータベースを作ってPHPからぐるぐる回して製品の一覧が表で出るようになりました。

Paramtable

ただ、ページによって表記のゆれがかなりあるので、最後は手動で修正していくことになりました。

こうしてみると、わかりにくいTE071x製品は

  • TE0710・・・100Mイーサが2個
  • TE0711・・・DDRなし、USB、イーサなし(実際にはUSB-UARTがある)
  • TE0712・・・100Mイーサが1個とGTPあり
  • TE0713・・・USB PHYあり。GTPあり
  • TE0714・・・GTPあり
  • TE0715・・・GbEととUSB PHYとGTXあり。実はZYNQ

という差異があることがわかります。

一覧が出るだけでもそれなりに便利なのですが、やはり本当のパラメトリックサーチができるように、各項目をフィルタしたり検索できなければなりませんね。

| | コメント (0)

2020.03.17

Trenz社の全製品をサイトに登録しました

特殊電子回路は、これまでTrenzElectronic社の製品の中からXILINX関連のいくつかのメジャーな品種をピックアップして販売してきましたが、本日以降、TrenzElectronic製FPGAボードの全製品を取り扱うことといたしました。

TrenzElectronic社の製品には、XILINXだけではなく、ALTERA、Lattice、Microsemiなど様々なベンダのFPGAボードがあります。これらの製品を販売できるよう当サイトのデータベースとWebサイトのプログラムを改良し、商品を登録し、説明文を翻訳いたしました。

機械翻訳であるため意味が通じにくい個所がございますが、なにとぞご容赦ください。

1584428131_tsuika

 

TE0808、TE0807、TE0803、TE0820シリーズなどのUltraScale+製品では、従来の「(シリーズ名)-(基板リビジョン)-(FPGAサイズ)-(温度スピード)」という型番から新しい体系の製品番号へと移行しています。これらの新しい番号で製品を登録しなおしました。

例 TE0820-03-04CG-1EA → TE0820-03-4AE21FA

Te0802 Te0808s Tei0003 Te0745

それから、全製品の価格を「ドイツの販売価格×為替レート+輸入送料手数料(1000円程度)」となるよう、全面的に見直しました。

ここ数年間、Trenz社は製品の価格をたびたび改定して引き下げているため、長期にわたって販売している製品では、当社の価格がTrenz社の定価よりもかなり高くなってしまっていたものがありましたが、今回の改定ですべての製品でドイツの定価水準になるよう価格が更新されました。

 

| | コメント (0)

2020.03.14

コロナ騒ぎと新しい世界

今のコロナ騒ぎで思うことを駄文で長文ですが、書きます。

 

武漢肺炎の影響で、学校が閉鎖され、卒業式が縮小され、テーマパークは閉鎖され、人が集まるイベントは自粛し、人々はテレワークを始め、株価は大きく下がり、先行きの見えない不安と世界恐慌とまで噂されるようになってきています。

給食代をどうするとか、キャンセル料は返さないとか、労働者に国から何円の補助をするとか、はたまた非正規労働者には貸し出しをするとか、とにかく入るはずのお金がなくなって、みんな経済規模が小さくなって困っているのは事実です。ドイツ銀行が何かの債務でデフォルトしたとかよくわからないニュースもありますし、お金がないのでしょう。

 

しかし、悪いことばかりではないように思えます。

まず、企業活動が停滞することによってエネルギーの消費が抑えられ、CO2の排出が抑えられているはずです。いままでどんな合意でも達成できなかった水準をクリアしてしまうかもしれません。こういう「外力」がないと人間は行動を変えないものです。結果は1年くらいで出るでしょう。

それから、みんなお金が入らなくなって食料が買えなくなるというかもしれませんが、食料は生産されています。たとえ経済が破綻しても太陽と水と肥料があれば植物は育ちます。経済が破綻したら流通が滞るかもしれませんが、スーパーの店頭になければ、農家と直接取引すればいい。みんなが同じことをやれば、取引を代わりに行う業者が出てきて何とかなるでしょう。輸入が難しくなれば日本は本気を出すでしょう。

仕事がなくなって給料が入らなくなるかもしれないけど、2020年の現時点で実は日銀だけが唯一の発券銀行ではなくなってきています。SUICAをはじめ企業発行のポイントが通貨の代わりになってきています。メルカリで物を売ってメルカリのポイントを稼ぎ、メルカリで何かを買えば、日銀券を介さずに物を交換できる。今では民家企業が通貨のようなものを発行していて、相対的に国家の管理する通貨の役割が減っていると言わざるを得ません。

日銀券の額面でやりとりすれば消費税がかかるけれども、金額以外の価値で物や役務を交換すれば、どうなるかわからない。仕事の評価を金額でするのではなく感謝やその人でなければできない金額以外の評価で行えば、通貨的な価値はゼロとなって、消費税はかからない。田舎で農作物を交換したり引っ越しや家の修理の手伝いをするのと同じような感覚で。それがポイントや通貨といった数値に変換されるかは別として。これ以上消費税が上がるのであれば、そういうやり取りが増えてくるのではないだろうか。

何がいいたいのかわからないかもしれないけど、お金という量で計るのではなく、金額に換算できない何か別のもので物やサービスの交換が行われるようになるのかもしれない。「社会に役立つこういうことやりたい」とか「ありがとう」とか「勇気づけられた」みたいな、金額に換算できない漠然とした量によって、お金がなくても何とか生きていける世界が来るのかもしれない。

まぁ、いきなり通貨が無くなるのではなく、通貨と、企業ポイントと、漠然とした感謝という3つが併存した世の中になるのだろうな。しばらくは。

 

話を戻して、無駄な出勤や会議がなくなったので、コロナ騒ぎが治まったとしてもこの流れは元に戻らないかもしれません。人が一同に会することが無駄だという認識が広まれば、テレワークやビデオ会議は恒久的なものになるでしょう。何百年後かに人が宇宙に散らばっていったときに会議のために集まるわけにはいかないわけですから、今の流れは人類の進化からすれば正しいのでしょう。

社会が本質的に変わり始めているのに、元の世界に戻そうとして、経済ガーとか、株価ガーとか、安倍ガーと嘆いていると、確実に取り残されます。もう、社会は元にもどりません。

 

ただし、どんなに社会が進んでも、技術が進んでも、人が人とコミュニケーションをしたいという欲求は変わりません。その手段が変わるだけです。手紙から電話、携帯、スマホ、LINE・・、とコミュニケーションの手段は進化してきました。コロナ社会に対応した新しいコミュニケーションの手段がいずれ登場するかもしれませんね。

今までのものが一気になくなるのではなく、重層的に世の中は徐々に変わっていくはずです。

  • 現在の状況は、人類の新しい進化ととらえるべき
  • 通貨や企業ポイントの代わりになる、あたらしい交換価値が出てくる
  • テレワークは恒久化する
  • コミュニケーションは人間の根源的な欲求

これらのことを念頭においておけば、新しい時代のビジネスで飛躍的に伸びるでしょう。

今の私にはゆっくり考える時間がなく、新しい時代のビジネスは思いつきませんが、人類が電気を使う限り何とか食べてはいける自信はあります。

| | コメント (0)

2020.03.10

MPSSE-JTAGを理解する

FTDI社のFT2232シリーズにはMPSSEという、汎用のUSBマルチプロトコルシリアル変換機能が搭載されています。MPSSEはもともとJTAG専用というわけではなく、SPI、I2Cなどで汎用のシリアル変換チップを作るためのもののようです。

今日はそのMPSSEの機能について調べてみました。

 

まずMPSSEを使うことができるデバイスは、FT2232D、FT2232H、FT232H、FT4232Hです。この中でFT2232D以外はHighSpeed対応です。

ここではFT2232Hを例に説明していきます。

FT2232Hを使う場合、TCK=bit0、TDI=bit1、TMS=bit2、TDO=bit3になります。FT2232HにはChannelAとChannelBがありますが、どちらを使うこともできます。ADBUSのbit4~bit7、ACBUSに属するbit8~bit15はGPIOにすることも可能です。TCKクロックの速度は60MHz÷分周比となりますが、分周比は2,4,6,8・・なので、30MHz、15MHz、10MHz、7.5MHz・・・への設定が可能です。

読むべきアプリケーションノートはAN108とAN129です。

https://www.ftdichip.com/Support/Documents/AppNotes/AN_108_Command_Processor_for_MPSSE_and_MCU_Host_Bus_Emulation_Modes.pdf

https://www.ftdichip.com/Support/Documents/AppNotes/AN_129_FTDI_Hi_Speed_USB_To_JTAG_Example.pdf

AN129にはMPSSEを使うJTAGのサンプルプログラムが載っていて、AN108にはMPSSEのコマンドの解説が載っています。

MPSSEは、OUT FIFOに入っているコマンドを順番に実行し、結果をIN FIFOに入れていきます。そのコマンドは<コマンドコード>[<長さ>][<データ>]の形式で、FT2232Hはそれを解釈して実行していきます。

そのコマンドの説明がAN108に書かれています。

AN129には実際の手順が書かれています。まず以下のようにしてFT2232Hを初期化してMPSSEモードに入れます。

FT_Open(0, &ftHandle); // 0は最初に見つかったデバイス。FT2232HのChannelAが使われる。
FT_ResetDevice(ftHandle);
// 受信バッファのサイズを取得し残っている残っているデータを受信
FT_GetQueueStatus(ftHandle, &dwNumBytesToRead);
FT_Read(ftHandle, &byInputBuffer, dwNumBytesToRead, &dwNumBytesRead);// 受信バッファを最大値に
FT_SetUSBParameters(ftHandle, 65536, 65535);// イベントが発生しないようにする
FT_SetChars(ftHandle, false, 0, false, 0);
FT_SetTimeouts(ftHandle, 0, 5000);
FT_SetLatencyTimer(ftHandle, 16);
FT_SetBitMode(ftHandle, 0x0, 0x00);
FT_SetBitMode(ftHandle, 0x0, 0x02); // ここでMPSSEモードに切り替わる
Sleep(50);

ここまでがFT2232HのUSB機能自体の初期化です。

そうしたら次にMPSSEコマンドを与えて、JTAG機能の初期化を行うのですが、最初に0xAAという未定義のコマンドを与えてわざとエラーを起こさせます。するとFA AAというレスポンスが返るので、これを利用して受信バッファの同期を取ります。

次に、

  • 0x8A:60MHzクロックを使う。FT2232Dは12MHzなので
  • 0x97:アダプティブクロックを無効にする。ARMのデバッグはRTCKを使うが、ここでは使わない
  • 0x8D:3phaseクロックを無効にする
  • 0x80 0x08 0x0b:LowByteを TMS=1 TDO=IN TDI=0 TCK=0にする
  • 0x82 0x00 0x00:HighByteをINにする
  • 0x86 分周比 分周比:クロック速度の設定
  • 0x85:ループバックをディゼーブルにする

と、非常に様々なオプションを初期設定します。

いよいよJTAGのTDIやTMSにパターンを出力していくわけなのですが、MPSSEにはTMSの与え方だけで6種類、TDIの与え方で12種類ものコマンドがあります。クロックの立下り or 立ち上がりでデータを有効にするとか、データを入力するかとか、長さをByteで与えるかbitにするかとかがあります。

原理的には0x00~0x7fまでの128種類のコマンドがあるのですが、AN_129で実際に使われているのは

  • 0x4B・・TMS操作。TDOは入力しない。
  • 0x3B・・TDI/TDO入出力。長さはbit単位。クロックの立下りでTDI出力し、クロックの立ち上がりでTDO入力。
  • 0x6B・・TMS操作。TDOは入力する。
  • 0x8F・・データなしでひたすらクロックを与える

の4種類のみでした。

このほか、実際のJTAGツールを作るには

  • 0x39・・TDI/TDO入出力。長さはbyte単位。クロックの立下りでTDI出力し、クロックの立ち上がりでTDO入力。

も必要でしょう。0x3Bコマンドは8bitまでのシフトしかできないのでいささか効率が悪いようです。

JTAGの操作では、Shift_DRやShift_IRの最後でTMSを上げるという操作が必要になるのですが、MPSSEにはそういうコマンドはありません。そのため8bitのレジスタシフトであれば、7bitの0x3Bコマンドと1bitの0x6Bコマンドに分けなければなりません。そこが面倒なとろです。

0x4Bコマンドと0x6Bコマンドでは、bit7がTDIから出力され、bit[6:0]がTMSから出力されるので、データシフトの最後の1bitは0x6Bコマンドを使って出すというわけです。

これらのコマンドを駆使してデータ出力するのですが、例えば35bitのデータシフトをしたいのであれば、「0x39コマンドで4バイトを出し、0x3bコマンドで2bitを出し、0x6bコマンドで1bitを出しながらTMSを上げる」というふうに分解する必要が出てきます。面倒ですね。

  

そのほかいろいろ分かったことは、

  • DigilentのUSB-JTAGは、MPSSEでもアクセスできる
  • MPSSEコマンドとMPSSEコマンドの間は200nsくらい空く
  • 0x3bコマンドは8bitまでしか送れない
  • 0x39コマンドでバイト単位で送っても8bitごとに50nsくらい空く
  • 3Bコマンド(TDO受信あり)も1Bコマンド(TDO受信なし)も速度は変わらない
  • 受信したデータはMSBから詰まっていく。そのデータはコマンドごとにクリアされないので、TMSのときの7bit+1bitのように最後のデータを受信する場合には自然につながる(最後から2番目のバイトは捨てる)

これでMPSSEを使ったJTAGケーブルが作れそうですね。

ただ、これだけでは力不足です。XILINXのXVCプロトコルはTMSやTDIといった役割を無視した単純なGPIOを期待したものなので、TMSやTDIをそのまま出せるようでなければなりません。0x80によるポート出力と0x81によるポート入力で単純にカチカチやってみると、TCK=1.6MHzくらいとなりました。

遅いけれどもXVC対応のケーブルも作れるでしょう。

 

| | コメント (0)

2020.03.09

GOWINのGW1NR_9をバウンダリスキャンすることができた

以前、GOWINに連絡して代理店経由でGW1NR_9のBSDLファイルをもらったのですが、実際にスキャンしようとすると、ステータスレジスタの値が違うというエラーが出てバウンダリスキャンが出来ませんでした。

ついに問題が解決して正常にバウンダリスキャンができました。

Gowin_gw1nr9_bscan

原因は、GW1NR_9で実際にキャプチャされたステータスは0x11なのに、BSDLファイルの中に書かれていたINSTRUCTION_CAPTUREが、

attribute INSTRUCTION_CAPTURE of GW1NR_9_XXqfn88 : entity is "00011X01";

となっていたことでした。

これを

attribute INSTRUCTION_CAPTURE of GW1NR_9_XXqfn88 : entity is "0001XX01";

に書き換えたところ、うまくスキャンできるようになったというわけです。

上の画面は、実機としてTrenzElectronic社のTEC0117-01を使って、オンボードのFT2232をUSB-JTAG化してスキャンしています。

Gowin_jtag

バウンダリスキャンができたので気を良くして、さらにMITOUJTAG ProのJTAGスクリプト機能を使ってLEDを点滅させてみます。

 

まず、default.pinという名前でピン定義ファイルを作ります。

LED 86 85 84 83 82 81 80 79
USER_BTN 77

それから、以下のスクリプトを書きます。

#include "default.h"
JEXPORT int jmain() {
j_bypass();
j_extest(); // AJFGで端子を操作するにはこの行を有効にしてください
int i = 1;
while(1) {
LED <= i;
if((int)USER_BTN == 0) i = (i << 1) | ((i & 0x80) ? 1 : 0);
else i = (i >> 1) | ((i & 0x1) ? 0x80 : 0);
Sleep(100);
}
j_bypass();
return 0;
}

これで実行すると、LEDの点灯している箇所が流れていって、ボタンを押している間だけ逆回転するというLED流星が流れます。

Gowin_mitoujtag_pro

GOWINのFPGAの論理合成をして動かしているのではなく、バウンダリスキャンでI/Oを乗っ取って、パソコンからGPIOのようにして動かしていることにご注目ください。

私はGOWINの論理合成ツールをダウンロードしていないので開発は全くできないのですが、I/Oだけならバウンダリスキャンを使ってこのように動かすことができます。

| | コメント (0)

2020.03.07

XILINXのJTAGケーブル拡張を調査(1)

DigilentのJTAGケーブルがどのようにしてVivadoに認識されるのか、自分のJTAGケーブルをVivadoに認識させることができるか、ということを調べています。

VivadoでDigilent(互換)ケーブルを接続すると、xilinx_tcf/Digilent/シリアル番号という形で表示されます。

Xilinx_tcf

このことから想像できるのは、うまくプラグインを作ってやれば、xilinx_tcf/自社名/シリアル番号みたいなJTAGケーブルが作れるのではないかという期待です。

VivadoはOpenHardwareManagerを行う際に、LocalServer以外にRemoteServerを選ぶことができ、このときのポート番号は3121と表示されています。

Local3121

図にすると、

Hwserver_layer

となります。

WireSharkを使ってローカルポートへの3121の通信をキャプチャしてみると、

Capture3121

どんなパケットが流れているかを追ってみると、

① Vivado→hw_server

LocatorHello["ZeroCopy"]

② hw_server→Vivado

LocatorHello["ZeroCopy","Dpc","MicroPython","JtagFpga","ContextXvc","DebugCorePolling","DebugCore","XicomEverest","svf","XicomSysmon","zynqflash","XicomFlash","bpi","spi","xsdb","Xicom_v1.00","Xicom_v1.01","xicom_0","Xicom","XilinxReset","JtagDevice","JtagCable","Jtag","ContextParams","Diagnostics","Profiler","Disassembly","DPrintf","PathMap","Streams","Expressions","FileSystem","LineNumbers","SymbolsProxyV2","SymbolsProxyV1","Symbols","StackTrace","Registers","MemoryMap","Memory","Breakpoints","RunControl","ContextReset","ContextQuery","Locator"]

③ Vivado→hw_server

JtagCablegetServerDescriptions

④ hw_server→Vivado

Xicom_v1.00numChannelsUpdated"arg_0"![["clients_connected","int",1]]EJtagCableserverAdded[{"ID":"jss7","ServerID":"digilent-ftdi","isActive":true}]EJtagCableserverAdded[{"ID":"jss8","ServerID":"xilinx-ftdi","isActive":true}]EJtagCableserverAdded[{"ID":"jss9","ServerID":"digilent-djtg","isActive":true}]EJtagCableserverAdded[{"ID":"jss10","ServerID":"xilinx-pcusb","isActive":true}]EJtagCableserverAdded[{"ID":"jss11","ServerID":"bscan-jtag","isActive":true}]EJtagcontextAdded[{"ID":"jsn-JTAG-ONB4-251633059800A","Name":"whole scan chain","idCode":255,"idCode2":0,"irLen":0,"isTap":true}]EXicom_v1.00contextAdded"jsn-JTAG-ONB4-251633059800A""arg_0"[["server_id","string","jss7"],["manufacturer","string","Digilent"],["product_id","string","JTAG-ONB4"],["serial","string","251633059800A"],["port_description","string","JTAG-ONB4"],["port_is_active","bool",true],["port_is_initializing","bool",false],["port_is_error","bool",false],["esn","string","Digilent/251633059800A/"],["name","string","whole scan chain"],["idcode","int",255],["irlen","int",0],["is_tap","bool",true],["is_mux","bool",false],["is_branch","bool",false],["is_active","bool",false]]EJtagCablecontextAdded[{"ID":"jsn-JTAG-ONB4-251633059800A","ServerID":"jss7","Manufacturer":"Digilent","ProductID":"JTAG-ONB4","Serial":"251633059800A","Description":"JTAG-ONB4","isActive":true}]EJtagcontextChanged[{"ID":"jsn-JTAG-ONB4-251633059800A","Name":"whole scan chain","idCode":255,"idCode2":0,"irLen":0,"isTap":true}]EXicom_v1.00contextChanged"jsn-JTAG-ONB4-251633059800A"?"arg_0"[["name","string","whole scan chain"],["idcode","int",255],["irlen","int",0],["is_tap","bool",true],["is_mux","bool",false],["is_branch","bool",false],["is_active","bool",false]]EJtagcontextAdded[{"ID":"jsn-JTAG-ONB4-251633059800A-0362f093-0","ParentID":"jsn-JTAG-ONB4-251633059800A","Name":"xc7s50","idCode":56815763,"idCode2":0,"irLen":6,"isTap":true,"isActive":true}]EXicom_v1.00contextAdded"jsn-JTAG-ONB4-251633059800A-0362f093-0""arg_0"[["mask","int",268435455],["irlen","int",6],["name","string","xc7s50"],["reg.bypass","int",63],["reg.idcode","int",9],["irlen_detect_off","int",0],["frame_count","int",5420],["debug_node_id","int",0],["arch_name","string","spartan7"],["is_sysmon_supported","int",1],["is_program_supported","int",1],["is_programmable","int",1],["is_cfgmem_supported","int",1],["is_xicom_program_supported","int",1],["is_config_register_supported","int",1],["is_bitstream_reader_supported","int",1],["is_svf_supported","int",1],["is_efuse_writeable","int",1],["is_efuse_readable","int",1],["is_pdi_program_supported","int",0],["is_axi_debug_supported","int",0],["reg.family","int",70],["reg.slr_count","int",1],["reg.xadc_drp_slr0","int",55],["reg.user_count","int",4],["reg.usercode","int",8],["reg.user1","int",2],["reg.user2","int",3],["reg.user3","int",34],["reg.user4","int",35],["reg.cfg_in_slr0","int",5],["reg.cfg_out_slr0","int",4],["reg.jprogram","int",11],["reg.jstart","int",12],["reg.jshutdown","int",13],["reg.fuse_cts_slr0","int",48],["reg.fuse_key_slr0","int",49],["reg.fuse_dna_slr0","int",50],["reg.fuse_user_slr0","int",51],["reg.fuse_cntl_slr0","int",52],["reg.isc_dna","int",23],["reg.isc_program_key","int",18],["reg.isc_disable","int",22],["reg.isc_enable","int",16],["reg.isc_program_slr0","int",17],["reg.isc_noop","int",20],["reg.isc_read_slr0","int",21],["reg.jstart_delay","int",100],["reg.has_dap","int",0],["reg.wpf","int",101],["reg.fdr_pipe_depth","int",0],["reg.boot_check","int",53],["reg.boot_check_mask","int",63],["reg.init_done_check","int",17],["reg.init_done_check_mask","int",49],["reg.prog_done_check","int",49],["reg.prog_done_check_mask","int",49],["server_id","string","jss7"],["manufacturer","string","Digilent"],["product_id","string","JTAG-ONB4"],["serial","string","251633059800A"],["port_description","string","JTAG-ONB4"],["port_is_active","bool",true],["port_is_initializing","bool",false],["port_is_error","bool",false],["esn","string","Digilent/251633059800A/"],["parent_id","string","jsn-JTAG-ONB4-251633059800A"],["version","int",0],["idcode","int",56815763],["is_tap","bool",true],["is_mux","bool",false],["is_branch","bool",false],["is_active","bool",true]]EJtagcontextChanged[{"ID":"jsn-JTAG-ONB4-251633059800A","Name":"whole scan chain","idCode":255,"idCode2":0,"irLen":0,"isTap":true,"isActive":true}]EXicom_v1.00contextChanged"jsn-JTAG-ONB4-251633059800A"≫"arg_0"[["name","string","whole scan chain"],["idcode","int",255],["irlen","int",0],["is_tap","bool",true],["is_mux","bool",false],["is_branch","bool",false],["is_active","bool",true]]ERunControlcontextAdded[{"ID":"JTAG-jsn-JTAG-ONB4-251633059800A-0362f093-0","ProcessID":"JTAG-jsn-JTAG-ONB4-251633059800A-0362f093-0","Name":"xc7s50","CanSuspend":true,"CanResume":1,"CanCount":0,"IsContainer":true,"WordSize":8,"RCGroup":"JTAG-jsn-JTAG-ONB4-251633059800A-0362f093-0","SymbolsGroup":"JTAG-jsn-JTAG-ONB4-251633059800A-0362f093-0","CPUGroup":"JTAG-jsn-JTAG-ONB4-251633059800A-0362f093-0","JtagDeviceID":56815763,"JtagNodeID":"jsn-JTAG-ONB4-251633059800A-0362f093-0","JtagGroup":"JTAG-jsn-JTAG-ONB4-251633059800A-0362f093-0"}]

⑤ hw_server→Vivado

[{"ServerID":"digilent-ftdi"},{"ServerID":"xilinx-ftdi"},{"ServerID":"digilent-djtg"},{"ServerID":"xilinx-pcusb"},{"ServerID":"xilinx-xvc","ParamNames":["host","port"]},{"ServerID":"xilinx-null","ParamNames":["name"]},{"ServerID":"bscan-jtag"}]

⑥ Vivado→hw_server

JtagCableopenServer"digilent-ftdi"{}

⑦ hw_server→Vivado

JtagCableserverAdded[{"ID":"jss7","ServerID":"digilent-ftdi","isActive":true}]R2"jss7"

⑥ Vivado→hw_server

[{"ID":"jsn-JTAG-ONB4-251633059800A","ServerID":"jss7","NodeID":"jsn-JTAG-ONB4-251633059800A","Manufacturer":"Digilent","ProductID":"JTAG-ONB4","Serial":"251633059800A","Description":"JTAG-ONB4","isActive":true}]

このようにケーブルの一覧を要求して、どのケーブルを使用するかを選ぶというプロトコルが行われていました。

当初は自分でポート3121のプロトコルを喋るサーバを作ればよいのかと思いましたが、この期待は容易に打ち砕かれました。まず、プロトコルはバイナリで、内容は謎です。

次の図はXADCで温度をモニタしているときのパケットですが、30~37あたりの値がやたらと多いのですが意味はわかりません。JTAGの波形を表すバイナリなプロトコルなのでしょうか。

Xadc

このように実際のJTAGケーブルの操作方法が全くわかりません。hw_server.exeがSysmonプロトコルを全部やってVivadoは高レベルの指示を出しているだけかもしれません。

また、④のステップでDigilentケーブルの情報をhw_serverがVivadoに送っているということは、hw_serverはDigilentケーブルの扱い方を知っていて、各種ケーブルの扱いはポート3121のプロトコルよりも下のレイヤーで行われているのです。

自作のJTAGケーブルをVivadoに認識させるのは、27Mバイトもあるhw_serverと同じレベルのソフトを作らなければならず、それはリバースエンジニアリングで軽く作るのは不可能でしょう。

 

他の方法としては、XVCを使う方法や、XSDKからはTCFという言葉も出てくるし、vcse_serverというのも出てきます。

  • TCF:Target Communication Frameworkで、おそらくEclipseの拡張プロトコルなのだと思います。XSDKから接続する際に使うようです。おそらくUDPのポート1534を使っています。
  • CSE:ChipScope Engineの略で、おそらくChipScopeから発展してVIOなど様々なプロトコルに対応していったのだと思います。ISEの14のどこかで大幅にプロトコルが変わりました。Vivadoではさらに変わっているものと思われますし、使用しているかどうかもわかりません。
  • VCSE:Vivado版のCSEだと思われます。これを起動するとTCPポート3000~3003(各種CPUに対応)、3142などがListenになります。
  • XVC:Xilinx Virtual Cableです。プロトコルが公開されていますが、1/0のビット列をそのまま送る低レベルなやつで、面白味はありません。ポート番号はTCPの2542です。

libCseTcfPlugin.dllというのもあるのですが、このあたりの関係はよくわかりません。

想像図です。

Tcfcse  

 

hw_server.exeをダンプしてみると、DigilentのUSB-JTAG(Adept)で使われる関数の名前を見つけました。

Djtag_found

このDjtgで始まる関数群がそれです。

つまり、hw_server.exeはDigilentのUSB-JTAGライブラリであるAdeptを呼び出しています。自作のUSB-JTAGをVivadoにネイティブに認識させるには、hw_serverに組み込んでもらうしかないのですが、それは不可能でしょう。

 

よく見ると、FT_で始まる関数も登録されているので、FTD2xxを使うUSB-JTAGならばFTDIのチップとして認識することができるかもしれません。次はこの線で解析をしていこうと思います。

 

| | コメント (0)

2020.03.06

TE0790のピン配置と使い方

TrenzElectronic社からTE0790というUSB-JTAGモジュールが発売されています。

Te079002_1

TE0790はFT2232Hを使ったUSB-JTAGとUSB-UARTを備えた切手サイズのモジュールで、XILINXのVivadoからはDigilent互換のUSB-JTAGとして認識されます。TrenzElectronic社がDigilent社と提携しています。

FT2232Hの裏にはLatticeのCPLDがレベルバッファ用に載っていて、実はすごい実装密度なのです。

 

TE0790にはTE0790-02やTE0790-03Lなどいくつかの型番がありますが、02と03は基本的には基板のバージョンの違いなので大きな差はありません。現在では02版は絶版になっているので入手可能なのは03のみです。

したがって、TE0790-03かTE0790-03Lかを選ぶことになりますが、Lが付く方は少しだけ価格は安い分、Digilent互換ではないので、Vivadoから認識されません。

XILINXユーザであればTE0790-03以外の選択肢はないと言えるでしょう。

 

さて使い方ですが、この12ピンのコネクタは2.54mmピッチでXILINXの14pin JTAGとの互換性はありません。

ピン配置は下の図のようになっています。

Te0790pinouttop_20200307113301

実際には裏返して使うことになるので、裏面のピン配置のほうが重要かもしれません。

Te0790pinoutbot

裏面にはDIPスイッチやLEDがいろいろついています。

Te0790pinoutledsw

UART RX、UART TXはUARTの通信が行われたときに点灯します。ユーザLEDは、標準のCPLDファームウェアではプッシュスイッチが押されたときに点灯します。プッシュスイッチにもユーザLEDにも特に機能はありません。

DIPスイッチは、左から4,3,2,1という番号になっていて、下下上下にします。これでS2-4=ON、S2-3=ON、S2-2=OFF、S2-1=ONになります。

  • S2-1(↓)・・・ONならば通常モード(必須)。OFFならばCPLD書き換えモード。
  • S2-2(↑)・・・必ずOFFにすること(必須)
  • S2-3(↓)・・・ONならばUser I/O電源(VIO)を3.3Vに接続する。OFFならばVIOはピンヘッダから供給する。
  • S2-4(↓)・・・ONならばUSBバスパワーから3.3Vを給電する。OFFならば3.3Vはピンヘッダから供給する。

つまり、S2-3で、このUSB-JTAGのメインの3.3V電源をUSBから供給するかピンヘッダから供給するかを選びます。

S2-3をONにしているとピンヘッダの3.3VからターゲットFPGAボードへ電流が逆流するのでご注意ください。このボードの電源は300mAの容量しかないので、TE0790をUSB電源ボードとして利用するのは難しいでしょう。

VIOはI/O電源でJTAG信号やUARTの信号の電圧振幅ですが、S2-4でこれを3.3Vにするかユーザが設定するかを選びます。設定範囲は1.14V~3.6Vです。この選択ができるので、1.5Vの電源電圧対応ICのJTAGにも接続することができます。

 

当社のSpartan-7ボードと一緒に万能基板に乗せた場合のようすです。

Te0790usage

このように裏返して実装します。引っこ抜けるのが心配であればねじ穴を使って固定します。

実際に使っているときの写真を示します。

Te0790usage2

この設定ではメインのFPGA基板から3.3VをもらわずにUSBバスパワーで動作します。しかしVIOと3.3Vがつながっているので結果的には3.3Vは全部つながってしまうのですけどね。

なお、TCK速度は15.15MHz(66ns)でした。

Digilent互換なので、Vivadoからもつながります。

Te0790vivado

UARTもつないでいるので、MicroBlazeを入れたシステムなどでTeraTermを使ってprintfを表示できます。

Uart

 

最後に大事なことを。

TE0790は、FTDI社のプログラミングツールを使ってFT2232HのEEPROMにアクセスしてはいけません。もし、アクセスすると通常は見えない領域に書かれたXILINXのJTAGライセンスが消去されて無効になってしまうからです。このときFTDIのツールは警告を発しません。

TE0790-03は、日本の代理店から即納で購入できます。

下のURLにアクセスしてください。

https://www.trenz.jp/product/TE0790-03

 

 

| | コメント (0)

« 2020年2月 | トップページ | 2020年4月 »