FC2カウンター FPGAの部屋 Ultra96用PMOD拡張ボードでカメラ入力11(Vivado 2018.2のcam_test_182プロジェクト8)
FC2ブログ

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

FPGAの部屋

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

Ultra96用PMOD拡張ボードでカメラ入力11(Vivado 2018.2のcam_test_182プロジェクト8)

Ultra96用PMOD拡張ボードでカメラ入力10(Vivado 2018.2のcam_test_182プロジェクト7)”の続き。

前回は、動作しなかったDMA_Write_SFB を修正したVivado HLS プロジェクトで、もう一度、C シミュレーション、C コードの合成、C/RTL 強調シミュレーション、Export RTL を行った。今回は、前回生成されたIP を使用して、もう一度、カメラのデータがフレーム・バッファにDMA されるのか?を確かめてみよう。

DMA_Write_sFB IP を入れ替えるのに、ブロック・デザインでDebug をすべて消してから、DMA_Write_sFB IP を入れ替えて、もう一度、DMA_Write_sFB IP のAXI4-Stream とAXI4-Master にDebug を設定した。そのブロック・デザインを示す。
DMA_Write_sFB_53_181119.png

その時のAddress Editor 画面を示す。
DMA_Write_sFB_54_181119.png

論理合成、インプリメンテーション、ビットストリームの生成を行った。サーマリを示す。
DMA_Write_sFB_55_181119.png

ハードウェアをエクスポートして、SDK を起動した。
Program FPGA を行って、cam_test.elf を起動した。
DMA_Write_sFB_63_181120.png

Vivado に戻ってVivado Analyzer で確認した。
DMA_Write_sFB_52_181119.png

AXI4 のトランザクションがいい感じに動作している。うまく行ったようだ。
すでに、起動してあったgtkterm にactive_frame の表示が出た。active_frame が変化しているので、問題なさそうだ。良かった。
DMA_Write_sFB_64_181120.png

波形を拡大した。
DMA_Write_sFB_65_181120.png

AXI4-Stream のTREADY は 1 のままでDMA_Write_sFB の待受準備はいつも出来ていることが分かる。一方、TVALID は間欠的に来るので、カメラのデータ・レートがインターフェースのスピードよりも遅いことが分かる。予定通りだ。

最後に修正した。cam_test.c を貼っておく。

/*
 * cam_test.c
 *
 *  Created on: 2018/11/15
 *      Author: masaaki
 */

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

#include "xdma_write_sfb.h"

#define FRAME_BUFFER_ADDRESS 0x10000000
#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

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_write_sfb dmaw;
    int active_frame;

    XDma_write_sfb_Initialize(&dmaw, 0);
    XDma_write_sfb_Set_fb0_V(&dmaw, FRAME_BUFFER_ADDRESS);
    XDma_write_sfb_Set_fb1_V(&dmaw, FRAME_BUFFER_ADDRESS);
    XDma_write_sfb_Set_fb2_V(&dmaw, FRAME_BUFFER_ADDRESS);
    XDma_write_sfb_Start(&dmaw);
    XDma_write_sfb_EnableAutoRestart(&dmaw);

    volatile unsigned int *mt9d111_axi_lites;
    volatile unsigned int *mt9d111_i2c_axi_lites;

    mt9d111_axi_lites = (volatile unsigned *)XPAR_MT9D111_INF_AXIS_0_BASEADDR;
    mt9d111_i2c_axi_lites = (volatile unsigned *)XPAR_AXI_IIC_0_BASEADDR;

    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, 0xf0, 0x1);      // Changed regster map to IFP page 1
    cam_i2c_write(mt9d111_i2c_axi_lites, 0xba, 0x97, 0x20);     // RGB Mode, RGB565

    mt9d111_axi_lites[1] = 0; // One_shot_mode is disabled

    for(int i=0; i<20; i++){
        active_frame = (int)XDma_write_sfb_Get_active_frame_V(&dmaw);
        printf("active_frame = %d\n", active_frame);
        usleep(66667);
    }

    return(0);
}

  1. 2018年11月22日 04:54 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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