реклама на сайте
подробности

 
 
> Microblaze + DDR3 + user_module, write/read data
Valkaryn
сообщение Mar 10 2017, 07:42
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 14-11-16
Из: Минск
Пользователь №: 94 176



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

Я в данный момент пробую разобраться, как записывать и считывать данные на/с 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;
    }
}


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

Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alexey_Rostov
сообщение Mar 10 2017, 09:59
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 236
Регистрация: 28-06-13
Из: Минск, Беларусь
Пользователь №: 77 312



Цитата(Valkaryn @ Mar 10 2017, 09:42) *
Здравствуйте.

Я в данный момент пробую разобраться, как записывать и считывать данные на/с 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. Все! Транзакция пошла. Плюс работа с прерываниями.
Go to the top of the page
 
+Quote Post
Valkaryn
сообщение Mar 10 2017, 10:18
Сообщение #3





Группа: Участник
Сообщений: 7
Регистрация: 14-11-16
Из: Минск
Пользователь №: 94 176



Цитата(Alexey_Rostov @ Mar 10 2017, 11:59) *
Вы не указали каким образом данные от АЦП приходят в вашу систему с Микроблейзом.
Можно решить так. Берете DMA со входом stream и выходом memory mapped. Вход подключен к АЦП, выход к DDR. Тогда можно обойтись и без микроблейза (все зависит от того, что дальше будете делать с данными в DDR).
Другой вариант. Свой модуль + CDMA + DDR. Скорее всего как и у вас. С CDMA проще работать через записи в регистры CDMA. Логика простая: записываете данные в три регистра: source, destanation и BBT. Все! Транзакция пошла. Плюс работа с прерываниями.


Каким образом приходят данные - это пока не столь важно. У меня сейчас в приоритете разобраться именно с записью в DDR. Потом, если я правильно понял назначение системы, эти данные приходят на комп.
Но суть в чём. Да, Вы правы, в моём случае используется второй вариант. Ну и логика мне понятна, кроме... что такое BBT? И как правильно настроить прерывания?
Когда это сделаю, мне надо будет с помощью ChipScope убедиться (пока не знаю, каким образом), что данные записываются как надо.
Рылся в разных источниках, сейчас в голове немного каша, так что прошу помочь немного разобраться с записью.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016