FC2カウンター FPGAの部屋 Vivado 2016.2 からVivado 2016.3 へアップグレード
fc2ブログ

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

FPGAの部屋

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

Vivado 2016.2 からVivado 2016.3 へアップグレード

Vivadoを使用してZYBO_0_163_6フォルダのプロジェクトにRGB2HSV IPを追加3(SDK2)”でVivado 2016.3 への乗り換えはあきらめたはずだったが、ツィッターで複数に人に新規作成してアップグレードすることを勧められたのもあって、プロジェクトを新規作成してVivado 2016.3 へアップグレードすることにした。道のりは結構長かったです。。。

ブロックデザインを新規作成するととっても面倒なので、ブロックデザインを作成するTCLスクリプトを出力して、ブロックデザインを自動生成してもらおう。

最初に、Vivado 2016.2 のZYBO_0_162_6 フォルダのプロジェクトを開き、ブロックデザインを開いた。

File メニュー -> Export -> Export Block Design... を選択した。
vivado_2016_3_35_161024.png

Export Block Design ダイアログ。ZYBO_0.tcl という名前で出力される。
vivado_2016_3_36_161024.png

Vivado 2016.3 で ZYBO_0_163_6 プロジェクトを新規作成した。
vivado_2016_3_37_161024.png

先ほど出力したZYBO_0.tcl をZYBO_0_163_6 フォルダにコピー&ペーストした。
vivado_2016_3_38_161024.png

ZYBO_0.tcl を開いて、「set scripts_vivado_version 2016.2」を「set scripts_vivado_version 2016.3」に変更して、セーブした。
vivado_2016_3_39_161024.png

Vivado 2016.2 のZYBO_0_162_6 フォルダのIP フォルダをすべてZYBO_0_163_6 フォルダにコピーした。
vivado_2016_3_40_161024.png

IP Catalog を開いて、Add Repository を行った。先ほどコピー&ペーストしたIP をすべて選択した。
vivado_2016_3_41_161024.png

IP Catalog にすべてのIP が登録できた。
vivado_2016_3_42_161024.png

Tcl Console を開いて、ZYBO_0_163_6 フォルダに cd し、

source ZYBO_0.tcl

を起動した。
vivado_2016_3_43_161024.png

ZYBO_0 ブロックデザインが完成した。
vivado_2016_3_44_161024.png

Refresh IP Catalog をクリックした。
IP Status が表示された。すべてUpgrade できているのかな?
vivado_2016_3_45_161024.png

ZYBO_0 ブロックデザインのHDL Wapper を生成した。
vivado_2016_3_46_161024.png

ZYBO_0.xdc を新規作成して、ZYBO_0_162_6 フォルダのプロジェクトのXDC ファイルの中身をコピー&ペーストした。
vivado_2016_3_47_161024.png

論理合成、インプリメント、ビットストリームの生成を行った。
論理合成は、multiple block runs が最初に走って、各IP ごとに論理合成しているようだ。後で、AXI_IIC IP を更新して論理合成すると、そのIP だけを合成しているようだった。更新時の論理合成時間の短縮が図れているようだった。
vivado_2016_3_48_161024.png

インプリメントでエラー発生。LUT が足りないと言われている。どこかで見たエラーだ。
vivado_2016_3_49_161024.png

Utilization を見てみるとやはりAXI Interconnect のLUT 占有率が大きい。
vivado_2016_3_50_161024.png

Vivado 2016.2 のプロジェクトをVivado 2016.3 にアップグレードすると動作しなかった2(解決編)”と同様に、AXI Interconnect を削除して、もう一度、Run Connection Automation でAXI Interconnect を入れなおすとインプリメントが通った。ビットストリームの生成も行った。結果を示す。
vivado_2016_3_51_161024.png

ハードウェアをエクスポートして、SDK を立ち上げ、cam_disp_lgh アプリケーション・プロジェクトを新規作成した。

cam_disp_lgh.c を作成した。

ZYBO にビットストリームをダウンロードして、cam_disp_lgh.elf を起動したところ、カメラ画像が表示された。
vivado_2016_3_52_161024.png

長かったが、やっとVivado 2016.3 に移行できた。
IP を更新したときの論理合成が速くなっているようなので、やはりVivado 2016.3 を使いたい。でもバグがたくさんあるものとして注意深く使うことにしよう。

最後に、cam_disp_lgh.c を貼っておく。

/* * cam_disp_lgh.c * *  Created on: 2016/10/22 *      Author: Masaaki */

#include <stdio.h>
#include <stdlib.h>
#include "xil_io.h"
#include "xparameters.h"
#include "sleep.h"

#include "xdmaw4gabor.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 ALL_DISP_ADDRESS    (HORIZONTAL_PIXELS*VERTICAL_LINES*PIXEL_NUM_OF_BYTES)

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(){
    XDmaw4gabor xdma4g;

    // axis_switch_1, 1to2 ,Select M00_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x40), 0x0);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x44), 0x80000000); // disable
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x48), 0x80000000); // disable
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x4C), 0x80000000); // disable
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR), 0x2); // Commit registers

    // axis_switch_0, 2to1, Select S00_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR+0x40), 0x0);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR), 0x2); // Commit registers

    XDmaw4gabor_Initialize(&xdma4g, 0);
    XDmaw4gabor_Set_frame_buffer0(&xdma4g, FRAME_BUFFER_ADDRESS);
    XDmaw4gabor_Set_frame_buffer1(&xdma4g, FRAME_BUFFER_ADDRESS);
    XDmaw4gabor_Start(&xdma4g);
    XDmaw4gabor_EnableAutoRestart(&xdma4g);

    // mt9d111_inf_axis_0, axi_iic_0, bitmap_disp_cntrler_axi_master_0
    volatile unsigned int *bmdc0_axi_lites;
    volatile unsigned int *bmdc1_axi_lites;
    volatile unsigned int *mt9d111_axi_lites;
    volatile unsigned int *mt9d111_i2c_axi_lites;

    bmdc0_axi_lites = (volatile unsigned *)XPAR_BITMAP_DISP_CNTRLER_AXI_MASTER_0_BASEADDR;
    bmdc1_axi_lites = (volatile unsigned *)XPAR_BITMAP_DISP_CNTRLER_AXI_MASTER_1_BASEADDR;
    mt9d111_axi_lites = (volatile unsigned *)XPAR_CAMERA_INTERFACE_MT9D111_INF_AXIS_0_BASEADDR;
    mt9d111_i2c_axi_lites = (volatile unsigned *)XPAR_CAMERA_INTERFACE_AXI_IIC_0_BASEADDR;

    bmdc0_axi_lites[0] = (volatile unsigned int)FRAME_BUFFER_ADDRESS; // Bitmap Display Controller 0 start
    bmdc1_axi_lites[0] = (volatile unsigned int)FRAME_BUFFER_ADDRESS; // Bitmap Display Controller 1 start
    mt9d111_axi_lites[0] = (volatile unsigned int)FRAME_BUFFER_ADDRESS; // Camera Interface start (Address is dummy)

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

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

    mt9d111_axi_lites[1] = 0// One_shot_mode is disabled

    return(0);
}

  1. 2016年10月25日 04:30 |
  2. Vivado
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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