FC2カウンター FPGAの部屋 ZYBO

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

FPGAの部屋

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

AXI VDMAのMM2Sを使用してビデオ出力9(プロジェクト休止)

AXI VDMAのMM2Sを使用してビデオ出力8(シミュレーション4)”の続き。

前回、シミュレーションで、AXI GPIO をVTC の aresetn に追加して、1 フレーム目にAXI VMDA のMM2S が出力された。
今回は実機でVivado Analyzer を使って実際にどうなっているかを確かめてみた。

ZYBO ででVivado Analyzer を使って波形を見てみたが、MM2S は当然ながら、プロジェクトの元にしたS2MM も全く動いていなかった。VTC のビデオ信号も出ていない。VTC は v_axi4s_vid_out_0 の vtg_ce から VTC の gen_clken に行く線を削除して、VTC の gen_clken を 1 固定にするとVTC のビデオ信号は出力された。

やはり、どうにもAXI VDMA は相性が悪いみたいで、どうもうまく行かない。”AXI VDMA を使用したカメラ表示システムのフレームレートを 5 fps から 15 fps にする”で自作のビットマップ・ディスプレイ・コントローラを使って、15 fps にはできているので、これで良いことにする。但し、シングル・フレーム・バッファなので、どうしてもジャギーは出てしまうのだが。。。
これは、後で、トリプル・フレーム・バッファ・バージョンを作ることにする。 s2mm_frame_ptr_out(5:0) があるので、どのフレーム・バッファを使用してるか分かるようなので、それを使えば、自作ビットマップ・ディスプレイ・コントローラでもフレーム同期ができるだろう。”AXI Video Direct Memory Access v6.2 LogiCORE IP Product Guide Vivado Design Suite PG020 November 18, 2015 ”参照
AXI VDMA をもう一度やるときは、S2MM 専用AXI VDMA とMM2S 専用AXI VDMA を用意することにする。

次からは自動車の白線検出をOpenCV で実装してからVivado HLS でハードウェア化してみようと思う。
  1. 2016年05月10日 05:21 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

AXI VDMAのMM2Sを使用してビデオ出力8(シミュレーション4)

AXI VDMAのMM2Sを使用してビデオ出力7(実機でテスト)”の続き。

前回はZYBOを使って実機でテストしてみたが、画像は出力されなかった。今回はシミュレーションをもう一度やってみた。

前回のシミュレーションでは、AXI VDMA の設定がVTC のfsync_out (これが、AXI VDMA の mm2s_fsync に接続されている)が出た後だったので、MM2S のスタートが 1 フレーム後になってしまった。今回は、VTC のリセットにAXI GPIO を接続して、AXI VDMA の設定が終了してからVTC のリセットを外すことにする。

video_module にAXI GPIO を追加して、出力をVTC の resetn に入力した。
全体のブロックデザインを示す。
AXI_VDMA_MM2S_42_160507.png

video_module を示す。なお、camera_module は変更がない。
AXI_VDMA_MM2S_43_160507.png

アドレスマップを示す。
AXI_VDMA_MM2S_44_160507.png

AXI GPIO は 0x40000000 番地からマップされている。

これでシミュレーションを行った。AXI GPIO の出力を 1 にするのは、AXI VDMA が設定終了後にしてある。

gpio_io_o が 1 になった時に、AXI VDMA の mm2s_fsync にパルスが入っているのが分かる。
AXI_VDMA_MM2S_39_160507.png

これで、1 フレーム目から MM2S もスタートした。S2MM もスタートしている。画像データ転送が両方向とも問題ない。
AXI_VDMA_MM2S_40_160507.png

でもVGA 出力は出ていない。
AXI_VDMA_MM2S_41_160507.png

AXI4-Stream to Video Out v4.0 LogiCORE IP Product Guide Vivado Design Suite PG044 November 18, 2015
の 32 ページによると locked は 4 フレームかかるらしいので、シミュレーションでは見えないかもしれない?

最後にレジスタの設定リスト vdma_reg_set.txt を示す。

