Перейти к содержанию
    

Microblaze + DDR3 + user_module

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Я в данный момент пробую разобраться, как записывать и считывать данные на/с 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. Все! Транзакция пошла. Плюс работа с прерываниями.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

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

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

 

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

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

 

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

main.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...