AXI Master IP コアの作製

AXI4 プロトコルの勉強1
XilinxのEDKはAXI4バスを使用することが出来る。今回はカスタム AXI Master IP コアの作成を目指そうと思う。AXI4 Masterコアを作成できるようにAXIプロトコルについて学んで行くつもりだ。
 AXI4 プロトコルの勉強2(読み出しバースト例)
、読み出しバースト例ついて勉強する。最初は、オーバーラップしない読み出しバースト例だ。次 に読み出しバーストがオーバーラップする例を示す。
 AXI4 プロトコルの勉強3(書きこみバースト例)
今度は、AXI4の書きこみバースト例だ。オーバーラップしていない書き込みバースト例とオー バーラップ書き込み例を示した。
 AXI4バスの マスタIPのテスト1(構想編)
XilinxのXPS上にAXI4バスのマスタIPを作ることにした。実装の手順を考えた。
 ar37425 のAXI4 Masterサンプルを試す1(AXI_Master IPの登録、接続)
ar37425 \axi_master_v1_00_a\hdl\verilog\axi_master.vはサンプルコードが入っているので、これを使用してAXI4 マスタIPのサンプルの動作を確かめて見ることにした。今回はサンプルのAXI4マスタIPをXPSでADDして設定を行った。
 ar37425 のAXI4 Masterサンプルを試す2(インプリメント) 
インプリメントを行った。成功。
 ar37425 のAXI4 Masterサンプルを試す3(SDK) 
ISEの下にXPSプロジェクトが入った状態で、SDKを立ち上げ、”Atlys ボードでXPSプロジェクトを試す2(ソフトウェアを試す)”で作ったLED+1ソフトウェアを起動してみた。
 ar37425 のAXI4 Masterサンプルを試す4(シミュレーション) 
なかなかシミュレーションのコンパイルが通らなかったが、他のアプリを落としたら、シミュレー ションのコンパイルが通った。
 ar37425 のAXI4 Masterサンプルを試す5(シミュレーション2) 
AXI4 Masterサンプルのシミュレーションのさわりを紹介
 ar37425 のAXI4 Masterサンプルを試す6(シミュレーション3) 
Xilinx社のAXIバス回路のサンプルの動作を詳しく見ていこうと思う。AXI4 Burst Write と AXI4 Burst Read のシミュレーション結果を詳しく解説。

 AXI4マスタ IPの作製(仕様の策定)
” キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする13(Writeはうまく行った)”でAXI4スレーブIPのWriteはうま く行った。Readの検証ができないので、キャラクタ・ディスプレイ・コントローラAXI4スレーブIPを駆動するAXI4マスタIPを作製することにした。 仕様の策定をした。
 AXI4マスタ IPの作製2(単体シミュレーション) 
キャラクタ・ディスプレイ・コントローラAXI4スレーブIPを駆動するAXI4マスタIPが 一応できたので、シミュレーションしてみた。
 AXI4マスタ IPの作製3(インプリメント)
単体シミュレーションを行なって大丈夫そうだったので、XPSでAXI4マスタIPをAddし て、ISEでインプリメントしてみた。
 AXI4マスタ IPのパラメータ 
”AXI4マスタIPの作製3(インプリメント)”で、CDCTEST AXI Master をAdd IPしてAXI4マスタIPとしてシステムに入れたが、その際にパラメータはデフォルトとした。ダイアログにどのようなパラメータがあるかを見ていきたい。

 AXI4スレー ブ・バス・ファンクション・モデル(BFM)の作製1
今 回はAXI4マスタIPを作る際に、対応するAXI4スレーブIPが出来ていたので、それで良いが、AXI4スレーブIPが無かった時に使える、なるべく 汎用のAXI4スレーブのBFMを作ることにした。全部の場合は網羅できないので、AXI4スレーブIPのタイプはRAMタイプとして、AXI4バスのト ランザクションをシミュレーションできることを目的とする。つまり、バーストのタイプは INCR のみの対応となる。
 AXI4スレー ブ・バス・ファンクション・モデル(BFM)の作製2 
ここでは、AXI4マスタIPを自作して、それを単体テストするために、AXI4スレーブIP の代わりのBFMモデルを作成している。(axi_master_BFM.vhd)
 AXI4スレー ブ・バス・ファンクション・モデル(BFM)の作製3 
