FC2カウンター FPGAの部屋 FPGA+SoC+Linux実践勉強会での課題をやってみた2(Vivado 編)
FC2ブログ

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

FPGAの部屋

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

FPGA+SoC+Linux実践勉強会での課題をやってみた2(Vivado 編)

FPGA+SoC+Linux実践勉強会での課題をやってみた1(Vivado HLS編)”の続き。

「”FPGA+SoC+Linux実践勉強会”でZYBO Z7 を使用し、Vivado HLS でDMA IPを作成して、Vivado で回路にして、SDK でベアメタル・アプリケーションでDMA IP を動作させようとしたら動作しなかった。
そこで、DMA IP を仕上げてデバイツリー・オーバーレイやudmabuf などを確かめてみよう。」ということで、前回はVivado HLS 2017.3 でDMA_pow プロジェクトを作成し、10 個のデータをReadし、 2 乗して出力するIP にした。今回は、そのDMA_pow2 IP を使用して、Vivado 2017.3 の IPI で ZYBO Z7 のPS と接続して、SDK でアプリケーションソフトを作って実機で試してみよう。

Vivado 2017.3 で test_dma プロジェクトを作成した。

IP Catalog を開いて、右クリックメニューからAdd Repository... を選択して、DMA_pow2 IP を加えた。

test_dma ブロック・デザインを作成し、回路を構成した。
FPGA-SoC-Linux4ZYBO_Z7_23_171206.png

ブロック・デザインを示す。
FPGA-SoC-Linux4ZYBO_Z7_24_171206.png

PS のHP ポートを使用している。ACP ポートを使用すると、SDK のtest_dma アプリケーションソフトを実行したときに、どうしても

while(!XDma_pow2_IsDone(&XMluti_ap)) ;

から抜けてこなかったのだ。どうしてか分からないが、ACP ポートではVivado HLS で作成した Dma_pow2 IP がDone にならないようだ?

HDL Wapper を作成し、論理合成、インプリメント、ビットストリームの生成を行って、成功した。結果を示す。
FPGA-SoC-Linux4ZYBO_Z7_25_171206.png
FPGA-SoC-Linux4ZYBO_Z7_26_171206.png

ハードウェアをビットストリームごとエクスポートし、SDK を立ち上げた。

Hello_World アプリケーション・プロジェクトを作成した。

test_dma アプリケーション・プロジェクトを作成した。
FPGA-SoC-Linux4ZYBO_Z7_28_171206.png

test_dma.c を示す。

/* * test_dma.c * *  Created on: 2017/12/02 *      Author: masaaki */


#include <stdio.h>
#include "xdma_pow2.h"
#include "xparameters.h"

volatile int data[10] = {0123456789};
volatile int result[10] = {0123456789};

int main(){
    XDma_pow2 XMluti_ap;
    XDma_pow2_Config *XMulti_apPtr;
    int i;

    // Look Up the device configuration
    XMulti_apPtr = XDma_pow2_LookupConfig(0);
    if (!XMulti_apPtr){
        fprintf(stderr, "XMulti_apuint configuration failed.\n");
        return(-1);
    }

    // Initialize the Device
    int Xlap_status = XDma_pow2_CfgInitialize(&XMluti_ap, XMulti_apPtr);
    if (Xlap_status != XST_SUCCESS){
        fprintf(stderr, "Could not Initialize XMulti_apuint\n");
        return(-1);
    }

    XDma_pow2_Set_in_r(&XMluti_ap, (u32)&data[0]);
    XDma_pow2_Set_out_r(&XMluti_ap, (u32)&result[0]);

    XDma_pow2_Start(&XMluti_ap);

    while(!XDma_pow2_IsDone(&XMluti_ap)) ;

    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, data[i], i, result[i]);
    }

    return 0;

}


Hello_World を実行してから、test_dma を実行した結果を示す。
FPGA-SoC-Linux4ZYBO_Z7_29_171206.png

date[] の 2 乗倍が result[] になっている。

result[] の結果はresult[] 配列の宣言によっても影響を受ける。

volatile int result[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

volatile int result[10];

にしてみよう。
FPGA-SoC-Linux4ZYBO_Z7_30_171206.png

これで実行してみた結果を示す。
FPGA-SoC-Linux4ZYBO_Z7_31_171206.png

result[] はすべて 0 だ。。。DMAは成功していてもARM プロセッサはデータを読めていない。これで、”FPGA+SoC+Linux実践勉強会”の時はうまく行かなかったようだ。
これは、.bss 領域と .data 領域のキャッシュのON, OFF の違いが影響しているのかもしれない?
ちなみに、現在は、volatile でグローバルに data 配列と reseult 配列を宣言しているが、main() の中で、data 配列と reseult 配列を宣言していた時は、Vivado Analyzer で見たときのRead アクセス(つまり in[i] のRead )のデータも正しくなかった。つまり、物理アドレスと仮想アドレスが違っていたのではないか?と思う。
いろいろと難しいですね。。。ホントに。。。

Vivado Analyzerの波形を貼っておく。

まずは、全体のトランザクション波形から。
FPGA-SoC-Linux4ZYBO_Z7_32_171206.png

Slot_0 がAXI4 Master で、Slot_1 が AXI4 Lite Slave だ。
AXI4 Lite Slave でレジスタを設定してるので、AXI4 Master よりも先にトランザクションがあるのが分かる。AXI4 Master のトランザクションが発生してからのAXI4 Lite Slave はAXI4 Master のDone 待ちループに入っている。

次に、AXI4 Lite Slave のレジスタ設定部分を拡大してみた。
FPGA-SoC-Linux4ZYBO_Z7_33_171206.png

最初の0x18 へのWrite が in[] のアドレスを書いている。それが 0x0010e3fc だ。次に、0x20 に out[] のアドレスの 0x0010e424 を書いている。最後のWrite はスタートで、0x00 に 1 を書いている。

次にAXI4 Master を見てみよう。
最初のRead とWrite を拡大した。最初にRead から。
FPGA-SoC-Linux4ZYBO_Z7_34_171206.png

これは、最初の二乗の 0 の二乗をやっているところだ。RVALID が 2 回 1 になっているのが分かる。これは、Vivado HLS でのC/RTL コシミュレーションと同様だ。RDATA の値は 0 になっているのが分かる。

次に、同じ時間のWrite を示す。
FPGA-SoC-Linux4ZYBO_Z7_35_171206.png

WVALID が 1 になっているところが 1 個のデータ(WDATAが 0 )をWrite したところだ。なお、Read のバースト長は 1 だが、Write のバースト長は 10 で、すべてのデータをバーストで書く。しかし、データが用意できないので、Write もまばらなトランザクションになってしまう。

データが 0 では寂しいので、最後の二乗を示す。 9 X 9 = 81 の演算だ。まずはRead を示す。
FPGA-SoC-Linux4ZYBO_Z7_36_171206.png

次にWrite を示す。
FPGA-SoC-Linux4ZYBO_Z7_37_171206.png

ここでは、バーストの最後なので、RVALID と一緒にRLAST が 1 にアサートされているのが分かると思う。そして、BVALID がアサートされているのも分かる。
  1. 2017年12月06日 05:22 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/3995-43f8f6a5
この記事にトラックバックする(FC2ブログユーザー)