FPGAを使用したシステム

Xilinx 社の AXI IIC IP で ADXL355 を使用する
Xilinx 社の AXI IIC IP を使用して、I2C インターフェースで、ストロベリーリナックスの ADXL355 超低ノイズ3軸加速度センサモジュール を ZYBO Z7-20 ボードに接続した。その際に AXI IIC IP の使い方に相当時間がかかってしまったのでブログに書いておく。
GPS と 3軸加速度センサーを使ったシステム1(GPS 受信の検討)
今度、お仕事で GPS と 3軸加速度センサーを使ったシステムを作ることになった。内容を公開してよいということなので、ブログに書いておく。GPSの受信方法の検討を行った。
GPS と 3軸加速度センサーを使ったシステム2(GPS 受信をしてみた)
前回は、3 軸加速度センサー+ GPS システムの検討をした。今回は 3 軸加速度センサーの Vivado プロジェクトに GPS のデータを受信する axi_uartlite IP を追加したプロジェクトを作って、GPS のデータを受信したが、まだ、外に持っていっていないので、ちゃんとしたデータは取れていない。
GPS と 3軸加速度センサーを使ったシステム3(GPS 受信をしてみた2)
前回は、 3 軸加速度センサーの Vivado プロジェクトに GPS のデータを受信する axi_uartlite IP を追加したプロジェクトを作って、GPS のデータを受信したが、まだ、外に持っていっていないので、ちゃんとしたデータは取れていなかった。今回は、外に持っていって、データを取得した。
GPS と 3軸加速度センサーを使ったシステム4(3軸加速度センサーのI2Cを3m伸ばした)
3 軸加速度センサーの I2C を 3m の LANケーブルを使用して伸ばした。ケーブル 使用時のオシロスコープ波形を載せている。
GPS と 3軸加速度センサーを使ったシステム5(Vivado 2020.1 のプロジェクトを作成中)
GPS と 3 軸加速度センサーを 4 個使ったシステムを作成している。今回は、Vivado 2020.1 の acc_gps_sensor_mb プロジェクトを作成した。これは、MicroBlaze が 5 個と、Zynq の PS の ARM Cortex-A9 を使用したシステムだ。
GPS と 3軸加速度センサーを使ったシステム6(Vitis でアプリケーション・ソフトウェアを作成)
前回は、GPS と 3 軸加速度センサーを 4 個使ったシステムの Vivado 2020.1 プロジェクトを紹介した。 GPS と 4 個の 3 軸加速度センサーそれぞれに MicroBlaze プロセッサを実装して、合計 5 個の MicroBlaze プロセッサと Zynq PS プロセッサが実装される回路になった。今回は、このシステムのアプリケーション・ソフトウェアを Vitis 2020.1 で作成したので、紹介する。
GPS と 3軸加速度センサーを使ったシステム7(ユニバーサル基板で実験
前回は、GPS と 3 軸加速度センサーを 4 個使ったシステムのアプリケーション・ソフトウェアを Vitis 2020.1 で作成した。今回は、ユニバーサル基板で ZYBO Z7-20 に接続する親基板と 3 軸加速度センサー基板、GPS 基板を作成した。
GPS と 3軸加速度センサーを使ったシステム8(LAN ケーブルを 5m, 7m, 10m に伸ばした)
今回は、3 軸加速度センサーと GPS が LAN ケーブルで親基板に接続されているのだが、その LAN ケーブルをどれだけ伸ばせるか? やってみた。

Watchdog timer を Vitis HLS 2020.1 で実装する1(Vitis HLS 2020.1)
”GPS と 3軸加速度センサーを使ったシステム5(Vivado 2020.1 のプロジェクトを作成中)”(現在は、3軸加速度センサーが 9 個付くようになっている)に Watchdog Timer を実装することにした。そこで、Vitis HLS 2020.1 で Watchdog Timer を作成することにした。
Watchdog timer を Vitis HLS 2020.1 で実装する2(Vivado 2020.1)
Vitis HLS 2020.1 で Watchdog Timer を作成することにしたということで、前回は、Vitis HLS 2020.1 でウォッチドックタイマの Verilog HDL コード(WDTimer.v)を合成した。今回は、Vivado 2020.1 を使用して、 WDTimer.v のシミュレーションを行う。
Watchdog timer を Vitis HLS 2020.1 で実装する3(デバック修正)
前回は、Vivado 2020.1 を使用して、 WDTimer.v のシミュレーションを行って、Vitis HLS で Export RTL を行って、IP 化した。今回は、実機で確認したところ、3軸加速度センサーの表示が出てこなかった。たぶん、リセットが解除されてから、初期化設定があるはずだが、そこに時間がかかっ て、3軸加速度センサーの操作用アプリケーション・ソフトウェアまで 5 ms 以内に到達していないのではないか?と思う。そこで、WDTimer.cpp に enable 引数を追加して、 enable が 1 になってから WDTimer がスタートするように変更する。

acc_sensor に WDTimer を実装する
”Xilinx 社の AXI IIC IP で ADXL355 を使用する”で作った ADXL355 (3軸加速度センサー)の I2C の回路に”Watchdog timer を Vitis HLS 2020.1 で実装する3(デバック修正)”の WDTimer を実装する。

GPS と 3軸加速度センサーを使ったシステム9(基板の作成)
今回は、去年の 12 月半ばに KiCad で 3 種類の基板を設計した。
1. 3 軸加速度センサーを搭載する基板
2. GPS センサーを搭載する基板
3. ZYBO Z7-20 の PMOD に接続するコネクタを持ち、 3 軸加速度センサー基板、GPS センサー基板を LAN ケーブルで接続するメイン基板
GPS と 3軸加速度センサーを使ったシステム10(部品実装)
前回は、3 種類の基板が届いたところまでだった。今回は、部品を実装して動作テストを行った。
3 軸加速度センサー基板 1 個と GPS 基板をメイン基板に LAN ケーブルで接続して行った動作テストは問題なかった。
今後は、 3 軸加速度センサー基板を 8 個作成して完全なシステムでの動作テストを行う。

調歩同期式シリアル通信の受信 IP (uart_rx)を Vitis HLS で作成する1
調歩同期方式シリアル通信の受信 IP を Vitis HLS で作成することにした。
Xilinx 社のUART IP として AXI Uartlite があるが、これはボーレートを自分で自由に決めることができない。
PIC マイコンで生成された調歩同期方式シリアル通信データをなるべく高速に受けたいというモチベーションがあるのだが、どうもいつも使っているボーレートにすることが難しいの で、任意にボーレートを決定したいためだ。今回は、500kbps のボーレートで通信したい。
今回は、96 MHz のクロックを使用して、それを 12 分周すると 8 MHz になって、ちょうど 500 kHz x 16 となる。つまり、12 分周 x 16 分周でやってみよう。
uart_rx のソースコード、テストベンチと Vitis HLS のプロジェクトを作成した。
調歩同期式シリアル通信の受信 IP (uart_rx)を Vitis HLS で作成する2
調歩同期方式シリアル通信の受信 IP を Vitis HLS で作成することにしたということで、前回は、ソースコードをブログに貼って、Vitis HLS 2020.2 の uart_rx プロジェクトを作成した。今回は、uart_rx プロジェクトで C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行って、uart_rx IP を作成しよう。
調歩同期式シリアル通信の受信 IP (uart_rx)を Vitis HLS で作成する3
前回は、uart_rx プロジェクトで C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行って、uart_rx IP を作成した。今回は、Vivado 2020.2 の uart_rx プロジェクトを作成し、合成された uart_rx の Verilog HDL ファイルをコピーし、SystemVerilog のテストベンチファイルを作成して、Vivado 上でシミュレーションしてみよう。

uart_rx を使用して 3 軸加速度センサー用のデータを作成する uart_rx_axi4ls IP の作成1
調歩同期方式シリアル通信の受信 IP を Vitis HLS で作成することにしたということで、前回は、Vivado 2020.2 の uart_rx プロジェクトを作成し、合成された uart_rx の Verilog HDL ファイルをコピーし、SystemVerilog のテストベンチファイルを作成して、Vivado 上でシミュレーションして、問題なく動作しそうだということが分かった。今度は、その uart_rx の後段で 3 軸加速度センサー用のデータを作成する IP である uart_rx_axi4ls IP を作成していこう。
uart_rx_axi4ls のソースコード、テストベンチと Vitis HLS のプロジェクトを作成した。
uart_rx を使用して 3 軸加速度センサー用のデータを作成する uart_rx_axi4ls IP の作成2
uart_rx の後段で 3 軸加速度センサー用のデータを作成する IP である uart_rx_axi4ls IP を作成していこうということで、前回は、ソースコードとテストベンチのコードを貼って、 Vitis HLS 2020.2 の uart_rx_axi4ls プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、 C/RTL 協調シミュレーション、Export RTL を行う。

uart_rx と uart_rx_axi4ls を連結してシミュレーションする1
3 軸加速度センサーの RS-422 インターフェースのデータを受けるために uart_rx とその後段の uart_rx_axi4ls を Vitis HLS で作ってきたが、それらを連結してシミュレーションしてみよう。
今回は、Vivado 2020.2 の uart_rx_axi4ls_top プロジェクトを作成し、 uart_rx IP と uart_rx_axi4ls IP を IP Catalog に追加した。そてひ、 uart_rx_axi4ls_top_tb.sv のソースコードを貼った。
uart_rx と uart_rx_axi4ls を連結してシミュレーションする2
前回は、Vivado 2020.2 の uart_rx_axi4ls_top プロジェクトを作成し、 uart_rx IP と uart_rx_axi4ls IP を IP Catalog に追加した。そてひ、 uart_rx_axi4ls_top_tb.sv のソースコードを貼った。今回は、Viado でブロックデザインを作成し、ラッパー Verilog HDL ファイルを生成して、論理シミュレーションを行う。

調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成する1
調歩同期式シリアル通信の受信 IP とその後の 3 軸加速度センサー・データの処理 IP を作成した。残りっている調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成しよう。
今回は、 uart_tx のソースコードとテストベンチ・コードを貼っておく。
調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成する2
調歩同期式シリアル通信の受信 IP とその後の 3 軸加速度センサー・データの処理 IP を作成した。今回は、調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成しようとうことで、前回は、uart_tx のソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の uart_tx プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行っていこう。
調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成する3
今回は、調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成しようということで、前回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。今回は、ブロックレベルのインターフェースを s_axilite にしてみようと思う。

非同期外部入力に xpm_cdc を使用する
これまで、uart_rx や uart_tx を作ってきたが、uart_rx の入力は自分の FPGA の内部クロックに同期していない信号となる。そこで、自分の内部クロックに同期させる必要があるわけだ。以前は、Synchronizer IP を自分で作っていたのだが、 ”Vivado 2020.2 の新機能1”で紹介したように、新たに xpm_cdc IP が追加されたので、使ってみよう。

uart_rx_axi4ls, uart_tx を使用した 3 軸加速度センサー・システム1
今まで実装してきた uart_rx, uart_rx_axi4ls, uart_tx を使用した 3 軸加速度センサー・システムを書いておこうと思う。
今回は、ノイズに弱い I2C ではなく、伝送線路に RS-422 を使用する。 uart_rx, uart_tx の信号は RS-422 変換 IC を通って、RS-422 に変換されて、LAN ケーブルを伝送する。
今回は、その 1 チャネル分の acc_gps_test プロジェクトを示す。なお、Vitis HLS 2020.2 のバグ?を回避するために、Ubuntu 18.04 LTS でツールを使用している。
uart_rx_axi4ls, uart_tx を使用した 3 軸加速度センサー・システム2
前回はテスト用に Vivado 2020.2 で acc_gps_test プロジェクトを作成し、uart_rx, uart_rx_axi4ls, uart_tx IP を使用したブロックデザインを作成し、論理合成、インプリメンテーション、ビットストリームの生成を行った。そして、ハードウェアをエクスポートし、Vivado 2020.2 を起動して、プラットフォームを作成できた。今回は、本番用の uart_rx_axi4ls, uart_tx を使用した 3 軸加速度センサー・システム acc_gps_rs422 プロジェクトをご紹介する。
uart_rx_axi4ls, uart_tx を使用した 3 軸加速度センサー・システム3
前回は、本番用の uart_rx_axi4ls, uart_tx を使用した 3 軸加速度センサー・システム acc_gps_rs422 プロジェクトを示した。今回は、Vitis のプロジェクトをプロジェクトを作成して、プラットフォームとアプリケーション・プロジェクトを作成した。

OpenCores.org の I2C controller core をシミュレーションする
clock stretching でクロックが伸びることがある I2C スレーブを使う予定があって、Xilinx 社の AXI IIC IP がクロック・ストレッチングをサポートしているか?を調べてみたところ、どうやらサポートしていないようなのだ。(”AXI IIC core clock stretching”参照)
clock stretching をサポートするフリーの I2C Master Core を探していたところ、OpenCores.org の I2C controller core を探し当てた。Wishbone インターフェースなのだが、使う際は AXI4 Lite インターフェースに変換すれば良いか?ということで Vivado 2020.2 でプロジェクトを作製して、シミュレーションを行った。素晴らしいことにシミュレーション用のテストベンチやモデルも用意されている。

AXI4 Master Bus Functional Model を修正した
”OpenCores.org の I2C controller core をシミュレーションする”で使用した OpenCores.org の I2C controller core を AXI4-Lite インターフェースに変更したのだが、その際に、AXI4-Lite Master BFM を使用した。
AXI4-Lite Master BFM は AXI4 Master BFM をオーバーロードしているということで、 AXI4 Master BFM も修正したので、ブログに書いておく。
AXI4-Lite Master Bus Functional Model を修正した
”OpenCores.org の I2C controller core をシミュレーションする”で使用した OpenCores.org の I2C controller core を AXI4-Lite インターフェースに変更したのだが、その際に、AXI4-Lite Master BFM を使用した。ということで、”AXI4 Master Bus Functional Model を修正した”を書いたが、その AXI4 Master BFM にかぶせる AXI4-Lite Master BFM で Read したデータを出力できるように変更した。

WishBone バスと AXI4-Lite インターフェースを変換する wb2axi4ls_conv.v とトップの i2cm_axi4ls.v
今回は、”OpenCores.org の I2C controller core をシミュレーションする”で使用した OpenCores.org の I2C controller core を AXI4-Lite インターフェースに変更するための wb2axi4ls_conv.v とトップの i2cm_axi4ls.v を紹介する。

AXI4-Lite インターフェースの I2C Master Core をシミュレーションする
”OpenCores.org の I2C controller core をシミュレーションする”で、OpenCores.org の WishBone バスの I2C controller core をシミュレーションしたが、これを Xilinx の Zynq で使用するために AXI4-Lite インターフェースで使用したいと思いった。
そこで、”AXI4 Master Bus Functional Model を修正した”と”AXI4-Lite Master Bus Functional Model を修正した”で AXI4-Lite の Master の BFM を用意した。
”WishBone バスと AXI4-Lite インターフェースを変換する wb2axi4ls_conv.v とトップの i2cm_axi4ls.v”で、WishBone バスと AXI4-Lite インターフェースを変換する wb2axi4ls_conv.v とトップの i2cm_axi4ls.v を用意した。
AXI4-Lite インターフェースの I2C Master Core をシミュレーションしてみよう。

AXI4-Lite インターフェースの I2C Master Core を IP にする
”OpenCores.org の I2C controller core をシミュレーションする”で、OpenCores.org の WishBone バスの I2C controller core をシミュレーションしたが、これを Xilinx の Zynq で使用するために AXI4-Lite インターフェースで使用したいと思ったということで、前回は AXI4-Lite インターフェース版の I2C Master Core をシミュレーションを行ったが、問題無さそうだった。今回は、IP にしてみよう。


AXI4-Lite インターフェースの I2C Master Core を使用して 3 軸加速度度センサーの値を収集する1
”AXI4-Lite インターフェースの I2C Master Core を IP にする”で作成した AXI4-Lite インターフェースの I2C Master Core IP を使用して、ストロベリーリナックスの ADXL355 超低ノイズ3軸加速度センサモジュールのデータを I2C で収集してみよう。
AXI4-Lite インターフェースの I2C Master Core を使用して 3 軸加速度度センサーの値を収集する2
前回は、Vivado 2020.2 でプロジェクトを作成し、i2cm_axi4ls IP を使ってブロックデザインを作成し、論理合成、インプリメンテーション、ビットストリームを生成して成功した。そして、ハードウェアをエクスポートした。今回 は、Vitis 2020.2 を立ち上げて、プラットフォームとアプリケーション・ソフトウェアを作成して、ZYBO Z7-20 とストロベリーリナックスの ADXL355 超低ノイズ3軸加速度センサモジュールで試してみたところ成功した。
AXI4-Lite インターフェースの I2C Master Core を使用して 3 軸加速度度センサーの値を収集する3
前回は、クロック・ストレッチング付きの i2cm_axi4ls IP を使った回路で、3軸加速度センサーのデータを受け取ることができた。今回は、ストロベリーリナックスさんの”LTC4331 絶縁型I2C延長モジュール(2個セット) ”を使って、I2C を 15m 延長する。

AXI4-Lite インターフェースの I2C Master Core を使用して 3 軸加速度度センサーの値を収集する4(NMJ2884U1を使用してスレーブ側の電源をON/OFFする)
ストロベリーリナックスさんの”LTC4331 絶縁型I2C延長モジュール(2個セット) ”のスレーブ側に付けるストロベリーリナックスさんの”ADXL355 超低ノイズ3軸加速度センサモジュール”は同じ値をずっと出力して、リセットが効かないことがある。そこで、秋月電子の低飽和型レギュレーター 3.3V500mA NJM2884U1-33 を使用して、スレーブ側の電源を GPIO で ON/OFF できるようにした。

新しく 3 軸加速度センサー基板を作成する(2021/07/01)
前回、ストロベリーリナックスさんの”LTC4331 絶縁型I2C延長モジュール(2個セット) ”のスレーブ側に付けるストロベリーリナックスさんの”ADXL355 超低ノイズ3軸加速度センサモジュール”は同じ値をずっと出力して、リセットが効かないことがある。そこで、秋月電子の低飽和型レギュレーター 3.3V500mA NJM2884U1-33 を使用して、スレーブ側の電源を GPIO で ON/OFF できるようにした。今回は、その 3 軸加速度センサーの基板を作成した。
3 軸加速度センサーのメイン基板(2021/07/02)
ストロベリーリナックスさんの”LTC4331 絶縁型I2C延長モジュール(2個セット) ”のスレーブ側に付けるストロベリーリナックスさんの”ADXL355 超低ノイズ3軸加速度センサモジュール”は同じ値をずっと出力して、リセットが効かないことがある。そこで、秋月電子の低飽和型レギュレーター 3.3V500mA NJM2884U1-33 を使用して、スレーブ側の電源を GPIO で ON/OFF できるようにした。前回は、その 3 軸加速度センサーの基板を作成した。今回は、 3 軸加速度センサーの基板からの I2C 信号を受けて、ZYBO Z7-20 に接続するメイン基板を作成した。

3 軸加速度センサーのメイン基板と 3 軸加速度センサー基板に部品を搭載した
前回は、 3 軸加速度センサーの基板からの I2C 信号を受けて、ZYBO Z7-20 に接続するメイン基板を作成した。今回はその 3 軸加速度センサー基板と 3 軸加速度センサーのメイン基板に部品を搭載した。

ZYBO Z7 の Debian LInux からパソコンへ TCP/IP でデータを送る
ZYBO Z7-20 に ikwzm さんの FPGA-SoC-Linux を走らせているが、ZYBO Z7-20 の Debian Linux からパソコンに TCP/IP でデータを送信して、パソコンで受信したいということでやってみた。なお、パソコンは、Windows 10 の WSL2 上の Ubuntu 22.04 LTS を使用した。

ikwzm さんの Debian Linux 上で axi timer の割り込みを試す
axi timer の割り込みで axi gpio に接続された LED の点滅をすることで、Debian Linux 上での割り込みを試してみたい。
ikwzm さんの FPGA-SoC-Linux を ZYBO Z7-20 で起動して、その Debian Linux 上で axi timer と axi gpio の PL デザインを動作させて、axi timer の割り込みで LED を点滅させる。

ZYBO Z7 の Debian LInux からパソコンへ TCP/IP で 3.333 ms 毎にデータを送る
”ZYBO Z7 の Debian LInux からパソコンへ TCP/IP でデータを送る”と”ikwzm さんの Debian Linux 上で axi timer の割り込みを試す”を組み合わせて、ZYBO Z7 の Debian LInux からパソコンへ TCP/IP で 3.333 ms 毎にデータを送った。

ZYBO Z7-20 の Debian Linux で gettimeofday() と axi_timer の値を比べる
”ZYBO Z7 の Debian LInux からパソコンへ TCP/IP で 3.333 ms 毎にデータを送る”で、ZYBO Z7-20 の Debian Linux の gettimeofday() の精度はどのくらいなのだろう?ということで、axi_timer_0 の Timer2 をイネーブルして、axi timer の値と比較したところ、双方とも大きな違いは無かった。

MicroBlaze で axi timer の割り込みを使用する
ZYBO Z7-20 で MicroBlaze プロセッサを使用した axi timer の割り込みを試してみたので、ブログに書いておく。

ZYBO Z7-20 の Debian Linux で MicroBlaze プロセッサを使用する
ZYBO Z7-20 に ikwzm さんの FPGA-SoC-Linux を走らせているが、そこに PL に MicroBlaze プロセッサを使用したシステムを構築してみよう。PS は何もやらないので、ソフトウェアを実行する必要はないが、Zynq Processing System 7 のクロックを MicroBlaze が使用してる。

ZYBO Z7-20 の Debian Linux で MicroBlaze プロセッサを使用する際に MicroBlaze が動作しない時がある
”ZYBO Z7-20 の Debian Linux で MicroBlaze プロセッサを使用する”で、ハードコアの ARM Cortex-A9 と MicroBlaze プロセッサが連携で動作するハードウェアで ikwzm さんの Debian Linux 上で、dtbocfg.rb でハードウェアをロードしたときに MicroBlaze プロセッサが動作するのを確認できた。その際には、MicroBlaze プロセッサのアプリケーション・ソフトウェアは Vivado の Tools メニューから Associate ELF Files... を選択して elf ファイルを Block RAM の初期化データとして埋め込んである。

”L3GD20H使用3軸ジャイロセンサーモジュールキット”を使用する1(ジャイロセンサーの仕様を検討)
秋月電子の”L3GD20H使用3軸ジャイロセンサーモジュールキット”を ZYBO Z7-20 に接続して使用したいということで、今回は、”L3GD20H PDFデータシート”をざっと読んでみた。
”L3GD20H使用3軸ジャ イロセンサーモジュールキット”を使用する2(ジャイロセンサーを動作させる)
秋月電子の”L3GD20H使用3軸ジャイロセンサーモジュールキット”を ZYBO Z7-20 に接続して使用したいということで、前回は、”L3GD20H PDFデータシート”をざっと読んで仕様をまとめてみた。今回は、I2C IP の i2cm_axi4ls IP を使用して、”L3GD20H使用3軸ジャイロセンサーモジュールキット”を動作させることができた。


inserted by FC2 system