OSQZSS

オープンソース準天頂衛星(QZSS)受信機

fmcomms2_zedにAXI UART Liteを追加

2022-12-29 15:47:40 | SDR
PetalinuxへのAXI UART Liteの追加手順がZYBOで確認できたので、
同じようにZedBoard+AD-FMCOMMS3にも追加してみます。

ターゲットのHDLはすでにビルド済みなので、これをベースに改修していきます。

https://blog.goo.ne.jp/osqzss/e/160e3ff2c3de95c1b96d0855deea759d

projects/fmcomms2/zedのフォルダから、Vivadoのプロジェクトファイルをopenします。



Block Designを開き、AXI UART Liteを追加します。



PLからPSへのinterruptは、Concatというブロックを経由しています。
まずはすでにGNDに接続されているIn10[0:0]を右クリックし、"Disconnect Pin"でピンをリリースします。



その後、In10[0:0]をAXI UART Liteのinterruptに接続します。



次に、AXI InterconnectにM11_AXIを追加し、それをAXI UART LiteのS_AXIと接続します。



後は、AXI UART Liteのs_axi_aclkとs_axi_aresetnを、それぞれsys_cpu_clkとsys_cpu_resetnに接続し、
rxとtxを外部に引き出します。



最後に、Address Editorのタブを開き、/axi_uartlite_0/S_AXIのアドレスをアサインします。

これで、Block Designの改修は完了。Validate Designをしてから、Create HDL Wrapperを実行します。

しかし、wrapperは生成されているようですが、"Existing Wrapper File"の警告が出て、wrapperファイルが
アップデートされません。調べてみると、Tclスクリプトで生成されたプロジェクトでは、wrapperファイルが
fmcomms2_zed.srcs/sources_1/imports/hdlから読み込まれていますが、Create HDL Wrapperは
fmcomms2_zed.gen/sources_1/bd/system/hdlにwrapperを生成しているようです。

https://support.xilinx.com/s/question/0D52E00006hpmAYSAY/wrapper-doesnt-update-when-changing-a-block-diagram

そこで、オリジナルのwrapperファイルをRemove File from Projectで、プロジェクトから削除します。



そうすると、Vivadoが自動的に階層構造をupdateして、fmcomms2_zed.gen/sources_1/bd/system/hdlの
wrapperファイルを選択してくれます。



これで、system_wrapper.vにAXI UART Liteのポートが追加されたので、上位階層であるsystem_top.vも
適切に編集します。





最後にピンをアサインして、新しいxsaファイルを生成します。



さて、これでハードウェアの準備は整いました。Petalinuxのビルドは年明けかな。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MAX2771のレジスタにアクセス

2022-12-24 18:48:09 | FPGA
一年以上放置していたMAX2771の基板をZYBOに接続して、GNSS受信機開発を再開。

https://blog.goo.ne.jp/osqzss/e/72ac9b6eca3813b12310b58b70e4dddc



まずは、MAX2771のレジスタにアクセスして、中心周波数やサンプリング周波数を設定できるようにします。

インターフェイスには、PocketSDRで動作が確認できているGPIOによるbit bangingを採用。
データの読み書きは、同じピンをinoutで使うため、AXIO GPIOのAll InputsとAll Outputsの
どちらもチェックせずにBlock Designに組み込みます。



こうすることで、Wrapperの生成で自動的にIOBUFのプリミティブが挿入され、inoutのピンになります。



GPIOの制御は、PocketSDRのコードをほぼそのまま流用。
大きな違いは入出力の方向が0で出力、1で入力ということくらい。



問題なくMAX2771のレジスタにアクセスできました。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

DDRとFIXED_IO

2022-12-23 15:41:06 | FPGA
よく見かけるZynqのサンプルデザインのささやかな疑問。

VivadoのBlock Designで、シンプルにZynqだけのブロックを作るために
Run Block Automationをすると、デフォルトでDDRとFIXED_IOのピンが
Externalとして引き出されます。

しかし、これらのピンはすべてMIOに接続されているので、Externalにする
必要はないはずです。

試しに、DDRとFIXED_IOをDeleteしたブロックのビットストリームを生成して、
ハードウェアをエクスポート。



VitisでHello Worldのテンプレートをビルドして実行すると、問題なく動きます。

何のためにDDRとFIXED_IOはデフォルトでExternalとなるのでしょう?

