Полная версия этой страницы:
использование DDR2 в XPS
zherdiy
Jul 16 2008, 06:36
У меня на КИТЕ Spartan3AN распаяна память 512 Mbit (32M x 16) Micron Technology
DDR2 SDRAM (MT47H32M16) with a 16-bit data interface. Для управления ею Builder Wizard подключил к проекту с Микроблейзом элемент MPMC (multi port memory controler). Начал рыться в библиотеках на предмет использования сего элемента, нашёл две библиотеки: xmpmc.h и xmpmc_hw.h. Ни в одной из них нет функций чтения и записи в память. Я в недоумении - как же мне пользоваться памятью?
Раньше был опыт использования распаянного SRAMа. На XPSовские корки я тогда забил и сделал управление памятью в ISE на схематике (у меня был проект "microblaze XPS" + "схематика ISE"). Но теперь я с DDR2 самостоятельно совладать может и не смогу - она посложнее будет.
Дмитрий Мазунин
Jul 16 2008, 07:36
Никаких библиотек Вам не нужно.
MPMC прозрачен, просто обращаетесь в память.
PS и почему Вы пишете в этот раздел ?
Есть специальный - "Системы на ПЛИС"
zherdiy
Jul 16 2008, 12:45
Да, немного не туда написал, так что не буду возражать, если Админ мою темку перенесёт.
Теперь по существу: а как это - просто обращаться к памяти? У меня mpmc насажена на шину PLB, через которую остальная периферия работает, так мне BWizard соорудил. Попробую ПДФину почитать, но она на английском, так что если вы мне поможете, дело быстрее пойдет.
zherdiy
Jul 17 2008, 12:05
Может у кого проектик есть для примера? У мена на примерах быстрее понимание работает, а то по даташиту ничего не понял.
Посмотри на тест памяти (пример xilinx), который обычно лежит в libsrc\common_v1_00_a\src\xutil_memtest.c
Удачи...
zherdiy
Jul 21 2008, 05:31
Что-то не понял, как в моем случае может пригодится файл xutil_memtest.c. Мне же нужно целенаправленно писать и читать из памяти, а не непонятным образом тестировать ее. Да и есть подозрение, что прямое обращение к памяти будет работать, только в случае установки DDR2 как основной памяти плис на локальную шину dlmb и ilmb.
Еще примеры есть?
tolik1
Jul 22 2008, 07:47
Цитата(zherdiy @ Jul 21 2008, 09:31)

Что-то не понял, как в моем случае может пригодится файл xutil_memtest.c. Мне же нужно целенаправленно писать и читать из памяти, а не непонятным образом тестировать ее. Да и есть подозрение, что прямое обращение к памяти будет работать, только в случае установки DDR2 как основной памяти плис на локальную шину dlmb и ilmb.
Еще примеры есть?
1. В файлеxparameters.h у Вас будет базовый адрес. Далее обращаетесь к памяти напрямую через этот адрес.
Xuint32 *pMem = (*Xuint32)BASE_ADDR_CORE;
*pMem = 123456;
2. В LinkerScripte надо настроить определенный регион на размещение его в Вашей внешней памяти (я ставил .BSS Uninitialized data section) и глобальные переменные будут располагаться в этой памяти.
Xuint32 a; но не Xuint32 a = 0;
Цитата
Что-то не понял, как в моем случае может пригодится файл xutil_memtest.c. Мне же нужно целенаправленно писать и читать из памяти, а не непонятным образом тестировать ее.
А что не понятного ? там же есть пример обращения к памяти (запись и чтение, как вы и хотели)...
Цитата
Да и есть подозрение, что прямое обращение к памяти будет работать, только в случае установки DDR2 как основной памяти плис на локальную шину dlmb и ilmb.
Ваше подозрение ошибочно... Вам же уже писали:
Цитата
MPMC прозрачен, просто обращаетесь в память.
zherdiy
Sep 10 2008, 08:33
Цитата(tolik1 @ Jul 22 2008, 10:47)

1. В файлеxparameters.h у Вас будет базовый адрес. Далее обращаетесь к памяти напрямую через этот адрес.
Xuint32 *pMem = (*Xuint32)BASE_ADDR_CORE;
*pMem = 123456;
2. В LinkerScripte надо настроить определенный регион на размещение его в Вашей внешней памяти (я ставил .BSS Uninitialized data section) и глобальные переменные будут располагаться в этой памяти.
Xuint32 a; но не Xuint32 a = 0;
1. Ну, предположим запишу я значение 123456 в память так, как написано, а как мне его назад прочитать? Я ведь не знаю по какому адресу оно записалось. Как прочитать?
2. Вот про этот случай можно поподробнее? Уж больно заманчивая возможность просто хранить глобальные переменные во внешней DDR2 памяти. Я запустил генерацию Linker Script и в окошке Section View нашел секцию .bss с неизменяемым параметром size: 0x00000024 байт (=36 - почему не 32 или 16?) и memory: ilmb_cmtlr_dlmb_cmtlr. Второй параметр могу моменять на свою память DDR2_SDRAM_C_MPMC_BASEADDR. Это так имелось в виду или я ошибаюсь? Просто я не понял ваше ".BSS Uninitialized data section". Да, и если я буду хранить глобальные переменные в DDR2, то я же не смогу мгновенно записать, а затем сразу же прочитать? Ведь контроллер памяти должен будет провести длительную процедуру записи, затем чтения данных из памяти - следовательно нужно ставить задержки?
zherdiy
Sep 11 2008, 13:04
Начал компилировать проект и на этапе генерации файла прошивки "Generate programing file" в ISE вылезли ошибки типа:
PhysDesignRules:10 - The network <XLXI_1931/system_i/dlmb_port_BRAM_Clk> is completely unrouted.
<XLXI_1931/system_i/ilmb_LMB_ABus<19>> is completely unrouted.
<XLXI_1931/system_i/dlmb_LMB_ABus<23>> is completely unrouted.
и т.д. в количестве нескольких десятков.
Самое интересное, что если в EDK при создании Микроблейза не делать управление памятью через MPMC, то ошибки нет и все компилится. Кто-нить встречался с такой проблемой?
zherdiy
Oct 6 2008, 12:06
Цитата(tolik1 @ Jul 22 2008, 10:47)