axi_master_BFM.vhd を貼っておく。Writeデータ転送時にランダムなWaitを発生できるようにしてある (WRITE_RANDOM_WAIT=1)。Readデータ転送時はWaitしない設定 (READ_RANDOM_WAIT=0) にしてある。
 AXI4スレー ブ・バス・ファンクション・モデル(BFM)の作製4 
前回ブログにVHDLコードを貼ったaxi_master_BFM.vhd のRAMをbit_vector のarray にしてもstd_logic_vector のarray と僅かな差しかないとのご指摘をツイッターで受けたのでやってみました。

 AXI4バスで DVI表示回路を作る(仕様の検討)
最 終的に作りたいのはAtlysボードのステレオカメラのどちらか、もしくは両方からカメラ画像をDDR2 SDRAMにWriteして、カメラデータをDVI表示回路で表示するシステムだ。しかし、CMOSカメラ(アプティナ社のMT9D112)は使用するの が難しいので、DVI表示回路はしっかり動作するものを使いたい。カメラ制御用のI2C回路は私の作ったのはWriteだけだったが、MT9D112を制 御するためにはReadも必要ということがあって、DVI表示回路を先に作ることにした。
DVI 表示回路を先に作っても、表示するものがないとDDR2 SDRAMの初期値のパターンを表示しているだけとなり、表示させても正しのかどうかわからない。そこで、キャラクタ・ディスプレイ・コントローラのキャ ラクタROMをAXI4 Lite Slave として実装し、MicroBlaze を使用してソフトウェアでキャラクタROMを読んでビデオメモリ上にキャラクタのラスタデータを書いていこうと思う。
 AXI4バスに 接続するビットマップ・ディスプレイ・コントローラの作製1(仕様)
Atlysボードを使用して、AXI4バスに接続するビットマップ・ディスプレイ・コントロー ラ (BDC) を作製しようと思う。BDCはDDR2 SDRAMから画像のピクセルデータを適宜読んできて、HDMI端子にDVI信号を出力する回路だ。
 AXI4バスに 接続するビットマップ・ディスプレイ・コントローラの作製2(コード製作) 
Verilog ソースを作成した。
 AXI4バスに 接続するビットマップ・ディスプレイ・コントローラの作製3(単体シミュレーション)
今 回はテストベンチとBFMを用意してbitmap_disp_cntrler_axi_master.v 単体でシミュレーションを行った。テストベンチ bitmap_disp_cntrler_axi_master_tb.v とAXI Master用のBFMである axi_master_BFM.vhd のソースコードを貼った。
 AXI4バスに 接続するビットマップ・ディスプレイ・コントローラの作製4(MCBインプリメント1)
キャ ラクタROMをAXI4 Lite Slave として実装する4(UARTをXPSプロジェクトに追加する)”のPlanAheadプロジェク トを使用する。まずはXPSプロジェクトにDDR2 SDRAMコントローラのMCBを追加する。(使用バージョンは14.1)
 AXI4バスに 接続するビットマップ・ディスプレイ・コントローラの作製5(MCBインプリメント2) 
MCBインプリメントの続き。
 AXI4バスに 接続するビットマップ・ディスプレイ・コントローラの作製6(MCBインプリメント3) 
ま だ、DDR2 SDRAMコントローラ(MCB) しか実装していないが、これでインプリメントして動作を確認して見ることにした。それに制約ファイルでMCBの入出力ピンをしていないけれども、どの MCBを使うか決まったところで入出力ピンは決まっているはずなので、それを確かめるためでもある。WriteはできてもReadは出来ていなかった。(と 思ったが、実はどっちもだめだった)
 AXI4バスに 接続するビットマップ・ディスプレイ・コントローラの作製7(MCBインプリメント4) 
MCBを別のAXI4 Interconnect に移動することにした。その場合は、AXI to AXI Connector を間に介してAXI4 Interconnect 同士を接続する。やはりMicroBlazeからアクセス出来ない。
 ビットマップ・ ディスプレイ・コントローラの作製8(デバック1)
今 回は、どうしてMicroBlazeからDDR2 SDRAMがRead/Writeできないのか?探ってみることにした。具体的には、ChipScope AXI Monitor を追加して、AXIバスの動作をチェックすることにした。AWVALIDが1になったままになっている。AWREADYが1にならないようだ。MCBが応 答してない。
 ビットマップ・ ディスプレイ・コントローラの作製9(BitMapDCの接続1)
