FC2カウンター FPGAの部屋

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

FPGAの部屋

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

”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみる2(Micro SDカードの準備)

”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみる1(FPGA-SoC-Linux のクローン)”の続き。

前回は、FPGA-SoC-Linux をクローンした。今回は、Micro SDカードをフォーマットして、パーティションを切った。

最初に、SDカードフォーマッターでMicro SDカードをフォーマットする。このMicro SDカードはPYNQ用のイメージを書いてあるので、上書きフォーマットで論理サイズ調整 ON でフォーマットする。

SDFormatter V4.0 を起動して、オプション設定ボタンをクリックする。
PYNQ_Linux_ikwzm_15_170325.png

フォーマットオプション設定で、上書きフォーマットと論理サイズ調整 ON を指定してOKボタンをクリックする。
PYNQ_Linux_ikwzm_16_170325.png

フォーマットボタンをクリックし、Micro SDカードのフォーマットを行う。
PYNQ_Linux_ikwzm_17_170325.png

確認ダイアログが出るので、OKボタンをクリックした。
PYNQ_Linux_ikwzm_18_170325.png

しばらくの間、フォーマットしていたが、フォーマットが終了した。
PYNQ_Linux_ikwzm_19_170325.png

次にMicro SDカードにパーティションを作っていこう。
ZedBoard用のUbuntu Linuxをビルド6(SDカードを用意する)”を参考にした。
なお、FPGAマガジン No.5 の第3章”Zynq評価ボードZedBoardでLinuxを動かそう”という石原 ひでみさんの記事の中の48ページの”図17 SDカードのパーティション操作手順”を参考にさせて頂いています。

私の環境はWindows 10 でVirtualBoxを使用して、Ubuntu 16.04 をインストールしてある。
そこで、Micro SDカードをVirtualBox 上のUbuntu にマウントするためにVirtualBox のデバイスメニュー -> USB -> USBリーダーの名前(Micro SDカードが装着してある)を選択した。
PYNQ_Linux_ikwzm_20_170326.png

/media/masaaki/1BC2-1630 としてマウントされた。
PYNQ_Linux_ikwzm_21_170326.png

lsblk コマンドを実行して、SDカードを検索した。
PYNQ_Linux_ikwzm_22_170326.png

/dev/sdb がSDカードのようだ。
sudo unmount /dev/sdb1 で sdb1 をアンマウントしておく。こうしないと後で w コマンドで書き込むときにエラーになってしまう。
sudo fdisk /dev/sdb コマンドを実行してSDカードのフォーマットを開始した。
PYNQ_Linux_ikwzm_23_170326.png

p コマンドで既存のパーティションを表示した。FAT32パーティションが生成されていた。
d コマンドでパーティションを削除した。
p コマンドで見ると、パーティションが消去されていた。
PYNQ_Linux_ikwzm_24_170326.png

プライマリ・ディスクのパーティション番号1に100 MBの領域を確保する

n コマンドで新たにパーティションを作製した。
p を押して、primary パーティションを指定した。
パーティション番号を 1 にセット。
First sector で、リターンキーを入力した。
Last sector で、+100M を入力して、100 MB の領域を確保した。
p コマンドででパーティションを表示した。
PYNQ_Linux_ikwzm_25_170326.png

プライマリ・ディスクのパーティション番号2に残っている領域(14.3 GB)を確保する
n コマンドで新たにパーティションを作製した。
p を押して、primary パーティションを指定した。
パーティション番号を 2 にセット。
First sector で、リターンキーを入力した。
Last sector で、リターンキーを入力した。
p コマンドででパーティションを表示した。
PYNQ_Linux_ikwzm_26_170326.png

プライマリ・ディスクのパーティション番号1をFAT32にして、ブート可能フラグを付ける
t コマンドを入力した。
パーティション番号に 1 を入力した。
16進コードに、b を入力した。(W95 FAT32)
a コマンドを入力して、ブート可能フラグを付ける。
パーティション番号に 1 を入力した。
p コマンドででパーティションを表示した。
PYNQ_Linux_ikwzm_27_170326.png

SDカードへの書き込み

w コマンドを実行して、今まで設定してきたパーティション情報をMicro SDカードにWrite した。
PYNQ_Linux_ikwzm_28_170326.png

lsblk を行うと、設定したパーティションが sdb1, sdb2 として見えている。
FPGAマガジン No.5 の第3章”Zynq評価ボードZedBoardでLinuxを動かそう”という石原 ひでみさんの記事を参考に、/dev/sdb1 に対して、

