Jump to content

    
Sign in to follow this  
Valkaryn

Microblaze + DDR3 + user_module

Recommended Posts

Здравствуйте.

 

Я в данный момент пробую разобраться, как записывать и считывать данные на/с DDR3. В целом задача состоит в том, что с АЦП поступают данные, которые затем я и хочу записать на DDR-ку. В XPS ещё до меня была уже собрана схема таким образом, что запись/чтение производится посредством CDMA.

Мне же нужно в SDK написать такой код, чтобы данные записывались в память. Я что-то написал, но пока что временно нет возможности проверить, правильно ли и будет ли вообще это работать.

Если необходимо, то работаю я с Virtex-6 (xc6vlx240t).

Код прилагается (не весь, а только основная часть):

int XAxiCdma_Run (XAxiCdma *InstancePtr, u16 DeviceId)
{
    XAxiCdma_Config *CfgPtr;
    int Status;
    int SubmitTries = 1;    /* Retry to submit */
    int Tries = NUMBER_OF_TRANSFERS;
    int Index;

    /*
     * Initialize the XAxiCdma device.
     */
    CfgPtr = XAxiCdma_LookupConfig(DeviceId);
    if (!CfgPtr) {
        print("XAxiCdma_LookupConfig failed!\n");
        return XST_FAILURE;
    }

    Status = XAxiCdma_CfgInitialize(InstancePtr, CfgPtr, CfgPtr->BaseAddress);
    if (Status != XST_SUCCESS) {
        print("XAxiCdma_CfgInitialize failed!\n");
        return XST_FAILURE;
    }

    /*
     * Setup the interrupt system
     */
    // Status = SetupIntrSystem

    /*
     * Enable all (completion/error/delay) interrupts
     */
    XAxiCdma_IntrEnable (InstancePtr, XAXICDMA_XR_IRQ_ALL_MASK);

    for (Index = 0; Index < Tries; Index++) {
        Status = CDMATransfer (InstancePtr,
                BUFFER_BYTESIZE, SubmitTries);

        if (Status != XST_SUCCESS) {
            //DisableIntrSystem (IntcInstancePtr, IntrId);
            return XST_FAILURE;
        }
    }

    /*
     * Test finishes successfully, clean up and return
     */
    XAxiCdma_IntrDisable(InstancePtr, XAXICDMA_XR_IRQ_ALL_MASK);

    return XST_SUCCESS;
}

 

static int CDMATransfer (XAxiCdma *InstancePtr, int Length, int Retries)
{
    int Status;
    Done = 0;
    Error = 0;

    printf("Start Transfer \n\r");
    /*
     * Try to start the DMA transfer
     */
    Done = 0;
    Error = 0;
    /*
     * Flush the SrcBuffer before the DMA transfer, in case the Data Cache
     * is enabled
     */
    Xil_DCacheFlushRange ((u32)SourceAddr, Length);

    Status = XAxiCdma_SimpleTransfer (InstancePtr,
                                    (u32)(u8 *) (SourceAddr ),
                                    (u32)(DestAddr),
                                    Length,
                                    Cdma_Callback,
                                    (void *)InstancePtr);
    if (Status == XST_FAILURE) {
        printf ("Error in Transfer \n\r");
        return 1;
    }
}

 

Вот. Посмотрите, пожалуйста, и скажите, может, я где-то ошибся или что-то упустил?

 

Заранее спасибо.

Share this post


Link to post
Share on other sites
Здравствуйте.

 

Я в данный момент пробую разобраться, как записывать и считывать данные на/с DDR3. В целом задача состоит в том, что с АЦП поступают данные, которые затем я и хочу записать на DDR-ку. В XPS ещё до меня была уже собрана схема таким образом, что запись/чтение производится посредством CDMA.

Мне же нужно в SDK написать такой код, чтобы данные записывались в память. Я что-то написал, но пока что временно нет возможности проверить, правильно ли и будет ли вообще это работать.

Если необходимо, то работаю я с Virtex-6 (xc6vlx240t).

Код прилагается (не весь, а только основная часть):

int XAxiCdma_Run (XAxiCdma *InstancePtr, u16 DeviceId)
{
    XAxiCdma_Config *CfgPtr;
    int Status;
    int SubmitTries = 1;    /* Retry to submit */
    int Tries = NUMBER_OF_TRANSFERS;
    int Index;

    /*
     * Initialize the XAxiCdma device.
     */
    CfgPtr = XAxiCdma_LookupConfig(DeviceId);
    if (!CfgPtr) {
        print("XAxiCdma_LookupConfig failed!\n");
        return XST_FAILURE;
    }

    Status = XAxiCdma_CfgInitialize(InstancePtr, CfgPtr, CfgPtr->BaseAddress);
    if (Status != XST_SUCCESS) {
        print("XAxiCdma_CfgInitialize failed!\n");
        return XST_FAILURE;
    }

    /*
     * Setup the interrupt system
     */
    // Status = SetupIntrSystem

    /*
     * Enable all (completion/error/delay) interrupts
     */
    XAxiCdma_IntrEnable (InstancePtr, XAXICDMA_XR_IRQ_ALL_MASK);

    for (Index = 0; Index < Tries; Index++) {
        Status = CDMATransfer (InstancePtr,
                BUFFER_BYTESIZE, SubmitTries);

        if (Status != XST_SUCCESS) {
            //DisableIntrSystem (IntcInstancePtr, IntrId);
            return XST_FAILURE;
        }
    }

    /*
     * Test finishes successfully, clean up and return
     */
    XAxiCdma_IntrDisable(InstancePtr, XAXICDMA_XR_IRQ_ALL_MASK);

    return XST_SUCCESS;
}

 

