zherdiy 0 16 июля, 2008 Опубликовано 16 июля, 2008 · Жалоба У меня на КИТЕ 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 самостоятельно совладать может и не смогу - она посложнее будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DM1206 0 16 июля, 2008 Опубликовано 16 июля, 2008 · Жалоба Никаких библиотек Вам не нужно. MPMC прозрачен, просто обращаетесь в память. PS и почему Вы пишете в этот раздел ? Есть специальный - "Системы на ПЛИС" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zherdiy 0 16 июля, 2008 Опубликовано 16 июля, 2008 · Жалоба Да, немного не туда написал, так что не буду возражать, если Админ мою темку перенесёт. Теперь по существу: а как это - просто обращаться к памяти? У меня mpmc насажена на шину PLB, через которую остальная периферия работает, так мне BWizard соорудил. Попробую ПДФину почитать, но она на английском, так что если вы мне поможете, дело быстрее пойдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zherdiy 0 17 июля, 2008 Опубликовано 17 июля, 2008 · Жалоба Может у кого проектик есть для примера? У мена на примерах быстрее понимание работает, а то по даташиту ничего не понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RKOB 0 18 июля, 2008 Опубликовано 18 июля, 2008 · Жалоба Посмотри на тест памяти (пример xilinx), который обычно лежит в libsrc\common_v1_00_a\src\xutil_memtest.c Удачи... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zherdiy 0 21 июля, 2008 Опубликовано 21 июля, 2008 · Жалоба Что-то не понял, как в моем случае может пригодится файл xutil_memtest.c. Мне же нужно целенаправленно писать и читать из памяти, а не непонятным образом тестировать ее. Да и есть подозрение, что прямое обращение к памяти будет работать, только в случае установки DDR2 как основной памяти плис на локальную шину dlmb и ilmb. Еще примеры есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tolik1 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Что-то не понял, как в моем случае может пригодится файл 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RKOB 0 22 июля, 2008 Опубликовано 22 июля, 2008 · Жалоба Что-то не понял, как в моем случае может пригодится файл xutil_memtest.c. Мне же нужно целенаправленно писать и читать из памяти, а не непонятным образом тестировать ее. А что не понятного ? там же есть пример обращения к памяти (запись и чтение, как вы и хотели)... Да и есть подозрение, что прямое обращение к памяти будет работать, только в случае установки DDR2 как основной памяти плис на локальную шину dlmb и ilmb. Ваше подозрение ошибочно... Вам же уже писали: MPMC прозрачен, просто обращаетесь в память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zherdiy 0 10 сентября, 2008 Опубликовано 10 сентября, 2008 (изменено) · Жалоба 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, то я же не смогу мгновенно записать, а затем сразу же прочитать? Ведь контроллер памяти должен будет провести длительную процедуру записи, затем чтения данных из памяти - следовательно нужно ставить задержки? Изменено 10 сентября, 2008 пользователем zherdiy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zherdiy 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Начал компилировать проект и на этапе генерации файла прошивки "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 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба 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 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба п.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 писаться на различные адреса в ддр? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vik0 0 6 октября, 2008 Опубликовано 6 октября, 2008 · Жалоба п.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 писаться на различные адреса в ддр? Нет, не можете. Потому что это, простите, бред. То, что Вы хотите, выглядит так: Xuint32 *pMem = (Xuint32*)BASE_ADDR_CORE; pMem[0] = 1; pMem[1] = 2; pMem[2] = 3; read = pMem[1]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zherdiy 0 23 октября, 2008 Опубликовано 23 октября, 2008 · Жалоба То, что Вы хотите, выглядит так: 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 0 24 октября, 2008 Опубликовано 24 октября, 2008 · Жалоба Дополнение: пишу грядку данных каждое в свой адрес 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. Вопрос: почему данные в памяти сдвигаются, когда я начинаю обащаться к другим портам? Почему того же нет при обычных вычислительных процессах? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться