Перейти к содержанию
    

использование DDR2 в XPS

У меня на КИТЕ 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 самостоятельно совладать может и не смогу - она посложнее будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Никаких библиотек Вам не нужно.

MPMC прозрачен, просто обращаетесь в память.

 

PS и почему Вы пишете в этот раздел ?

Есть специальный - "Системы на ПЛИС"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Теперь по существу: а как это - просто обращаться к памяти? У меня mpmc насажена на шину PLB, через которую остальная периферия работает, так мне BWizard соорудил. Попробую ПДФину почитать, но она на английском, так что если вы мне поможете, дело быстрее пойдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может у кого проектик есть для примера? У мена на примерах быстрее понимание работает, а то по даташиту ничего не понял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотри на тест памяти (пример xilinx), который обычно лежит в libsrc\common_v1_00_a\src\xutil_memtest.c

Удачи...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Еще примеры есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то не понял, как в моем случае может пригодится файл 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 прозрачен, просто обращаетесь в память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Начал компилировать проект и на этапе генерации файла прошивки "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, то ошибки нет и все компилится. Кто-нить встречался с такой проблемой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

п.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?

Это два разных варианта.

 

Если п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];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То, что Вы хотите, выглядит так:

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 - не помогло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дополнение:

пишу грядку данных каждое в свой адрес

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.

 

Вопрос: почему данные в памяти сдвигаются, когда я начинаю обащаться к другим портам? Почему того же нет при обычных вычислительных процессах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...