static int CDMATransfer (XAxiCdma *InstancePtr, int Length, int Retries)
{
    int Status;
    Done = 0;
    Error = 0;

    printf("Start Transfer \n\r");
    /*
     * Try to start the DMA transfer
     */
    Done = 0;
    Error = 0;
    /*
     * Flush the SrcBuffer before the DMA transfer, in case the Data Cache
     * is enabled
     */
    Xil_DCacheFlushRange ((u32)SourceAddr, Length);

    Status = XAxiCdma_SimpleTransfer (InstancePtr,
                                    (u32)(u8 *) (SourceAddr ),
                                    (u32)(DestAddr),
                                    Length,
                                    Cdma_Callback,
                                    (void *)InstancePtr);
    if (Status == XST_FAILURE) {
        printf ("Error in Transfer \n\r");
        return 1;
    }
}

 

Вот. Посмотрите, пожалуйста, и скажите, может, я где-то ошибся или что-то упустил?

 

Заранее спасибо.

 

Вы не указали каким образом данные от АЦП приходят в вашу систему с Микроблейзом.

Можно решить так. Берете DMA со входом stream и выходом memory mapped. Вход подключен к АЦП, выход к DDR. Тогда можно обойтись и без микроблейза (все зависит от того, что дальше будете делать с данными в DDR).

Другой вариант. Свой модуль + CDMA + DDR. Скорее всего как и у вас. С CDMA проще работать через записи в регистры CDMA. Логика простая: записываете данные в три регистра: source, destanation и BBT. Все! Транзакция пошла. Плюс работа с прерываниями.

 

Share this post


Link to post
Share on other sites
Вы не указали каким образом данные от АЦП приходят в вашу систему с Микроблейзом.

Можно решить так. Берете DMA со входом stream и выходом memory mapped. Вход подключен к АЦП, выход к DDR. Тогда можно обойтись и без микроблейза (все зависит от того, что дальше будете делать с данными в DDR).

Другой вариант. Свой модуль + CDMA + DDR. Скорее всего как и у вас. С CDMA проще работать через записи в регистры CDMA. Логика простая: записываете данные в три регистра: source, destanation и BBT. Все! Транзакция пошла. Плюс работа с прерываниями.

 

Каким образом приходят данные - это пока не столь важно. У меня сейчас в приоритете разобраться именно с записью в DDR. Потом, если я правильно понял назначение системы, эти данные приходят на комп.

Но суть в чём. Да, Вы правы, в моём случае используется второй вариант. Ну и логика мне понятна, кроме... что такое BBT? И как правильно настроить прерывания?

Когда это сделаю, мне надо будет с помощью ChipScope убедиться (пока не знаю, каким образом), что данные записываются как надо.

Рылся в разных источниках, сейчас в голове немного каша, так что прошу помочь немного разобраться с записью.

Share this post


Link to post
Share on other sites
Каким образом приходят данные - это пока не столь важно. У меня сейчас в приоритете разобраться именно с записью в DDR. Потом, если я правильно понял назначение системы, эти данные приходят на комп.

Но суть в чём. Да, Вы правы, в моём случае используется второй вариант. Ну и логика мне понятна, кроме... что такое BBT? И как правильно настроить прерывания?

 

 

Оговорился BTT - bytes to transfer. Регистр куда пишите количество данных для транзакции.

Вырезки со своего кода скидываю в файл. Там регистрация CDMA и системы прерывания.

 

Когда это сделаю, мне надо будет с помощью ChipScope убедиться (пока не знаю, каким образом), что данные записываются как надо.

Рылся в разных источниках, сейчас в голове немного каша, так что прошу помочь немного разобраться с записью.

 

Можно вывести старт транзакции например по нажатию кнопки. Сигналы которые хотите посмотреть выводите в чипскоп. Записываете проект в ПЛИС для загрузки его при подаче питания. И через программатор подключаете чипскоп. Дальше стартуете транзакцию по нажатию кнопки. В Чипскопе анализируете.

main.txt

Share this post


Link to post
Share on other sites
Оговорился BTT - bytes to transfer. Регистр куда пишите количество данных для транзакции.

Вырезки со своего кода скидываю в файл. Там регистрация CDMA и системы прерывания.

 

Можно вывести старт транзакции например по нажатию кнопки. Сигналы которые хотите посмотреть выводите в чипскоп. Записываете проект в ПЛИС для загрузки его при подаче питания. И через программатор подключаете чипскоп. Дальше стартуете транзакцию по нажатию кнопки. В Чипскопе анализируете.

 

Ага, хорошо, буду пробовать. Спасибо Вам большое.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this