sudo mkfs.msdos -n PYNQ_BOO /dev/sdb1

を実行した。(PYNQ_BOOT としたかったが、PYNQ_BOO とタイポしてしまった)
PYNQ_Linux_ikwzm_29_170326.png

PYNQ_BOO がマウントされた。
PYNQ_Linux_ikwzm_30_170326.png

同様に、/dev/sdb2 に対して、

sudo mkfs.ext3 -L ROOT_FS /dev/sdb2

を実行した。(ファイルシステムは ext3 指定だった)
Writing superblocks and filesystem accounting infomation: でリターンを入力した。
PYNQ_Linux_ikwzm_31_170326.png

コマンドが終了した。
PYNQ_Linux_ikwzm_32_170326.png

ROOT_FS がマウントされた。
PYNQ_Linux_ikwzm_33_170326.png

これで、Micro SDカードの用意は終了した。
  1. 2017年03月27日 04:50 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

Vivado WebPACK 2016.1 からWebPACKではラインセンスファイルは必要ありません

Vivado WebPACK 2016.1 からWebPACK では、ライセンスファイルは必要無くなりました。
ダウンロード時に登録は必要ですが、Vivado WebPACK 2016.1~は、インストールすればライセンスファイルを取得しなくても起動して普通に使えます。今のVivado WebPACK 2016.4 でも同様にラインセンスファイルは必要ありません。

詳しくは、”Vivado Design Suite ユーザー ガイド リリース ノート 、 インストールおよびライセンス UG973 (v2016.4) 2016 年 11 月 30 日”の 80 ページ ”Vivado WebPACK をライセンス ファイルなしで使用可能”をご覧ください。
  1. 2017年03月26日 21:57 |
  2. Vivado
  3. | トラックバック:0
  4. | コメント:0

”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみる1(FPGA-SoC-Linux のクローン)

ikwzm さんの”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみようと思う。

Device Tree Overlay+FPGA Managerが使用できれば、SDSoC でビットストリームとアプリケーションソフトが作れれば、すでに動作しているLinux 上でリブートすること無しにいくらでも試すことができるし、”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”もこのままの状態で起動したら、Device Tree Overlay+FPGA Managerでハードウェアとそのデバイスツリーを使ってFPGA を使うことができるはずだ。つまりLinux は動作しながら、FPGAでアクセラレーションできるわけだ。という理由でやってみることにした。
参考資料

FPGA+SoC+LinuxでDevice Tree Overlayを試してみた
”FPGA+SoC+LinuxでFPGA Managerを試してみた


まずは、”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”で指定されているように、Git LFS(Large File Storage)を自分のVirtualBox 上のUbuntu 16.04 に追加します。
sudo apt-get install git-lfs
PYNQ_Linux_ikwzm_1_170325.png

git-lfs が無いと言われてしまう。
GitHub のgit-lfs/git-lfs の Installation を見るとUbuntu での git-lfs のインストール方法が書いてあった。その手順に従ってUbuntu 16.04 上で git-lfs のインストールを行う。

sudo apt-get install python-software-properties
PYNQ_Linux_ikwzm_2_170325.png

Yをクリックしてインストールを進めると、python-software-properties がインストールできた。
sudo add-apt-repository ppa:git-core/ppa
PYNQ_Linux_ikwzm_3_170325.png

PYNQ_Linux_ikwzm_4_170325.png

ppa をインストールすることができた。
この後で、sudo apt-get update をするように書いてあるが、忘れてしまった。最後にsudo apt-get updatesudo apt-get upgrade を実行しておいたが、これで良いかどうか?よくわからない?

curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
PYNQ_Linux_ikwzm_5_170325.png

sudo apt-get install git-lfs
PYNQ_Linux_ikwzm_6_170325.png

git lfs install
PYNQ_Linux_ikwzm_7_170325.png

これで git lfs がインストールできた。

さて、ikwzm さんのFPGA-SoC-Linux をクローンする。
git clone git://github.com/ikwzm/FPGA-SoC-Linux
cd FPGA-SoC-Linux
ls

PYNQ_Linux_ikwzm_8_170325.png

FPGA-SoC-Linux ディレクトリの下には12個のファイルまたはディレクトリがあった。
PYNQ_Linux_ikwzm_10_170325.png