44a00000
0000008B
44a0005c
00000000
44a00060
00000000
44a00064
00000000
44a00058
00000c80
44a00054
00000c80
44a00050
00000258
44a00030
00000003
44a000ac
00000000
44a000B0
00000000
44a000B4
00000000
44a000a8
00000c80
44a000a4
00000c80
44a000a0
00000258
44a20040
00000000
44a20044
80000000
44a20000
00000002
44a10040
00000000
44a10000
00000002
44a40000
00000000
44a40004
00000000
40000000
00000001
ffffffff

  1. 2016年05月07日 20:21 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

AXI VDMAのMM2Sを使用してビデオ出力7(実機でテスト)

AXI VDMAのMM2Sを使用してビデオ出力6(インプリメントしたがエラー)”の続き。

前回はビットストリームの生成まで出来たので、今回は、アプリケーションを作って、ZYBOの実機でテストした。

ビットストリームの生成ができたので、ハードウェアをエクスポートして、SDKを立ち上げた。

cam_disp_axis.c を AXI VDMA の MM2S を使う仕様に変更して、ZYBO実機でテストしてみたが、何も表示されない。ビデオ信号が出ていない感じだ。もう一度、シミュレーションに戻ってやり直してみようと思う。その場合は、VTC のリセットにGPIO を入れて、任意のタイミングでVTC のリセットを外せるようにして、最初のフレームからAXI VDMA のMM2S が動作する状況にしたいと思う。

SDK を示す。
AXI_VDMA_MM2S_38_160506.png

修正した cam_disp_axis.c を示す。

// cam_disp_axis.c
// 2015/06/14 by marsee
// 2016/05/06 : Supporting to the MM2S of AXI VDMA
//
// Refered to Xilinx\SDK\2015.1\data\embeddedsw\XilinxProcessorIPLib\drivers\axivdma_v5_1\doc\html\api
// Refered to https://github.com/elitezhe/Atyls-VDMA-one-in-one-out/blob/master/SDK/colorbar/src/helloworld.c
// Refered to http://www.xilinx.com/support/documentation/ip_documentation/axi_vdma/v6_2/pg020_axi_vdma.pdf
// Refered to http://forums.xilinx.com/t5/Embedded-Processor-System-Design/Axi-VDMA-on-Digilent-Atlys/td-p/297019/page/2
// Refered to https://forums.xilinx.com/xlnx/attachments/xlnx/zaps/5096/1/helloworld.c
//
// normal camera out
//

#include <stdio.h>
#include <stdlib.h>
#include "xaxivdma.h"
#include "xil_io.h"
#include "xparameters.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

