AXI4-LiteスレーブIPの動作テスト のバックアップ(No.2)

更新


公開メモ

概要

z-turn の PL 領域に自作の AXI4-Lite スレーブ IP を置き、 Linux 上のプログラムから UIO モジュール経由でメモリマップレジスタにアクセスできることを確認する。

自作 IP の作成

リファレンスプロジェクト mys-xc7z020-trd.xpr を立ち上げて、design_1_i を開く。

open_design_1_i.png


[Tools]-[Create and Package New IP...]

create_and_package_new_ip.png


[Create a new AXI4 peripheral]

create-axi4-peripheral.png


適当な名前 "accesstest" をつけた。

newip-peripheral-details.png


AXI Lite の Slave を作成。メモリサイズは最小の 64 で、実際の記憶領域は4ワード。

newip-add-interfaces.png


[Add IP to the repository]

newip-create-peripheral.png

IP の編集

[Window]-[IP Catalog] として IP Catalog を開き、

window-ipcatalog.png

上で作った accesstest_v1.0 上で右クリック後 [Edit in IP Packager]

edit-in-ip-packager.png

編集用のプロジェクトをどこに作るか聞かれます。

このとき vivado は編集が終わったら完全に消去するつもりの一時的なプロジェクトを 作成する気まんまんで "C:/z-turn/mys-xc7z020-trd/mys-xc7z020-trd.tmp" などという場所に "accesstest_v1_0_v1_0_project" などという名前のプロジェクトを 作ろうとします。

すでに IP 本体の開発が済んでいて、IP を登録するためだけのプロジェクトであれば そのような一時プロジェクトでかまわないのでしょうけれど、まっさらから IP 開発する場合であればテストコードなどを含めた恒久的なプロジェクトを作りたくなる はずなので、これらを変更して、まともな場所にまともなプロジェクトとして保存します。

このあたり作法はもしかすると本来とは異なるのかもしれないので、 IP 開発に慣れたら再度レビューしたいと思います。

さしあたり以下のようにしました。

ip-packager-project-location.png

すると新しい vivado ウィンドウに C:/z-turn/ip/accesstest/accesstest.xpr というプロジェクトが開きます。

accesstest_v1_0_S00_AXI_inst をダブルクリックして accesstest_v1_0_S00_AXI.v を開きます。

S00_AXI_inst.png

accesstest_v1_0_S00_AXI モジュールは AXI Lite スレーブインターフェースのみ 備えたモジュールで、この AXI Lite スレーブインターフェースは IP のメインモジュール accesstest_v1_0 を通じて IP 外に直接出て行きます。

S00_AXI モジュール内で AXI バスからの指示に応答し、IP の動作を変更したり、 IP の状態を返したりすれば AXI バス経由でアクセス可能な IP ができあがります。

上記の操作で自動的に作成された S00_AXI モジュール内にはダミーのレジスタが 4つ作成されており(slv_reg[0-4])、すでに AXI4-Lite バスから読み書きが可能になっています。

ですのでこのままビルドすれば読み書きのテストができるはずなのですが、 そのままだと書いて、読むだけ、なので本当にうまくいっているか確信が持ちにくい。

そこで、

LANG:verilog
	always @(*)
	begin
	      // Address decoding for reading registers
	      case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
	        2'h0   : reg_data_out <= slv_reg0;
	        2'h1   : reg_data_out <= slv_reg1;
	        2'h2   : reg_data_out <= slv_reg2;
	        2'h3   : reg_data_out <= slv_reg3;
	        default : reg_data_out <= 0;
	      endcase
	end

となっている部分を意地悪く、

LANG:verilog
	always @(*)
	begin
	      // Address decoding for reading registers
	      case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
	        2'h0   : reg_data_out <= slv_reg1;
	        2'h1   : reg_data_out <= slv_reg2;
	        2'h2   : reg_data_out <= slv_reg3;
	        2'h3   : reg_data_out <= slv_reg0;
	        default : reg_data_out <= 0;
	      endcase
	end

として、読み出し時に1番地だけずれたデータを読み出すようにしておきます。

読み出しアドレス実際に読まれるアドレス
01
12
23
30

IP のリパッケージング

verilog ファイルを編集し、保存してから Package IP のページに戻ると、 [File Groups] の左側のアイコンが緑のチェックマークから編集済みのマークに変化しています。

package-ip-repackage.png

この状態で右側の [Merge Change] を押すと、編集マークが消えます。

そして [Re-Package IP] を押すと、更新された IP がインストールされるのですが、、、

その前に [Tools]-[Project Settings...] から、

tools-project-settings.png


[Delete project after packaging] をクリアしておかないと、 パッケージングが済み次第、プロジェクトが跡形もなく消え去ります。

delete-project-after-packaging.png


上記チェックを外してから、おもむろに [Re-Package IP] を押せば

finished-packaging.png

と出て完了です。

再度プロジェクトを開いたとき

Project Manager の下に [Package IP] ボタンがあるので、これを押すと Package IP パネルが現れます。

package-ip-button.png

作った IP を PS につなぐ

mys-xc7z020-trd.xpr プロジェクトに戻り、 design_1 の Diagram 上で右クリックから [Add IP...]

add-ip.png


Search に "access" まで入力して、accesstest_v1.0 を選択後、ENTER

select-accesstest.png


そのまま [Run Connection Automation] します。

run-connection-automation.png


clock についてのオプションも auto で OK

run-connection-automation-clock.png


つながりました。

diagram-after-auto-connection.png


[Regenerate Layout] して整えます。

regenerate-layout-button.png

diagram-after-regenerate-layout.png

アドレス設定を確認

[Address Editor] を開いて、accesstest_0 の Offset Address を確認します。

address-editor.png

bitstream の生成

[IP Integrator] の [Generate Block Design] をしてから、
[Program and Debug] の [Generate Bitstream]

# Generate Bitstream だけで Generate Block Design もしてくれるべきだと

# 思うのだけれど、どうして自動化されないんだろう???

Device Tree に IP を登録する

https://formalism.github.io/blog/posts/2014/05/zynqpllinux-dts/
を参考に UIO デバイスを使います

実は割り込みを使用しないデバイスを登録する方法がよくわかりません???

以下は VirtualBox にインストールした Debian8 のコンソール

~/linux-zynq-stable 以下にカーネルソースがあるものとします。

LANG:console
$ mkdir ~/devicetree
$ cd ~/devicetree
$ cp ../linux-zynq-stable/arch/arm/boot/dts/zynq-zturn-myir.dts .
$ cp ../linux-zynq-stable/arch/arm/boot/dts/zynq-7000.dtsi .
$ cp ../linux-zynq-stable/arch/arm/boot/dts/skeleton.dtsi .
$ dtc -O dtb -o zynq-zturn-myir.dtb zynq-zturn-myir.dts
$ ls -l zynq-zturn-myir.dtb
 -rw-r--r-- 1 osamu osamu 8878  2月  7 23:47 zynq-zturn-myir.dtb
$ cp zynq-zturn-myir.dts accesstest.dts

ソフトウェアから使う


Counter: 6673 (from 2010/06/03), today: 2, yesterday: 0