git checkout v0.3.0
PYNQ_Linux_ikwzm_11_170325.png

git lfs pull
PYNQ_Linux_ikwzm_12_170325.png

FPGA-SoC-Linux ディレクトリの下のファイルまたはディレクトリが 9 個に減った。
PYNQ_Linux_ikwzm_13_170325.png

FPGA-SoC-Linux/target/zynq-pynqz1/boot ディレクトリのファイルを示す。
PYNQ_Linux_ikwzm_14_170325.png

boot.bin や u-boot, デバイスツリーの dts と dtb, uEnv.txt, zImage などが入っていた。
  1. 2017年03月26日 06:01 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

Vivado 2016.4 のSDKでデバイスツリーのソース(DTS)を生成する

Linux 上のISE のSDK からデバイスツリーのソース(DTS)を生成する方法は”SDKでDevice Treeを生成する2(SDKでxilinx.dtsを生成)”に書いた。今回は、Windows 10 上で、Vivado 2016.4 のSDKでデバイスツリーのソース(DTS)を生成してみよう。

自分のブログを参考しても良いのだが、ISE のSDK なので、”blog 渓鉄”さんの”Xilinx SDKでDevice Treeを生成する”を参考にさせて頂きます。

SDK は、”Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システム”のSDK をそのまま使用する。

最初に、ブラウザで”Xilinx/device-tree-xlnx”を開く。
SDK_dts_1_170325.png

Clone of download ボタンをクリックして、Download ZIP ボタンをクリックする。
device-tree-xlnx-master.zip ファイルがダウンロードできるので、適当なフォルダを選択し、保存ボタンをクリックしてセーブする。
SDK_dts_2_170325.png

device-tree-xlnx-master.zip ファイルをダブルクリックすると、圧縮ファイル上のフォルダが見えるので、そのdevice-tree-xlnx-master フォルダを適当なフォルダにドラック&ドロップする。
SDK_dts_3_170325.png

SDK 2016.4 で、Xilinx Tools -> Repositories を選択する。
SDK_dts_4_170325.png

開いたダイアログのLocal Repositories で、New... ボタンをクリックする。
SDK_dts_5_170325.png

先ほどダウンロードして解凍したdevice-tree-xlnx-master フォルダを選択する。
SDK_dts_6_170325.png

Local Repositories にdevice-tree-xlnx-master フォルダのパスが入った。
SDK_dts_7_170325.png

OK ボタンをクリックするとSDK に戻った。
SDK_dts_8_170325.png

File メニューからNew -> Board Support Package を選択した。
SDK_dts_10_170325.png

Xilinx Board Support Package Project ダイアログが表示された。
SDK_dts_11_170325.png

Board Support Package OS にdevice_tree が増えているので、それを選択した。Finish ボタンをクリックした。
Board Support Package Settings が開いた。
最初はOverview 画面だ。
SDK_dts_12_170325.png

device_tree をクリックした。
SDK_dts_13_170325.png

DTS ファイルは分割されるようだ。
drivers をクリックした。
SDK_dts_14_170325.png

SDK に戻ると、device_tree_bsp_0 ができていて、下に示すファイルができていた。

pcw.dtsi
pl.dtsi
skeleton.dtsi
system-top.dts
system.dts
zynq-7000.dts


SDK_dts_15_170325.png
  1. 2017年03月26日 04:38 |
  2. Vivado
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システム6(アプリの変更と30fpsへ)

Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システム5(ILAコアの削除)”の続き。

前回は、Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システムから 2 つの ILA コアを削除した。今回は、アプリケーションソフトを整備した後で、15 fps のカメラのフレームレートを 30 fps に変更する。

まずは、DMA_Read_addr IP の動作モードのDMA_WRITE_MODE はDMA_Write IP の書き込んでいる画像フレームの1つ前の画像フレームからDMA Read しているモードでこれは正常に動作している。問題は、FREE_RUM_MODE で、これは、3 つの画像フレームからフリーランで読んでるモードなのだが、15 fps でカメラがWrite していて、60 fps でビットマップ・ディスプレイ・コントローラがRead するので、画像フレームバッファが 3 つあると現在、過去が入り混じって画像がぶれてしまう。よって、FREE_RUM_MODE の場合は、画像フレームを 1 つにする必要があるようだ。そのように変更したところ、画像がぶれることは無くなった。
DMA_Read_IP_85_170320.png

cam_disp_hls.c を貼っておく。