P.S. ちなにみ、このサンプル、Vitis 2022.2でビルドして実行しようとすると、
これまで見たことのないcan't read "map": no such variableというエラーが出る。



どうやら、2022.2特有のバグで、DDRのメモリマップの自動生成に問題があるみたい。

Vitis launching Ultrascale MPSoC debug error: can't read "map": no such variable

おとなしく、動作の確認できている2021.1に戻します。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PS UARTをEMIOでPLに接続

2022-12-18 08:12:19 | SDR
わざわざAXI UART Liteを追加しなくても、PS UARTをEMIO経由でPLに接続すればよいのかと思い、試してみました。
まずはZynqのみのハードウェアから、PROG/UARTに接続されているPS UART1をEMIOに切り替えます。
さらに、UART_1を展開し、UART1_TXとUART1_RXのポートをそれぞれ右クリックし、Make Externalで外に引き出します。



これらがPmod USBUARTと接続できるよう、JEのPin 2(W16)をUART1_TX_0に、Pin 3(J15)をUART1_RX_0にアサインします。



後は、いつも通りにxsaファイルを生成し、Petalinuxをビルドします。

SDカードをZybo Z7-20に挿入し、電源を入れると、JEに接続されたUART1にbootメッセージが出力されました。

しかし、ここでまたautobootに失敗してu-bootで停止します。
どうやらboot中にPmod USBUARTが何等かの信号を送信してしまい、autobootが中止されているようです。



とりあえず、u-bootのコンソール画面で、bootdelayの値を-2に設定して回避します。

Zynq> setenv bootdelay -2
Zynq> saveenv

bootdelayの値については、こちらを参照。-1でautobootが無効になり、-2でdelayなしのautobootとなります。

Build U-Boot: List of environment variables

これで無事にPetalinuxが起動しました。ttyPS0のコンソールに、PL側からアクセスできています。



P.S. U-Bootのパラメータは、petalinux-configからは設定できず、テンプレートを直接編集するようです。

59349 - PetaLinux - How do I customize U-BOOT parameters?
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PetalinuxでAXI UART Liteを使う

2022-12-17 18:53:22 | SDR
こちらの記事を参考に、PetalinuxにAXI UART Liteを追加してみます。

Zedboard-PetaLinux2020.2 UARTLITE使用手順

いくつかハマりどころがあったので、備忘録。

まずは、ZynqとAXI UART Liteだけの簡単なハードウェアを作成します。
ここで重要なのは、PLからPSへのinterruptを忘れないこと。



TXとRXは、Pmodのピンにアサインします。





後は、いつも通りにxsaファイルを生成します。

Petalinuxのconfigurationで、axi_uartlite_0が追加されていることを確認します。







次に、petalinux-config -c kernelで、カーネルの設定を変更します。







ここで、Xilinx uartlite serial port supportをenableするだけでなく、Maximum number of uartlite serial portsの値も適切に設定します。
今回はPSのUARTだけではなく、AXI UART Liteが追加されるため、この値を2とします。

Xilinx Wiki: Uartlite Driver Kernel Configuration



さらに、system-user.dtsiでデバイスツリーにstatus = "okay"を追加し、axi_uartlite_0を有効にします。



これで準備が整いました。Petalinuxをビルドし、ブートイメージを生成したら、起動を確認します。



axi_uartlite_0に対応したttyUL1が追加されています。

P.S. PmodにUSBシリアル変換のアダプタを接続し、ttyUL1の出力を受信してみました。





問題なく動作しているようです。





コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AXI GPIOをUIOで制御

2022-12-13 23:14:22 | SDR
Petalinuxのチュートリアルを進めます。しばらく順調でしたが、ここでトラブル。

ZYBO (Zynq) 初心者ガイド (16) Linuxから自作IPをUIOで制御する

Root filesystem typeがデフォルトのINITRDだと問題なくbootするのですが、
SDに変更すると起動に失敗します。

ログをチェックしてみると、root deviceが指定されていないようです。

VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
Please append a correct " root=" boot option; here are the available partitions:

いろいろ調べて、やっと解決法を発見。

Zybo Z7-20 Petalinux BSP Project

project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsiのbootargsに
root deviceの記述を追加します。

bootargs = " console=ttyPS0,115200 earlyprintk uio_pdrv_genirq.of_id=generic-uio root=/dev/mmcblk0p2 rw rootwait";



