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

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

FPGAの部屋

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

ZedBoard Linux のフレームバッファにカメラ画像を表示8(カメラ画像表示成功)

前回、画面表示できないバグがわかってVHDLコードを修正したので、今回はインプリメントして確かめてみた。
インプリメント後に、ZedBoardにコンフィグレーション、ソフトウェア起動後、画像が表示できました(Linux は起動していない状態)。
ZedBoard_Linux_66_130210.jpg
(昼間なので、日の光でディスプレイ画面が光ってしまった)

ChipScope Pro Analyzer で波形を見てみた。
最初に、Camera Controller (mt9d111_inf_axi_master_0) のタイミング波形を示す。
ZedBoard_Linux_62_130209.png

アドレスも0x1Axxxxxx に入っていて、転送も正しく出来ていることが分かる。
最初のトランザクションを拡大してみた。
ZedBoard_Linux_63_130209.png

このWrite トランザクションは、0x1A000000番地に、0x00A0845800604C30 をWriteしている。最後のWriteデータ転送が終了してから、MON_AXI_BVALID がアサートされるまでに、54クロック経過している。

次に、Bitmap Display Controller (bitmap_disp_cntrler_axi_master_0) の波形を観察した。下にタイミング波形を示す。
ZedBoard_Linux_64_130209.png

1つのReadトランザクションを拡大した。
ZedBoard_Linux_65_130209.png

アドレスを発行してからReadデータ転送を始めるまでのレイテンシが長い。63クロック、クロック周波数は100MHzなので、630nsec 経過している。また、MON_AXI_RVALID が1と0を交互に行ったり来たりしている。バースト転送のスループットを計算してみよう。バーストデータ転送数はMON_AXI_ARLEN が0x3Fなので、64個となる。64個の転送に105クロック必要としていたので、スループットを計算する式は以下のようになる。

(1回の転送バイト数)8 バイト x 100(MHz) x 64/105 ≒ 488(MBytes/sec)

最大転送スループットは、800MBytes/sec なので、半分近くにまで落ちている。

下に、現在使用しているCMOSカメラ制御用ソフトウェアを貼っておく。今回、自分のIPでHDMIは使用していないので、設定はしていない。

/* * cam_disp3.c * *  Created on: 2013/02/01 *      Author: Masaaki */

#include "xparameters.h"
#include "xgpio.h"

void cam_iic_init(void) {
  Xil_Out32((XPAR_AXI_IIC_MT9D111_BASEADDR + 0x100), 0x002); // reset tx fifo
  Xil_Out32((XPAR_AXI_IIC_MT9D111_BASEADDR + 0x100), 0x001); // enable iic
}

void cam_iic_write(u32 device_addr, u32 write_addr, u32 write_data) {
  Xil_Out32((XPAR_AXI_IIC_MT9D111_BASEADDR + 0x108), (0x100 | (device_addr & 0xfe))); // Slave IIC Write Address
  Xil_Out32((XPAR_AXI_IIC_MT9D111_BASEADDR + 0x108), write_addr); // address
  Xil_Out32((XPAR_AXI_IIC_MT9D111_BASEADDR + 0x108), ((write_data >> 8)|0xff)); // first data
  Xil_Out32((XPAR_AXI_IIC_MT9D111_BASEADDR + 0x108), (0x200 | (write_data & 0xff))); // second data
  cam_iic_write_sync();
}

void cam_iic_write_sync(void) {
    while ((Xil_In32(XPAR_AXI_IIC_MT9D111_BASEADDR + 0x104) & 0x84) != 0x80) ; // No Bus Busy and TX_FIFO_Empty = 1
}


u32 cam_iic_read(u32 device_addr, u32 read_addr) {
  u32 read_data;
  Xil_Out32((XPAR_AXI_IIC_MT9D111_BASEADDR + 0x108), (0x100 | (device_addr & 0xfe))); // Slave IIC Write Address
  Xil_Out32((XPAR_AXI_IIC_MT9D111_BASEADDR + 0x108), read_addr); // address
  Xil_Out32((XPAR_AXI_IIC_MT9D111_BASEADDR + 0x108), (0x101 | device_addr)); // Slave IIC Read Address
  Xil_Out32((XPAR_AXI_IIC_MT9D111_BASEADDR + 0x108), 0x202); // 2 bytes data
  while ((Xil_In32(XPAR_AXI_IIC_MT9D111_BASEADDR + 0x104) & 0x40) == 0x40) ;
  read_data = Xil_In32(XPAR_AXI_IIC_MT9D111_BASEADDR + 0x10c) & 0xff;
  read_data = read_data<<8 | (Xil_In32(XPAR_AXI_IIC_MT9D111_BASEADDR + 0x10c) & 0xff);
  return(read_data);
}

int main()
{
    static XGpio GPIOInstance_Ptr;
    int xStatus;

    // AXI GPIO Initialization
    xStatus = XGpio_Initialize(&GPIOInstance_Ptr,XPAR_AXI_GPIO_0_DEVICE_ID);
    if(XST_SUCCESS != xStatus)
        print("GPIO INIT FAILED\n\r");
    // AXI GPIO Set the Direction(Output setting)
    XGpio_SetDataDirection(&GPIOInstance_Ptr, 10);
    // init_doneに1を出力
    XGpio_DiscreteWrite(&GPIOInstance_Ptr, 11);

    // CMOS Camera initialize, MT9D111
    // デフォルト値だったので設定を止めた
    cam_iic_init();
    
    cam_iic_write(0xba, 0xf00x1);        // IFP page 1 へレジスタ・マップを切り替える
    cam_iic_write(0xba, 0x970x20);    // RGB Mode, RGB565
    //cam_iic_write(0xba, 0xf0, 0x0);        // Sensor Resigter へレジスタ・マップを切り替える
    //regval = cam_iic_read(0xbb, 0x20, 1);
    //cam_iic_write(0xba, 0x20, (regval | 0x1));        // Read out rows from bottom to top (upside down).
    //cam_iic_write(0xba, 0x01, 0x4EB);        // Row Start (row start + row size -1)
    cam_iic_write_sync();
    
    return 0;
}


上記のソフトウェアを動作させないとVGAにカメラ画像を表示できないので、Linuxを起動した時にカメラ画像を表示できていない。次回はLinux上で同様の動作をするソフトウェアを作成して、Linux上でカメラ画像を表示してみたい。
  1. 2013年02月10日 05:21 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0