今 回は、64ビットバーストReadを試して見られるので、ビットマップ・ディスプレイ・コントローラ(BitMapDC) を追加してみることにした。元々はビットマップ・ディスプレイ・コントローラの作製なので、本当はこれがメインなのだが、MCBがMicroBlazeか らアクセス出来ないため延び延びになってしまった。XPSでユーザーIPとして認識させる準備。
 ビットマップ・ ディスプレイ・コントローラの作製10(BitMapDCの接続2)
今回はXPSでbitmap_disp_cntrler_axi_master をユーザーIPとしてXPSのシステムに追加した。
 ビットマップ・ ディスプレイ・コントローラの作製11(BitMapDCの接続3)
今回は、XPS上でbitmap_disp_cntrler_axi_master の配線をつないだ。
 ビットマップ・ ディスプレイ・コントローラの作製12(BitMapDCのインプリメント1)
PlanAheadに戻ってインプリメントを行った。
 ビットマップ・ ディスプレイ・コントローラの作製13(実機で動作1)
インプリメント後、Atlysボードの電源をONして、iMPACTでコンフィギュレーション してみた。HDMIコネクタを液晶ディスプレイに接続したところ、No Signal になってしまった。
 ビットマップ・ ディスプレイ・コントローラの作製14(デバック1)
前 回、ビットマップ・ディスプレイ・コントローラが動作しなかったので、ChipScopeでデバックをすることにしたが、すでに chipscope_axi_monitor_0 が入っていたので、このIPとchipscpe_icon_0 を削除してから、新たにPlanAheadでChipScope を入れた。前回のChipScopeの設定が残ってしまった。ChipScope の設定の解除方法。
 ビットマップ・ ディスプレイ・コントローラの作製15(デバック2) 
前回デバックは出来るようになった。ChipScopeで見るとMCBへのアクセスが出来てい ないようだがまだ良くわからない。今回はaxi2axi_connector_0 を削除してみることにした。
MCBの初期化終了信号が1になっていないことに気がついた。
 ビットマップ・ ディスプレイ・コントローラの作製16(全体シミュレーション)
今回はXPS全体でシミュレーションを行うことにした。テストベンチ (tb_system_stub.v) を貼りつけた。シミュレーションは正常に動作しているようだ。
 ビットマップ・ ディスプレイ・コントローラの作製17(動き出した)
MCB にキャリブレーションが終了せずに(cal_doneが0) だいぶ苦労してしまった。今までの自分でaxi_s6_ddrx IP (DDR2 SDRAM Controller) を入れて作ったXPSプロジェクト入りのPlanAheadプロジェクトを使ってきたが、どうもaxi_s6_ddrx IP が動かない。そこで違うプロジェクトで確かめてみることにした。それは、”Atlys ボードでXPSプロジェクトを試す1(XPSのプロジェクト作成、インプリメント)”で作成してあったXPSプロジェクト入りのISEプロジェク トをISE14.2に変換し、ビットマップ・ディスプレイ・コントローラを入れて使用することにした。
ディスプレイに表示を出すことが出来たが、まだおかしい。
 ビットマップ・ ディスプレイ・コントローラの作製18(動作した?)
前回は画面が流れていたので、回路がおかしかった。bitmap_disp_engine.v を修正して画面が流れないようになった。(VGAです)AXI4バスの占有率を確かめた。また、画面サイズごとのバス占有率を計算した。
 ビットマップ・ ディスプレイ・コントローラの作製19(HDLソースの公開) 
動作したので、HDLソースを貼り付けた。
 ビットマップ・ ディスプレイ・コントローラの作製20(DDR2をMicroBlazeと接続)
XPSのaxi2axi_connector IPを使って、MicroBlazeとaxi_s6_ddrx_0(MCB)を接続して、MicroBlazeからDDR2 SDRAMのデータをRead/Writeしてみた。うまく行きました。
 ビットマップ・ ディスプレイ・コントローラの作製21(画面にキャラクタを描画) 
キャラクタROMのAXI4 Lite IPからキャラクタのビットマップをMicroBlazeで読みだして、MicroBlazeでDDR2 SDRAMのビデオ・フレームバッファに書き込んで、キャラクタを表示することが出来た。

AXI4 Write Transaction のステートマシン
今まで、AXI4 Write Transaction のステートマシンは、Address ChannelとResponse Channelを一緒にしたステートマシンと Data Channel 用のステートマシンに分けていた。しかし、Write Response Channel はステートマシンにしておく必要も無く、BREADY をいつも 1 にしておいて、BVALID が来た時にエラーだったらエラー表示をすれば良いと思った。

inserted by FC2 system