/* * cam_disp_hls.c * *  Created on: 2016/08/21 *      Author: Masaaki */


#include <stdio.h>
#include <stdlib.h>
#include "xil_io.h"
#include "xdma_read_addr.h"
#include "xdma_write.h"
#include "sleep.h"

#define NUMBER_OF_WRITE_FRAMES    3 // Note: If not at least 3 or more, the image is not displayed in succession.

#define HORIZONTAL_PIXELS    800
#define VERTICAL_LINES        600
#define PIXEL_NUM_OF_BYTES    4

#define FRAME_BUFFER_ADDRESS 0x10000000

#define DMA_WRITE_MODE
//#define FREE_RUN_MODE

void cam_i2c_init(volatile unsigned *mt9d111_i2c_axi_lites) {
    mt9d111_i2c_axi_lites[64] = 0x2// reset tx fifo ,address is 0x100, i2c_control_reg
    mt9d111_i2c_axi_lites[64] = 0x1// enable i2c
}

void cam_i2x_write_sync(void) {
    // unsigned c;

    // c = *cam_i2c_rx_fifo;
    // while ((c & 0x84) != 0x80)
        // c = *cam_i2c_rx_fifo; // No Bus Busy and TX_FIFO_Empty = 1
    usleep(1000);
}

void cam_i2c_write(volatile unsigned *mt9d111_i2c_axi_lites, unsigned int device_addr, unsigned int write_addr, unsigned int write_data){
    mt9d111_i2c_axi_lites[66] = 0x100 | (device_addr & 0xfe);   // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    mt9d111_i2c_axi_lites[66] = write_addr;
    mt9d111_i2c_axi_lites[66] = (write_data >> 8)|0xff;         // first data
    mt9d111_i2c_axi_lites[66] = 0x200 | (write_data & 0xff);        // second data
    cam_i2x_write_sync();
}

int main(){
    XDma_read_addr  dmar, *dmarp;
    XDma_write      dmaw, *dmawp;

    dmarp = &dmar;
    dmawp = &dmaw;

    // Initialization of DMA Read
    if (XDma_read_addr_Initialize(dmarp, 0) != XST_SUCCESS){
        fprintf(stderr,"DMA Read open error\n");
        exit(-1);
    }

    // Initialization of DMA Write
    if (XDma_write_Initialize(dmawp, 0) != XST_SUCCESS){
        fprintf(stderr,"DMA Write open error\n");
        exit(-1);
    }

    // frame buffer settings
#ifdef DMA_WRITE_MODE
    XDma_read_addr_Set_frame_buffer0(&dmar, FRAME_BUFFER_ADDRESS);
    XDma_read_addr_Set_frame_buffer1(&dmar, FRAME_BUFFER_ADDRESS+HORIZONTAL_PIXELS*VERTICAL_LINES*PIXEL_NUM_OF_BYTES);
    XDma_read_addr_Set_frame_buffer2(&dmar, FRAME_BUFFER_ADDRESS+2*HORIZONTAL_PIXELS*VERTICAL_LINES*PIXEL_NUM_OF_BYTES);

    XDma_write_Set_frame_buffer0(&dmaw, FRAME_BUFFER_ADDRESS);
    XDma_write_Set_frame_buffer1(&dmaw, FRAME_BUFFER_ADDRESS+HORIZONTAL_PIXELS*VERTICAL_LINES*PIXEL_NUM_OF_BYTES);
    XDma_write_Set_frame_buffer2(&dmaw, FRAME_BUFFER_ADDRESS+2*HORIZONTAL_PIXELS*VERTICAL_LINES*PIXEL_NUM_OF_BYTES);
#else // FREE_RUN_MODE
    XDma_read_addr_Set_frame_buffer0(&dmar, FRAME_BUFFER_ADDRESS);
    XDma_read_addr_Set_frame_buffer1(&dmar, FRAME_BUFFER_ADDRESS);
    XDma_read_addr_Set_frame_buffer2(&dmar, FRAME_BUFFER_ADDRESS);

    XDma_write_Set_frame_buffer0(&dmaw, FRAME_BUFFER_ADDRESS);
    XDma_write_Set_frame_buffer1(&dmaw, FRAME_BUFFER_ADDRESS);
    XDma_write_Set_frame_buffer2(&dmaw, FRAME_BUFFER_ADDRESS);
#endif

    // DMA_read_addr mode set
#ifdef DMA_WRITE_MODE
    XDma_read_addr_Set_mode_V(&dmar, 0); // DMA_WRITE_MODE
#else // FREE_RUN_MODE
    XDma_read_addr_Set_mode_V(&dmar, 1); // FREE_RUN_MODE
#endif

    // mt9d111_inf_axis_0, axi_iic_0, bitmap_disp_cont_axis_0
    volatile unsigned int *mt9d111_axiL;
    volatile unsigned int *cam_iic_axiL;
    volatile unsigned int *bmdc_axiL;

    mt9d111_axiL = (volatile unsigned int *)XPAR_MT9D111_INF_AXIS_0_BASEADDR;
    cam_iic_axiL = (volatile unsigned int *)XPAR_AXI_IIC_0_BASEADDR;
    bmdc_axiL = (volatile unsigned int *)XPAR_BITMAP_DISP_CONT_AXIS_0_BASEADDR;

    // bitmap_disp_cont_axis_0 is started
    bmdc_axiL[0] = (volatile unsigned int)FRAME_BUFFER_ADDRESS; // Camera Interface start (Address is dummy)

    // DMA Start
    XDma_read_addr_DisableAutoRestart(&dmar);
    while(!XDma_read_addr_IsIdle(&dmar)) ;
    XDma_read_addr_Start(&dmar);
    XDma_read_addr_EnableAutoRestart(&dmar);

    XDma_write_DisableAutoRestart(&dmaw);
    while(!XDma_write_IsIdle(&dmaw)) ;
    XDma_write_Start(&dmaw);
    XDma_write_EnableAutoRestart(&dmaw);

    // mt9d111_inf_axis_0 is started
    mt9d111_axiL[0] = (volatile unsigned int)FRAME_BUFFER_ADDRESS; // Camera Interface start (Address is dummy)

    // CMOS Camera initialize, MT9D111
    cam_i2c_init(cam_iic_axiL);

    cam_i2c_write(cam_iic_axiL, 0xba, 0xf00x1);      // Changed regster map to IFP page 1
    cam_i2c_write(cam_iic_axiL, 0xba, 0x970x20);     // RGB Mode, RGB565

    mt9d111_axiL[1] = 0// One_shot_mode is disabled

    return(0);
}