これで無事にrootfsパーティションのルートファイルシステムを起動できました。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Petalinuxでユーザアプリケーション

2022-12-11 17:28:33 | SDR
Petalinuxのチュートリアルを進めます。ネットの情報に感謝。

ZYBO (Zynq) 初心者ガイド (11) LinuxユーザアプリケーションでLチカ

プラットフォームの設定は変えずに、アプリケーションのプロジェクトを作成。
とりあえず何もせずに、テンプレートをそのままビルドします。



生成されたmyappを、SDカードのrootfsパーティションの/usr/bin/にコピーします。
BOOTパーティションの中身は、そのままです。



SDカードをZyboのスロットに差し込み、起動。
問題なくmyappが実行されました。



P.S. Zedboard+AD-FMCOMMS3でも、SDカードにルートファイルシステムを作成しています。
IIOのデバイスとしてAD9361にアクセスできることは確認しているので、
今回のmyappと同じようにAD9361を制御するユーザアプリケーションが作れそうです。

https://wiki.analog.com/resources/tools-software/linux-drivers/iio-transceiver/ad9361

P.P.S. LANに接続して、ホストからsshやsftpでアクセスできることを確認。
これで、SDカードを取り出してファイルを書き換えることなく、
ネット越しに/usr/bin/にアプリケーションを書き込むことができる。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

rootfs on SD card

2022-12-10 22:02:08 | SDR
Zedboard+AD-FMCOMMS3と同じように、ルートファイルシステムをSDカードにします。
デフォルトの設定では、ルートファイルシステムがimage.ubからDDR上に展開されるため、
リブートすると作成したファイルなどが消えてしまいます。

ZYBO (Zynq) 初心者ガイド (9) Linuxカーネルを少しカスタマイズする

まずは、petalinux-configのImage Packaging Configrationから、Root filesystem typeを
デフォルトのINITRDから、EXT4 (SD/eMMC/SATA/USB)に切り替えます。







設定を保存し、petalinux-buildでリビルドします。

ビルドが完了したら、petalinux-packageでBOOT.binを作成します。
image.ubのファイルサイズが小さくなっていることが分かります。



出来上がったBOOT.binと、boot.scr、image.ubをSDカードのBOOTパーティションにコピーします。



SDカードのrootfsパーティションに、rootfs.tar.gzを展開します。



rootfsのイメージファイルであるrootfs.ext4をddで書き込む方法もあるようですが、
こちらの方が簡単そうです。

How to format SD card for SD boot

完成したSDカードをZyboのスロットに挿入し、電源ONで起動。
何かファイルを作成し、リブートしてみます。



リブート後も、ファイルが消えずに残っています。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ZyboでPetalinux

2022-12-10 19:30:55 | SDR
Zedboard+AD-FMCOMMS3でPetalinuxが起動することは確認できたので、
サンプルにモジュールやアプリケーションの追加ができるよう、
このあたりを参考にPetalinuxを基礎から学びます。

1. ZYBO (Zynq) 初心者ガイド (8) Linux起動する
2. Virtual Box上でZybo用にLinuxをビルドする

OSはUbuntu 18.04.6 LTS、VivadoとPetalinuxのバージョンは2021.1です。
ターゲットは、Zybo Z7-20になります。

まずは、DigilentのサイトからVivado Board Filesをダウンロードして、newの
board_filesのフォルダを、/tools/Xilinx/Vivado/2021.1/data/board/にコピーします。

https://github.com/Digilent/vivado-boards

次に、Vivadoを起動し、新規プロジェクトを作成します。
プロジェクト名はデフォルトのままproject_1とします。

Project TypeにはRTL Projectを選択し、Do not specify sources at this timeにチェック。

Default Partでは、Boardタブから先ほどダウンロードしたdigilentint.comのZybo Z7-20を選択。
現時点で、File Versionは1.1、Board RevはB.2となっています。

Projectが作成されたら、Flow NavigatorのIP INTEGRATORから、Create Block Designを起動。
Design nameはデフォルトのまま、design_1とします。

BLOCK DESIGNパネルのDiagramに、Zynqを追加。
Run Block AutomationをクリックしてZynqだけのブロックを作成します。

SoucesタブのDesign Sourcesから、design_1を右クリックし、Create HDL Wrapperを実行。
Optionsには、Let Vivado manage wrapper and auto-updateを選択します。