1. В файлеxparameters.h у Вас будет базовый адрес. Далее обращаетесь к памяти напрямую через этот адрес.
Xuint32 *pMem = (*Xuint32)BASE_ADDR_CORE;
*pMem = 123456;
2. В LinkerScripte надо настроить определенный регион на размещение его в Вашей внешней памяти (я ставил .BSS Uninitialized data section) и глобальные переменные будут располагаться в этой памяти.
Xuint32 a; но не Xuint32 a = 0;
п.1 и п.2 - это два варианта или п.2 есть дополнение к п.1?
zherdiy
Oct 6 2008, 13:57
Цитата(zherdiy @ Oct 6 2008, 15:06)

п.1 и п.2 - это два варианта или п.2 есть дополнение к п.1?
Если п1 и п2 - это независимые варианты использования ddr, то могу ли я написать следующее:
Xuint32 *pMem[2] = (*Xuint32)BASE_ADDR_CORE;
*pMem[0] = 1;
*pMem[1] = 2;
*pMem[2] = 3;
read = *pMem[1];
- будут ли значения 1,2 и 3 писаться на различные адреса в ддр?
Цитата
п.1 и п.2 - это два варианта или п.2 есть дополнение к п.1?
Это два разных варианта.
Цитата(zherdiy @ Oct 6 2008, 16:57)

Если п1 и п2 - это независимые варианты использования ddr, то могу ли я написать следующее:
Xuint32 *pMem[2] = (*Xuint32)BASE_ADDR_CORE;
*pMem[0] = 1;
*pMem[1] = 2;
*pMem[2] = 3;
read = *pMem[1];
- будут ли значения 1,2 и 3 писаться на различные адреса в ддр?
Нет, не можете. Потому что это, простите, бред.
То, что Вы хотите, выглядит так:
Код
Xuint32 *pMem = (Xuint32*)BASE_ADDR_CORE;
pMem[0] = 1;
pMem[1] = 2;
pMem[2] = 3;
read = pMem[1];
zherdiy
Oct 23 2008, 07:56
Цитата(vik0 @ Oct 6 2008, 17:09)

То, что Вы хотите, выглядит так:
Код
Xuint32 *pMem = (Xuint32*)BASE_ADDR_CORE;
pMem[0] = 1;
pMem[1] = 2;
pMem[2] = 3;
read = pMem[1];
Сделал так - начало писать и читать, но как-то странно. После извлечения данных (32бита) из памяти (16-ти разрядной) я получаю правильными только старший (4-ый) байт. 1-ый и 2-ой байты - непонятные значения, чуть изменяемые в зависимости от поступивших в ddr2 данных, а 3-ий байт по чтению - такое впечатление, что туда ставится первый по записи. Не пойму - это память глючная или что-то у меня в настройках Microblaze не так?
Пробовал писать данные, описываемые как Xuint16 - не помогло.
zherdiy
Oct 24 2008, 13:57
Дополнение:
пишу грядку данных каждое в свой адрес
pMem[1] = 1;
pMem[2] = 2;
pMem[3] = 3;
pMem[4] = 4;
pMem[5] = 5;
pMem[6] = 6;
pMem[7] = 7;
pMem[8] = 8;
обращаюсь к внешнему порту
data32 = ReadFromGPInput(XPAR_DIPS_4BIT_BASEADDR);
читаю один из выбранных данных из ddr2
dataread32 = pMem[5];
и передаю на визуальный контроль
WriteToGPOutput(XPAR_DATA32_BASEADDR, dataread32);
получаю свою 5ку в третьем байте, 4й байт=0, 1й и 2й - левые данные.
вариант 2: вместо "data32 = ReadFromGPInput(XPAR_DIPS_4BIT_BASEADDR);" ставлю "for (i = 0; i < 5000; i++) data32++" - получаю 5ку в первом байте, так как и нужно, а все остальные=0.
Вопрос: почему данные в памяти сдвигаются, когда я начинаю обащаться к другим портам? Почему того же нет при обычных вычислительных процессах?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.