FC2カウンター FPGAの部屋 2015年02月15日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vivado 2014.4のCドライバーファイル1

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする5(BOOT.bin, devicetree.dtb の生成)”で BOOT.bin や devicetree.dtb を生成した。

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする6(/sys, /devディレクトリ)”で、BOOT.bin と devicetree.dtb を MicroSDカードの第1パーティション ZYBO_BOOT に入れて、ZYBOに挿入して電源をONすると、Ubuntu 14.04 LTS が無事に起動した。更に、Vivado HLS 2014.4 で作製したラプラシアンフィルタIPのAXI4 Lite Slave バスが uio3 として認識されているのが分かった。

次は、Ubuntu14.04LTS 上で動く、Vivado HLS 2014.4 で作製したラプラシアンフィルタIPを制御するソフトウェアを作製して、IPを動作させるフェーズに突入することになる。
ZedBoardでVivado HLS で高位合成したラプラシアンフィルタのIPを動作させるソフトウェアを作製済みである。(”Vivado HLS 2013.4でラプラシアン・フィルタ関数をaxi masterモジュールにする7(ソース公開)”参照)
これを UIO 用に修正してもよいのだが、Vivado HLS は、C のドライバーファイルを生成してくれるので、これを使わない手は無い。ということで、”Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.3) 2014 年 10 月 1 日”(以下、高位合成ユーザーズガイドと呼ぶことにする)を読んで勉強することにした。

高位合成ユーザーズガイドの第1章高位合成、C ドライバーファイル、148ページに、C ドライバーファイルに着いて書かれている。
今回のラプラシアンフィルタのIPの名前は、lap_filter_axim だった。これを抑えておいて。
C:\Users\Masaaki\Documents\Vivado_HLS\lap_filter_axim_2014_4\solution1\impl\ip\drivers\lap_filter_axim_v1_0 フォルダを見ると、data フォルダと src フォルダがある。
Vivado_HLS_lap_filter_61_150215.png

data フォルダに入ると、

lap_filter_axim.mdd
lap_filter_axim.tcl

ファイルがあった。
Vivado_HLS_lap_filter_62_150215.png
.mdd ファイルはドライバー定義ファイルで、.tcl ファイルはソフトウェアをSDKに統合するためにSDKで使用するファイルだそうだ。(高位合成マニュアル参照)

src フォルダには、

Makefile
xlap_filter_axim.c
xlap_filter_axim.h
xlap_filter_axim_hw.h
xlap_filter_axim_linux.c
xlap_filter_axim_sinit.c

ファイルがあった。
Vivado_HLS_lap_filter_63_150215.png
xlap_filter_axim.c は、Linux スタンドアロン両方のStandard API イ ンプ リ メ ンテーシ ョ ン。
xlap_filter_axim.h は、Linux スタンドアロン両方のAPI 定義。
xlap_filter_axim_hw.h は、すべての内部レジスタのアドレスのオフセットを定義。コメントのみ”Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする2”に貼った。アドレスのオフセットのみが書いてある。
xlap_filter_axim_linux.c は、Linux用の初期化 API イ ンプ リ メ ンテーシ ョ ン。
xlap_filter_axim_sinit.c は、スタンドアロンの初期化 API イ ンプ リ メ ンテーシ ョ ン。
だそうだ。(高位合成ユーザーズガイド参照)

高位合成ユーザーズガイドの149ページの”表 1‐22 : C  ドライバーの API 関数”に使用できる API関数が書いてある。
まずは、使うのは初期化関数じゃないだろうか、その関数名はラプラシアンフィルタIPでは、int XLap_filter_axim_Initialize() である。
この関数は宣言がスタンドアロン (xlap_filter_axim_sinit.c) とLinux用 (xlap_filter_axim_linux.c) では違っている。
スタンドアロン (xlap_filter_axim_sinit.c) では、int XLap_filter_axim_Initialize(XLap_filter_axim *InstancePtr, u16 DeviceId) {
Linux用 (xlap_filter_axim_linux.c) では、int XLap_filter_axim_Initialize(XLap_filter_axim *InstancePtr, const char* InstanceName) {
となる。

詳細な解説は、高位合成マニュアルの”AXI4‐Lite スレーブの C  ドラ イバーのリフ ァ レンス” 417ページからの420ページの XDut_Initialize にある。
それによると、

InstancePtr : デバイス インスタンスへのポインター
DeviceId : xparameters.h で定義されたデバイス ID
InstanceName : uio デバイスの名前

だそうだ。

Linux用の XLap_filter_axim_Initialize() では、InstanceName に uio デバイスの名前を入れるそうなので、この場合は、”Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする6(/sys, /devディレクトリ)”の最後から2番めで、cat name した時の、lap_filter_axim_hls を入れるのだと思う。

Linux用の XLap_filter_axim_Initialize() の動作を書いておく。
・/sys/class/uio/から uio を順番に読んできて、名前を引数で渡された名前と比べる。
・名前が合っていたら、uio の名前や、バージョン、アドレス、サイズを InfoPtr(XLap_filter_axim_uio_info構造体)に入れる。
・該当する uio を mmap() でアロケートして、アドレスを XLap_filter_axim 構造体の Bus_axi4ls_BaseAddress メンバに代入する。
・XLap_filter_axim 構造体の IsReady メンバをアクティブにする(XIL_COMPONENT_IS_READYを代入する)。

使用している各構造体の記述を xlap_filter_axim_linux.c, xlap_filter_axim.h から引用する。

typedef struct {
    u32 addr;
    u32 size;
} XLap_filter_axim_uio_map;

typedef struct {
    int  uio_fd;
    int  uio_num;
    char name[ MAX_UIO_NAME_SIZE ];
    char version[ MAX_UIO_NAME_SIZE ];
    XLap_filter_axim_uio_map maps[ MAX_UIO_MAPS ];
} XLap_filter_axim_uio_info;

typedef struct {
    u32 Bus_axi4ls_BaseAddress;
    u32 IsReady;
} XLap_filter_axim;

  1. 2015年02月15日 05:32 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0