これで、FREE_RUM_MODE も問題が無くなったので、次は、カメラのフレームレートを 15 fps から 30 fps に向上させることにした。
やり方は、”MT9D111のフレームレートを 15 fps から 30 fps にした”に書いておいた。
早い話が、カメラに供給するクロックを 36 MHz から倍の 72 MHz に変更するということだ。それに合わせて制約も変更する。
具体的には、PS からのクロックの FCLK_CLK2 の周波数設定を 36 MHz から 72 MHz に変更した。
DMA_Read_IP_86_170320.png

もう一度、論理合成、インプリメント、ビットストリームの生成を行い、ハードウェアをエクスポートして、SDKを立ち上げた。
これで、画像のフレームレートが 15 fps から 30 fps に向上した。

このDMAWrite IPとDMA_Read_addr IP の組は使えそうだ。AXI VDMAの説明書を読まなくても簡単に使えるところが良いと思う。
願わくば、DMA_Read_addr IP を使うときのツールのバグが直ってほしいと思う。
  1. 2017年03月24日 05:17 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システム5(ILAコアの削除)

Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システム4(ILAコアの挿入2)”の続き。

前回、Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システムが動作した。しかし、ブロックデザイン上で挿入したILA コアとネットリストの信号を観察するため入れたILA コアが残ってしまっている。それを削除した。

まずは、ブロックデザイン上で挿入したILA コアを削除しよう。

Debug にマーキングされた配線を複数選択して、右クリックし、右クリックメニューからClear Debug を選択する。
DMA_Read_IP_76_170320.png

ILA コアの system_ila が削除された。
DMA_Read_IP_77_170320.png

これで、ブロックデザイン上で挿入したILA コアが削除された。
次に、ネットリストの信号を観察するため入れたILA コアを削除する。

論理合成を行って、成功後に表示されるSynthesis Completed ダイアログで Open Synthesized Design を選択した。
DMA_Read_IP_78_170320.png

Synthesized Design が表示された。Tools -> Set Up Debug... を選択した。
DMA_Read_IP_79_170320.png

Set Up Debug ダイアログが表示された。Next ボタンをクリックした。
DMA_Read_IP_80_170320.png