static XAxiVdma_DmaSetup Vdma0_WriteCfg, Vdma0_ReadCfg;

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(){
    // malloc frame buffer
    // unsigned int *frame_buffer = (unsigned int *)malloc(HORIZONTAL_PIXELS * VERTICAL_LINES * PIXEL_NUM_OF_BYTES * NUMBER_OF_WRITE_FRAMES);

    // AXI VDMA Initialization sequence
    XAxiVdma_Config *XAxiVdma0_Config;
    XAxiVdma XAxiVdma0;
    int XAxiVdma0_Status;

    XAxiVdma0_Config = XAxiVdma_LookupConfig(XPAR_AXI_VDMA_0_DEVICE_ID); // Look up the hardware configuration for a device instance
    if (XAxiVdma0_Config == NULL){
        fprintf(stderr, "No AXI VDMA found\n");
        return(-1);
    }

    XAxiVdma0_Status = XAxiVdma_CfgInitialize(&XAxiVdma0, XAxiVdma0_Config, XAxiVdma0_Config->BaseAddress); // Initialize the driver with hardware configuration
    if (XAxiVdma0_Status != XST_SUCCESS){
        fprintf(stderr, "XAxiVdma_CfgInitialize() failed\n");
        return(-1);
    }

    // AXI VDMA Write Settings
    XAxiVdma_Reset(&XAxiVdma0, XAXIVDMA_WRITE);
    while(XAxiVdma_ResetNotDone(&XAxiVdma0, XAXIVDMA_WRITE)) ;

    XAxiVdma0_Status = XAxiVdma_SetFrmStore(&XAxiVdma0, NUMBER_OF_WRITE_FRAMES, XAXIVDMA_WRITE); // Set the number of frame store buffers to use.

    Vdma0_WriteCfg.VertSizeInput = VERTICAL_LINES;
    Vdma0_WriteCfg.HoriSizeInput = HORIZONTAL_PIXELS * PIXEL_NUM_OF_BYTES;
    Vdma0_WriteCfg.Stride = HORIZONTAL_PIXELS * PIXEL_NUM_OF_BYTES; // Indicates the number of address bytes between the first pixels of each video line.
    Vdma0_WriteCfg.FrameDelay = 0// Indicates the minimum number of frame buffers the Genlock slave is to be behind the locked master. This field is only used if the channel is enabled for Genlock Slave operations. This field has no meaning in other Genlock modes.
    Vdma0_WriteCfg.EnableCircularBuf = 1// Indicates frame buffer Circular mode or frame buffer Park mode.  1 = Circular Mode Engine continuously circles through frame buffers.
    Vdma0_WriteCfg.EnableSync = 0// Enables Genlock or Dynamic Genlock Synchronization. 0 = Genlock or Dynamic Genlock Synchronization disabled.
    Vdma0_WriteCfg.PointNum = 0// No Gen-Lock
    Vdma0_WriteCfg.EnableFrameCounter = 0// Endless transfers
    Vdma0_WriteCfg.FixedFrameStoreAddr = 0// We are not doing parking

    XAxiVdma0_Status = XAxiVdma_DmaConfig(&XAxiVdma0, XAXIVDMA_WRITE, &Vdma0_WriteCfg);
    if (XAxiVdma0_Status != XST_SUCCESS){
        fprintf(stderr, "XAxiVdma_DmaConfig() failed (XAXIVDMA_WRITE)\n");
        return(-1);
    }

    // AXI VDMA Read Settings
    XAxiVdma_Reset(&XAxiVdma0, XAXIVDMA_READ);
    while(XAxiVdma_ResetNotDone(&XAxiVdma0, XAXIVDMA_READ)) ;

    XAxiVdma0_Status = XAxiVdma_SetFrmStore(&XAxiVdma0, NUMBER_OF_WRITE_FRAMES, XAXIVDMA_READ); // Set the number of frame store buffers to use.

    Vdma0_ReadCfg.VertSizeInput = VERTICAL_LINES;
    Vdma0_ReadCfg.HoriSizeInput = HORIZONTAL_PIXELS * PIXEL_NUM_OF_BYTES;
    Vdma0_ReadCfg.Stride = HORIZONTAL_PIXELS * PIXEL_NUM_OF_BYTES; // Indicates the number of address bytes between the first pixels of each video line.
    Vdma0_ReadCfg.FrameDelay = 0// Indicates the minimum number of frame buffers the Genlock slave is to be behind the locked master. This field is only used if the channel is enabled for Genlock Slave operations. This field has no meaning in other Genlock modes.
    Vdma0_ReadCfg.EnableCircularBuf = 1// Indicates frame buffer Circular mode or frame buffer Park mode.  1 = Circular Mode Engine continuously circles through frame buffers.
    Vdma0_ReadCfg.EnableSync = 0// Enables Genlock or Dynamic Genlock Synchronization. 0 = Genlock or Dynamic Genlock Synchronization disabled.
    Vdma0_ReadCfg.PointNum = 0// No Gen-Lock
    Vdma0_ReadCfg.EnableFrameCounter = 0// Endless transfers
    Vdma0_ReadCfg.FixedFrameStoreAddr = 0// We are not doing parking

    XAxiVdma0_Status = XAxiVdma_DmaConfig(&XAxiVdma0, XAXIVDMA_READ, &Vdma0_ReadCfg);
    if (XAxiVdma0_Status != XST_SUCCESS){
        fprintf(stderr, "XAxiVdma_DmaConfig() failed (XAXIVDMA_READ)\n");
        return(-1);
    }

    // Frame buffer address set
    unsigned int frame_addr = (unsigned int)FRAME_BUFFER_ADDRESS;
    int i;
    for (i=0; i<NUMBER_OF_WRITE_FRAMES; i++){
        Vdma0_WriteCfg.FrameStoreStartAddr[i] = frame_addr;
        Vdma0_ReadCfg.FrameStoreStartAddr[i] = frame_addr;
        frame_addr += HORIZONTAL_PIXELS * PIXEL_NUM_OF_BYTES * VERTICAL_LINES;
    }

    XAxiVdma0_Status = XAxiVdma_DmaSetBufferAddr(&XAxiVdma0, XAXIVDMA_WRITE, Vdma0_WriteCfg.FrameStoreStartAddr);
    if (XAxiVdma0_Status != XST_SUCCESS){
        fprintf(stderr, "XAxiVdma_DmaSetBufferAddr() failed (XAXIVDMA_WRITE)\n");
        return(-1);
    }

    XAxiVdma0_Status = XAxiVdma_DmaSetBufferAddr(&XAxiVdma0, XAXIVDMA_READ, Vdma0_ReadCfg.FrameStoreStartAddr);
    if (XAxiVdma0_Status != XST_SUCCESS){
        fprintf(stderr, "XAxiVdma_DmaSetBufferAddr() failed (XAXIVDMA_READ)\n");
        return(-1);
    }

    // axis_switch_1, 1to2 ,Select M00_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_MODULE_AXIS_SWITCH_1_BASEADDR+0x40), 0x0);
    Xil_Out32((XPAR_CAMERA_MODULE_AXIS_SWITCH_1_BASEADDR+0x44), 0x80000000); // disable
    Xil_Out32((XPAR_CAMERA_MODULE_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_MODULE_AXIS_SWITCH_1_DEVICE_ID+0x40), 0x0);
    Xil_Out32((XPAR_CAMERA_MODULE_AXIS_SWITCH_1_DEVICE_ID), 0x2); // Commit registers

    // VDMA start
    XAxiVdma0_Status = XAxiVdma_DmaStart(&XAxiVdma0, XAXIVDMA_WRITE);
    if (XAxiVdma0_Status != XST_SUCCESS){
        fprintf(stderr, "XAxiVdma_DmaStart() failed (XAXIVDMA_WRITE)\n");
        return(-1);
    }
    XAxiVdma0_Status = XAxiVdma_DmaStart(&XAxiVdma0, XAXIVDMA_READ);
    if (XAxiVdma0_Status != XST_SUCCESS){
        fprintf(stderr, "XAxiVdma_DmaStart() failed (XAXIVDMA_READ)\n");
        return(-1);
    }

    // mt9d111_inf_axis_0, axi_iic_0
    volatile unsigned int *mt9d111_axi_lites;
    volatile unsigned int *mt9d111_i2c_axi_lites;

    mt9d111_axi_lites = (volatile unsigned *)XPAR_CAMERA_MODULE_MT9D111_INF_AXIS_0_BASEADDR;
    mt9d111_i2c_axi_lites = (volatile unsigned *)XPAR_CAMERA_MODULE_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, 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年05月06日 06:13 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

AXI VDMAのMM2Sを使用してビデオ出力6(インプリメントしたがエラー)

AXI VDMAのMM2Sを使用してビデオ出力5(シミュレーション3)”の続き。

前回、v_axis_vid_out IP が出力していないのが不安ではあるが、AXI VDMA からは出力が出ているので、ZYBO 実機で試してみようということで、ブロックデザインを修正して論理合成、インプリメントしてみたが、エラーが出てしまった。

シミュレーションを元にブロックデザインを修正した。ブロックデザインを示す。
AXI_VDMA_MM2S_27_160505.png

AXI_VDMA_MM2S_28_160505.png

AXI_VDMA_MM2S_29_160505.png

これでビットストリームの生成を行ったところ、route_design でエラーが出てしまった。
AXI_VDMA_MM2S_30_160505.png

MMCM のVCO の周波数が 200 MHz で動作範囲の 600 MHz ~ 1200 MHz に入らないというエラーだった。

rgb2dvi IP の設定を見てみた。TDMS clock range は >= 120 MHz になっているが、< 120 MHz でも同様にダメだった。
AXI_VDMA_MM2S_31_160505.png

rgb2dvi を右クリックして、右クリックメニューから Edit in IP Packager を選択して、IP を編集した。

rgb2dvi のプロジェクトを開いて、rgb2dvi.vhd を開くと、kClkRange には >= 40 MHz の設定があるけど、これが表に出ていないことが分かった。ちなみに、kClkRange の値は5倍されて、入力クロックの動作周波数に掛けられるので、40 MHz x ( 3 x 5) = 600 MHz で MMCM の VCO の動作範囲に入る。
AXI_VDMA_MM2S_32_160505.png

Package IP の Customization Parameters を見ると、kClkRange の Value Validation List に 40 MHz が無いので、追加すればよい。
AXI_VDMA_MM2S_33_160505.png

kClkRange の Value Validation List をダブルクリックするとダイアログが開いたので、 >= 40 MHz (SVGA の 3 を追加した。
AXI_VDMA_MM2S_34_160505.png

Package IP の Customization Parameters に戻ると、 >= 40 MHz (SVGA が増えていた。
AXI_VDMA_MM2S_35_160505.png

rgb2dvi IP を再パッケージして、元のプロジェクトに戻った。

Tool メニュー -> Report -> Report IP Status を選択して、IP Status を表示して、IP をアップグレードした。

rgb2dvi IP をダブルクリックすると、設定画面が開いたので、>= 40 MHz (SVGA のラジオボタンをクリックして選択した。
AXI_VDMA_MM2S_36_160505.png

もう一度ビットストリームの生成を行った。今度は成功した。
AXI_VDMA_MM2S_37_160505.png
  1. 2016年05月05日 06:27 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

AXI VDMAのMM2Sを使用してビデオ出力5(シミュレーション3)

AXI VDMAのMM2Sを使用してビデオ出力4(シミュレーション2)”の続き。

(2016/05/03:修正 MM2S の設定も入っていたので、ブログ記事を書き換えました)

reg_set_axi_lite_master IP のレジスタ設定ファイル vdma_reg_set.txt にアドレスと設定値を入れて、シミュレーションを行った。
最初はAXI VDMA の MM2S の設定で、その後は、AXI4-Stream Switcher の設定がある。
試しなので、現在動作している MM2S のみで、S2MM の設定はまだない。
AXI VDMA の設定値は”AXI VDMAのレジスタ設定(Triple Frame Buffer)”を参照した。
vdma_reg_set.txt を示す。

44a00000
0000008B
44a0005c
00000000
44a00060
00000000
44a00064
00000000
44a00058
00000c80
44a00054
00000c80
44a00050
00000258
44a00030
00000003
44a000ac
00000000
44a000B0
00000000
44a000B4
00000000
44a000a8
00000c80
44a000a4
00000c80
44a000a0
00000258
44a20040
00000000
44a20044
80000000
44a20000
00000002
44a10040
00000000
44a10000
00000002
44a40000
00000000
44a40004
00000000
ffffffff


これで論理シミュレーションを行った。
reg_set_axi_lite_master IP の波形を示す。 reg_set_axi_lite_master のAXI4 Lite Master の波形を示す。
AXI_VDMA_MM2S_20_160502.png

正常に設定できるようだ。

次に、AXI VDMA の S2MM のAXI インターフェースの信号を見た。正常に画像データをフレームバッファにWrite できているようだ。
AXI_VDMA_MM2S_21_160502.png

AXI VDMA の S2MMのAXI インターフェースの信号を拡大してみたが、8 バーストのバースト転送が行われているようだ。
AXI_VDMA_MM2S_22_160502.png

AXI VDMA の MM2S が最初のフレームにスタートしないのは、VTC の fsync_out が AXI VDMA の設定を行う前にアサートされているからのようだ。VTC の fsync_out は AXI VDMA の mm2s_fsync に入っている。 mm2s_fsync が入っていないので、DMA がスタートしないようだ。
AXI_VDMA_MM2S_23_160503.png

従って、 AXI VDMA の mm2s_fsync が適切に入る2フレーム目では、AXI VDMA の mm2s 転送が行われている。
AXI_VDMA_MM2S_24_160503.png

AXI VDMA の mm2s 転送のはじめの部分を拡大してみた。
AXI_VDMA_MM2S_25_160503.png

これで、AXI VDMA の mm2s 転送は動作しているが、まだ、VGA出力には画像が出力されていない。
それは、v_axis_vid_out IP が出力していないからのようだ。 locked が 0 のままだ。
AXI_VDMA_MM2S_26_160503.png

これはもっとシミュレーションしないと出力が出ないのかもしれない?
以前は、同様の回路で出力が出ていたので、インプリメントしてやってみようと思う。

なお、AXI VDMA の mm2s のアプリケーションの書き方は、Xilinx フォーラムの AXI VDMA 設定アプリケーションのサンプルを参考にしようと思う。
  1. 2016年05月03日 04:55 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

AXI VDMA を使用したカメラ表示システムのフレームレートを 5 fps から 15 fps にする

AXI VDMA の S2MMで、3 フレームバッファ以上しか設定できないので、カメラの画像を 3 つのフレームバッファに入力していた。それを 1 つのフレームバッファしか扱えない自作のビットマップ・ディスプレイ・コントローラで画像を表示したので、3 つのフレームバッファの内の 1 つのフレームバッファしか表示用に使用できないので、フレームレートが 1/3 になっていた。
カメラのフレームレートは 15 fps なので、実質、5 fps になっていたわけだ。

今のところ、3 つのフレームバッファは連続的にアドレスを割り振っている。今日、シミュレーション用の設定定義ファイルを書いていた時に、気がついた。3 つのフレームバッファのアドレスをビットマップ・ディスプレイ・コントローラのアドレスだけにすればフレームレートは 1/1 じゃないか?と。。。つまり、3 つのフレームバッファのアドレスを同一にする訳だ。
それはフレームバッファのアドレスセットの文のアドレスを計算する部分をコメントアウトすれば良い。
AXI_VDMA_MM2S_16_160501.png

これでやってみたら、上手く行った。
AXI VDMA の S2MM を使わないでフレームレートが 3 倍になった。
しかし、今まで思いつかなかったところがどうしょうもない。。。

これで、AXI VDMA の S2MM を使うモチベーションは無くなったが、AXI VDMA の S2MM を使うと画像にジャギーが出ないはずので、シミュレーションだけでもやってみたいと思う。
  1. 2016年05月01日 06:00 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

AXI VDMAのMM2Sを使用してビデオ出力4(シミュレーション2)

AXI VDMAのMM2Sを使用してビデオ出力3(シミュレーション1)”の続き。

前回はシミュレーション時にエラーが出てしまった。今回はシミュレーション時のエラーを解消した。具体的には、rgb2dvi IP を削除した。

前回、シミュレーション時のエラーは rgb2dvi IP のみで発生しているので、それを削除しようということになったが、今回、結局 rgb2dvi IP を削除した。
そして、バグを発見した reset はアクティブ・ローだったので resetn に変更した。テストベンチもリセットがアクティブ・ハイの仕様になっていたので、2日間、回路が動作しなかった。orz...
発覚後、直ぐに修正。

また、reg_set_axi_lite_master IP のバージョンも古かった。”Vivado 2014.4でのVerilog HDLで記述したROM の初期化データの扱い”を参考にして新しい reg_set_axi_lite_master IP に入れ替えた。
新しいプロジェクトとV_ZYBO_CAMDS ブロックデザインを示す。
AXI_VDMA_MM2S_9_160430.png

(2016/05/02:変更) VTC の AXI4 Lite インターフェースの Slaveを削除した。

AXI_VDMA_MM2S_17_160502.png

AXI_VDMA_MM2S_11_160430.png

AXI_VDMA_MM2S_18_160502.png

シミュレーションを行った。
AXI_VDMA_MM2S_13_160430.png

reg_set_axi_lite_master がレジスタを設定しているのが見える。
AXI_VDMA_MM2S_14_160430.png

でも、まだ動いたばかりでAXI VDMA のアドレスと設定値がいい加減なので、設定値を決める必要がある。

(2016/05/01:追記)(2016/05/02:変更)
アドレスマップを追加しておく。
AXI_VDMA_MM2S_19_160502.png
  1. 2016年04月30日 06:40 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0