続いて、Flow NavigatorのPROGRAM AND DEBUGからGenerate Bitstreamを起動します。

ビットストリームが生成されたら、Fileメニューから、Export -> Export Hardwareを選択します。
Outputには、Include bitstreamをチェック。
XSA file nameは、デフォルトのままdesign_1_wrapperとします。
これで、プロジェクトフォルダに、ハードウェア定義ファイルであるdesign_1_wrapper.xsaが生成されます。



Vivadoでの作業はここまで。次は、Petalinuxのプロジェクトを生成します。
ここでは、プロジェクト名をzybo_linuxにしました。

続いて、ハードウェア定義ファイルのdesign_1_wrapper.xsaがあるフォルダを指定し、
Petalinuxの設定をします。



前回同様に、Yocto SettingsのEnable Network sstate feedsをdisableします。



それ以外はデフォルトのままで、Petalinuxのビルドを実行します。



かれこれ1時間ほどで、ビルドが無事に完了。
image/linuxフォルダに、Linuxシステムのイメージファイルが生成されます。



最後に、bootイメージファイル(BOOT.bin)を生成します。



次に、起動用のSDカードを準備します。
GPartedを使い、次のようなBOOTとrootfsのパーティションを作りました。



BOOTフォルダに、image.ub、BOOT.bin、boot.scrをコピーします。



SDカードをZyboのスロットに挿入し、bootのジャンパをSDに切り替え、電源を入れると、
無事にPetalinuxが起動してくれました。



ここまでは順調。次は、GPIOやUARTを追加してみよう。

P.S. Petalinuxのビルドがとにかく遅いので、少しでも速くなるかなと、この動画を参考に
sstateキャッシュとdownloadsファイルをすべてローカルにダウンロードしてみました。

Youtube: PetaLinux 101 - Getting Started Quickly

Petalinuxの設定で、ダウンロードしたファイルのフォルダを指定。









実験的に新しいプロジェクトを作成して、ビルドしてみたところ、さほど改善は見られず。
ネットワークの回線速度よりも、圧倒的にコンパイルが遅い。
ローカルのディスク容量を圧迫するだけなので、利点はなさそうです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PetalinuxのBoot

2022-12-03 14:26:26 | SDR
PetalinuxがSDカードからbootできるように、meta-adi-xilinxのREADMEを参考に、
petalinux-configでRoot filesystem typeにEXT4 (SD/eMMC/SATA/USB)を選びます。

https://github.com/analogdevicesinc/meta-adi/tree/2021_R1/meta-adi-xilinx



その後、Petalinuxをリビルドします。

次に、SDカードを準備します。このあたりを参考に、bootとrootのパーティションを作ります。

https://xilinx.github.io/vmk180-trd/2020.2/platform1/html/build-plnx.html#create-an-sd-card-image

このbootに、image/linuxからBOOT.BIN、boot.scr、image.ubをコピーします。
rootには、image/linuxのrootfs.tar.gzを展開します。



これで、SDカードの準備ができました。
ZedboardのジャンパをSDカードからのbootに設定します。



電源を入れると、U-Bootが起動しました。



自動的にPetalinuxがrootから起動してくれるのかと思ったのですが、そうではない?



この状態で、Zedboard上のPS-RSTボタンを押すと、Petalinuxが起動してくれます。



何とかZedboard+AD-FMCOMMS3でPetalinuxを起動させることができました。

P.S. AD9361はIIOのデバイスとしてアクセスできます。

https://wiki.analog.com/resources/tools-software/linux-drivers/iio-transceiver/ad9361



P.P.S. U-BootでストップしてPetalinuxがbootしてくれないのは、これとまったく同じ現象。

Petalinux boot process from SD card stops in Uboot with cryptical error message

コメントにある解決法に従って、USB-シリアルのケーブルを外した状態で電源を入れてみたけれど、
それでもPetalinuxはbootせず。

autobootを停止できる機能は不要なので、キー入力を無視して強制的にautobootできないのかな?

P.P.P.S. Petalinuxのconfigで、u-bootのbootdelayを設定できると思ったのだけれど、結局分からず。

PetaLinux Tools Documentation Reference Guide (UG1144): Configuring U-Boot

仕方がないので、ストップしたU-Bootのコンソールから、bootdelayを0に設定。



これで無事に電源ONでPetalinuxがbootしてくれた。とりあえず、これで良しとしよう。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする