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

 
 
> Microblaze + DDR3 4GB+, как прикрутить большую память
dubb
сообщение Sep 14 2016, 10:43
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 18-08-09
Из: Сибири
Пользователь №: 51 936



Доброго времени суток.

Имеется Vivado 2016.2, борда KC705 + скоро появиться модуль память SODIMM 4GB вместо стандартного.

Нужно присоединить память DDR3 на 4 Гигабайта к Микроблейзу. Для хранения данных в процессе работы,

Использую Xilinx MIG. Соответственно память появляется в общем адресном пространстве системы, а поскольку МБ 32 битный оно всё вмещает 4 ГБ.

На вопрос "можно-ли это сделать" ответили здесь https://forums.xilinx.com/t5/Memory-Interfa...DR3/td-p/632200
говорят что можно, хоть 8 ГБ.

Теперь вопрос "как?"

Каким образом организовать доступ к этой памяти?

На некоторых англо-язычных форумах советуют Memory segmentation, но примеров не приводят. Принцип сегментации памяти ясен как белый день,
но как его реализовать на практике непонятно.
Можно-ли это сделать стандартными средствами? Или нужно будет городить прослойку между Master-AXI и MIG?

В общем хотелось бы услышать совет от тех кто уже прошел эту дорогу, уверен не у меня первого возникла необходимость подключить более 2ГБ памяти ))

Заранее спасибо за ответы.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dubb
сообщение Nov 21 2016, 10:15
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 18-08-09
Из: Сибири
Пользователь №: 51 936



Реанимирую старую тему.
Кто-нибудь пользовался этой фичей - расширения адресного пространства? Насколько стабильно работает?

У меня возникли проблемы с "улетанием" Микроблейза в неведомые дали, при попытке провести тест памяти.
В проекте с адреса 0x1_0000_0000 прилинкован 1Gb DDR3, но если поставить туда блочную память, то ситуация похожая
Вот что происходит:

Код
    #include "mb_interface.h"

    u32 Data;
    u32 Rd_Data;
    u32 err_cnt = 0;

    u64 Addr = 0x0000000100000000LL;

    // write-read test
    for (u32 i = 0; i < 0x1000; i++) // words count loop
    {
                
        Data = (u32)i;
        swea(Addr, Data); // Store word to extended address
        Rd_Data = lwea(Addr);

        if (Data != Rd_Data)
        {
            err_cnt++;
            xil_printf("Err cnt: %u\n", cnt);
        }

        Addr = Addr + 4;
    }


При выполнении такого кода проц улетает в какой-то бесконечный цикл, частью которого является, например, сообщение "Err cnt: %u". Оно в терминле крутиться постоянно.
Здесь я использую обращение в расширенном адресном пространстве в соответствии с MicroBlaze Processor Reference Guide(UG984) - функции swea(u62, u32) и lwea(u32).

Одиночные попытки прочитать - записать по произвольному адресу в диапазоне выше 0x1_0000_0000 как правило успешны. Создается впечатление, что при обращении к MIG я одновременно записываю в область локальной памяти (что лежит с нулевого адреса) и это приводит к вышеописанным проблемам.

Итак вопрос к тем кто использовал эту опцию в МБ. Работает ли оно у Вас? Может у меня не хватает какой-нибудь включенной опции компилятора или чего-то еще?

Спасибо!
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Nov 22 2016, 03:46
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(dubb @ Nov 21 2016, 17:15) *
Реанимирую старую тему.
Кто-нибудь пользовался этой фичей - расширения адресного пространства? Насколько стабильно работает?

У меня возникли проблемы с "улетанием" Микроблейза в неведомые дали, при попытке провести тест памяти.
В проекте с адреса 0x1_0000_0000 прилинкован 1Gb DDR3, но если поставить туда блочную память, то ситуация похожая
Вот что происходит:

Код
    #include "mb_interface.h"

    u32 Data;
    u32 Rd_Data;
    u32 err_cnt = 0;

    u64 Addr = 0x0000000100000000LL;

    // write-read test
    for (u32 i = 0; i < 0x1000; i++) // words count loop
    {
                
        Data = (u32)i;
        swea(Addr, Data); // Store word to extended address
        Rd_Data = lwea(Addr);

        if (Data != Rd_Data)
        {
            err_cnt++;
            xil_printf("Err cnt: %u\n", cnt);
        }

        Addr = Addr + 4;
    }


При выполнении такого кода проц улетает в какой-то бесконечный цикл, частью которого является, например, сообщение "Err cnt: %u". Оно в терминле крутиться постоянно.
Здесь я использую обращение в расширенном адресном пространстве в соответствии с MicroBlaze Processor Reference Guide(UG984) - функции swea(u62, u32) и lwea(u32).

Одиночные попытки прочитать - записать по произвольному адресу в диапазоне выше 0x1_0000_0000 как правило успешны. Создается впечатление, что при обращении к MIG я одновременно записываю в область локальной памяти (что лежит с нулевого адреса) и это приводит к вышеописанным проблемам.

Итак вопрос к тем кто использовал эту опцию в МБ. Работает ли оно у Вас? Может у меня не хватает какой-нибудь включенной опции компилятора или чего-то еще?

Спасибо!

Проверь вот какие вещи - есть ли в микроблейзе встроенный умножитель, какого он типа (32 или 64) и соответствует ли это ключам компиляции софта? Недавно долго и мучительно искал глюки, связанные с подобным несоответствием (типа инструкция mul выполняется, но результат этой инструкции некорректный).
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 13:00
Рейтинг@Mail.ru


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