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

 
 
> использование DDR2 в XPS, xmpmc библиотеки
zherdiy
сообщение Jul 16 2008, 06:36
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 8-01-08
Из: Запорожье
Пользователь №: 33 895



У меня на КИТЕ 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 самостоятельно совладать может и не смогу - она посложнее будет.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
Дмитрий Мазунин
сообщение Jul 16 2008, 07:36
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 259
Регистрация: 19-09-05
Из: Екатеринбург
Пользователь №: 8 715



Никаких библиотек Вам не нужно.
MPMC прозрачен, просто обращаетесь в память.

PS и почему Вы пишете в этот раздел ?
Есть специальный - "Системы на ПЛИС"
Go to the top of the page
 
+Quote Post
zherdiy
сообщение Jul 16 2008, 12:45
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 8-01-08
Из: Запорожье
Пользователь №: 33 895



Да, немного не туда написал, так что не буду возражать, если Админ мою темку перенесёт.

Теперь по существу: а как это - просто обращаться к памяти? У меня mpmc насажена на шину PLB, через которую остальная периферия работает, так мне BWizard соорудил. Попробую ПДФину почитать, но она на английском, так что если вы мне поможете, дело быстрее пойдет.
Go to the top of the page
 
+Quote Post
zherdiy
сообщение Jul 17 2008, 12:05
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 8-01-08
Из: Запорожье
Пользователь №: 33 895



Может у кого проектик есть для примера? У мена на примерах быстрее понимание работает, а то по даташиту ничего не понял.
Go to the top of the page
 
+Quote Post
RKOB
сообщение Jul 18 2008, 10:24
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 17-03-05
Пользователь №: 3 422



Посмотри на тест памяти (пример xilinx), который обычно лежит в libsrc\common_v1_00_a\src\xutil_memtest.c
Удачи...
Go to the top of the page
 
+Quote Post
zherdiy
сообщение Jul 21 2008, 05:31
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 8-01-08
Из: Запорожье
Пользователь №: 33 895



Что-то не понял, как в моем случае может пригодится файл xutil_memtest.c. Мне же нужно целенаправленно писать и читать из памяти, а не непонятным образом тестировать ее. Да и есть подозрение, что прямое обращение к памяти будет работать, только в случае установки DDR2 как основной памяти плис на локальную шину dlmb и ilmb.

Еще примеры есть?
Go to the top of the page
 
+Quote Post
tolik1
сообщение Jul 22 2008, 07:47
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 199
Регистрация: 2-03-05
Из: МОСКВА
Пользователь №: 3 016



Цитата(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;
Go to the top of the page
 
+Quote Post
RKOB
сообщение Jul 22 2008, 10:35
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 17-03-05
Пользователь №: 3 422



Цитата
Что-то не понял, как в моем случае может пригодится файл xutil_memtest.c. Мне же нужно целенаправленно писать и читать из памяти, а не непонятным образом тестировать ее.

А что не понятного ? там же есть пример обращения к памяти (запись и чтение, как вы и хотели)...
Цитата
Да и есть подозрение, что прямое обращение к памяти будет работать, только в случае установки DDR2 как основной памяти плис на локальную шину dlmb и ilmb.

Ваше подозрение ошибочно... Вам же уже писали:
Цитата
MPMC прозрачен, просто обращаетесь в память.
Go to the top of the page
 
+Quote Post
zherdiy
сообщение Sep 10 2008, 08:33
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 8-01-08
Из: Запорожье
Пользователь №: 33 895



Цитата(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 10 2008, 08:37
Go to the top of the page
 
+Quote Post
zherdiy
сообщение Sep 11 2008, 13:04
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 8-01-08
Из: Запорожье
Пользователь №: 33 895



Начал компилировать проект и на этапе генерации файла прошивки "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, то ошибки нет и все компилится. Кто-нить встречался с такой проблемой?
Go to the top of the page
 
+Quote Post
zherdiy
сообщение Oct 6 2008, 12:06
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 8-01-08
Из: Запорожье
Пользователь №: 33 895



Цитата(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?
Go to the top of the page
 
+Quote Post
zherdiy
сообщение Oct 6 2008, 13:57
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 8-01-08
Из: Запорожье
Пользователь №: 33 895



Цитата(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 писаться на различные адреса в ддр?
Go to the top of the page
 
+Quote Post
vik0
сообщение Oct 6 2008, 14:09
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



Цитата
п.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];
Go to the top of the page
 
+Quote Post
zherdiy
сообщение Oct 23 2008, 07:56
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 8-01-08
Из: Запорожье
Пользователь №: 33 895



Цитата(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 - не помогло.
Go to the top of the page
 
+Quote Post
zherdiy
сообщение Oct 24 2008, 13:57
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 8-01-08
Из: Запорожье
Пользователь №: 33 895



Дополнение:
пишу грядку данных каждое в свой адрес
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.

Вопрос: почему данные в памяти сдвигаются, когда я начинаю обащаться к другим портам? Почему того же нет при обычных вычислительных процессах?
Go to the top of the page
 
+Quote Post

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

 


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


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