Existing Debug Nets で、Disconnect all net and remove debug cores を選択した。
DMA_Read_IP_81_170320.png

Set Up Debug Summary が表示された。Finish ボタンクリックした。
DMA_Read_IP_82_170320.png

ネットリストの信号を観察するため入れたILA コアが削除された。
DMA_Read_IP_83_170320.png

確か、制約ファイルの ILA コア関連の制約は削除されたが、1つ ILA コアの制約が残っていたので、手動で削除した。

インプリメント、ビットストリームの生成を行った。結果を示す。
DMA_Read_IP_84_170320.png

ILA コアが入る前と同等のリソース使用量になった。

ハードウェアをエクスポートして、SDK を立ち上げて、カメラ画像をディスプレイに表示してみたところ正常に表示された。
DMA_Read_IP_87_170320.jpg
  1. 2017年03月23日 04:58 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システム4(ILAコアの挿入2)

Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システム3(ILAコアの挿入)”の続き。

DMA_Read_addr_0 の m_axi_in_r と outs は波形が出ていて動作しているようだった。よって今回は、AXI4-Stream 版のビットマップ・ディスプレイ・コントローラの内部信号をVivado Analyzer で確認してみよう。

Flow Navigator -> Synthesis -> Open Synthesized Design をクリックして、Synthesized Design を開く。

Tools -> Set Up Debug... を選択する。
DMA_Read_IP_56_170320.png

Set Up Debug ダイアログが開いた。
DMA_Read_IP_57_170320.png

Nets to Debug でFind Nets to Add... をクリックする。
DMA_Read_IP_58_170320.png

Find Nets で、h_count を検索してみた。
DMA_Read_IP_59_170320.png

Add Nets to Debug で信号を選択する。
DMA_Read_IP_60_170320.png

観察する信号を示す。
DMA_Read_IP_61_170320.png

次は、ILA Core Options を設定する。
DMA_Read_IP_62_170320.png

Set Up Debug Summary が表示された。
DMA_Read_IP_63_170320.png

Debug 画面が表示された。
DMA_Read_IP_64_170320.png

cam_disp_axis.xdc の制約ファイルに挿入したu_ila_0 の制約が追加された。
DMA_Read_IP_65_170320.png

インプリメント、ビットストリームの生成を行った。結果を示す。
DMA_Read_IP_66_170320.png

SDK でXilinx Tools -> Program FPGA を選択して、ビットストリームをZynq にダウンロードした。
SDK で、Hello_World を起動して、PL にクロックを供給した。
Flow Navigator -> Program and Debug -> Open Hardware Manager -> Auto Connect を選択した。
Hardware Manager が起動した。
Dashboard Optionsを開いて、hw_ila_2, hw_ila_3 のすべてにチェックを入れた。
DMA_Read_IP_67_170320.png

hw_ila_1 のトリガをかけた。AXI4 バス。
DMA_Read_IP_68_170320.png

hw_ila_2 のトリガをかけた。ビットマップ・ディスプレイ・コントローラのclk_disp ドメイン。
DMA_Read_IP_69_170320.png

hw_ila_3 のトリガをかけた。ビットマップ・ディスプレイ・コントローラの clk_axi ドメイン。
DMA_Read_IP_70_170320.png

SDK で cam_disp_hls.elf をRun した。
hw_ila_3 の波形を示す。diap_mode_ena が 1 にならない。しかも init_done_d1 が上がったときに、u_ila_1_war_data_count_1[7:0] が 00 ではなかった。となると、ビットマップ・ディスプレイ・コントローラを活かすのが遅いことが考えられる。
DMA_Read_IP_71_170320.png

cam_disp_hls.c のアプリケーションソフトで、DMA_read_addr の起動の後で、ビットマップ・ディスプレイ・コントローラを活かしていたのだが、これでは、ビットマップ・ディスプレイ・コントローラを活かすのが遅い。ビットマップ・ディスプレイ・コントローラを生かす記述(ピンクの四角)を DMA_read_addr の起動(青の四角)の前に持ってきた。
DMA_Read_IP_72_170320.png

これでうまくDMA Read の波形が出力された。
DMA_Read_IP_73_170320.png

画像も表示された。
DMA_Read_IP_87_170320.jpg

DMA Read とDMA Write が両方表示されている波形を示す。
DMA_Read_IP_74_170320.png
DMA_Read_IP_75_170320.png
  1. 2017年03月21日 04:08 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0
»