|
|
  |
Microblaze + DDR3 4GB+, как прикрутить большую память |
|
|
|
Sep 14 2016, 10:43
|

Участник

Группа: Участник
Сообщений: 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ГБ памяти )) Заранее спасибо за ответы.
|
|
|
|
|
Sep 14 2016, 17:53
|

Участник

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

|
Цитата(Maverick @ Sep 14 2016, 18:01)  судя по ссылке для подсоединения к процессору больше 3 гигов (2^32 -1) - Вам понадобиться "прослойка" логики которая будет например в зависти от флага переводить адресацию к памяти DDR к следующим (2^32 -1) памяти. Т.е. процессор будет видеть только (2^32 -1) памяти, переходить к слудующему (2^32 -1) участку памяти по флагу или другой внешней логики Это мое личное понимание Если я вас правильно понял, то нужно написать свое ядро, у которого наружу будут смотреть AXI_Master (к контроллеру памяти), AXI_Slave0 (к микроблейзу интерфейс памяти) и AXI_Slave1 (к микроблейзу интерфейс управления для переключения сегментов памяти). Ну или интерфейсы до МБ можно засунуть в один AXI c адресным пространством типа [Размер сегмента памяти + управляющий регистр] ? Цитата(Koluchiy @ Sep 14 2016, 18:56)  Поискать вместо Микроблейза 64битный проц - не? Нельзя ли пояснить, зачем эту мегапамять вешать конкретно на Микроблейз, что он с ней делать будет? Почему микроблейз - из-за распространенности, много примеров, документации. Сейчас задача - тестирование памяти. Вы можете посоветовать какой-то вариант 64 бит софотового проца с контроллером DDR3? В процах пока не силен к сожалению.
|
|
|
|
|
Sep 14 2016, 18:19
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(dubb @ Sep 14 2016, 20:53)  Если я вас правильно понял, то нужно написать свое ядро, у которого наружу будут смотреть AXI_Master (к контроллеру памяти), AXI_Slave0 (к микроблейзу интерфейс памяти) и AXI_Slave1 (к микроблейзу интерфейс управления для переключения сегментов памяти). Ну или интерфейсы до МБ можно засунуть в один AXI c адресным пространством типа [Размер сегмента памяти + управляющий регистр] ?
Почему микроблейз - из-за распространенности, много примеров, документации. Сейчас задача - тестирование памяти. Вы можете посоветовать какой-то вариант 64 бит софотового проца с контроллером DDR3? В процах пока не силен к сожалению. Сначала желательно изучить имеющуюся матчасть а потом уж ваят что-то свое
Удачи! Rob.
|
|
|
|
|
Sep 15 2016, 05:23
|

Участник

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

|
Цитата(RobFPGA @ Sep 14 2016, 22:19)  Сначала желательно изучить имеющуюся матчасть а потом уж ваят что-то свое Rob, спасибо, пропустил эту замечательную настройку Микроблейза. Думаю теперь обойдется без своих велосипедов)
|
|
|
|
|
Nov 21 2016, 10:15
|

Участник

Группа: Участник
Сообщений: 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 я одновременно записываю в область локальной памяти (что лежит с нулевого адреса) и это приводит к вышеописанным проблемам. Итак вопрос к тем кто использовал эту опцию в МБ. Работает ли оно у Вас? Может у меня не хватает какой-нибудь включенной опции компилятора или чего-то еще? Спасибо!
|
|
|
|
|
Nov 22 2016, 03:46
|
Знающий
   
Группа: Свой
Сообщений: 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 выполняется, но результат этой инструкции некорректный).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|