Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MIG, DDR2 на Spartan 6
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
AVR
У меня есть плата со Spartan 6 и DDR2, и через Microblaze мне было относительно просто заставить работать DDR2, т.е. железо рабочее. Но как то же самое сделать без микроба?

Я выполнил генерацию (coregen) с помощью MIG точно так же как я это делал когда-то для Microblaze, и вижу кучу файлов, а сгенерированных файлов - десятки, куча .v-файлов, десятки сотни линий... Как в этом сориентироваться? Ожидал что раз DDR2-контроллер есть - то он всё делает, а пользователю даёт простой интерфейс, чтобы он голову не ломал...

т.е. основной вопрос прост: как осознать результат, вываленный MIG-ом? Я просто в шоке и не верю что осознаю как это делать, а нормальный туториал гуглением не попался.

Другой вопрос состоит в том, а что если я возьму Microblaze с его работающим DDR2?
Мне необходимо закачать несколько пару секунд потока "без единого разрыва" около 300 Мбит/с, напрямую в DDR2 я может и закачаю столько, но в случае Microblaze что может быть быстрым интерфейсом ввода от своей кастомной логики?
lemorus
Насколько я знаю, Вам нужен проект работы с DDR2 коркой. По моему нечто похожее было в референс на Virtex4. Вам понадобится проект и тестбенч. Ну и возможно кто нибудь скинет сюда исходники проекта работы с DDR2. Буфер на DDR2 не такой уж архисложный проект по идее, и довольно распространен в узких кругах sm.gif
RobFPGA
Приветствую!

Да ничего сложного! Горздно легче чем собирать ядро линукса из исходников sm.gif

Для начала посмотрите user guide для выбраного Вами контролера - среди всего ужаса описанного Вами найдется один top модуль который включает в себя все остальные и предоставляет для юзера очень простой интерфейс в пару-тройку сотен линий wink.gif

Ткже в генерируемых файлах присутствует образец скрипта для синтеза корки.

В EDK можно к существующей системе на Microblaze - подключить еще например DMA контроллер и записывать данные в память напрямую. Сам контрллер можно взять гоотовый из EDK, а можно и самому наваять - и подключить к контроллеру DDR через отдельный порт или к AXI interconnect шине.
Но в любом случае придется повозится с подключением кучи сигналов - в FPGA без этого увы никак.

Успехов! Rob.

P.S. вот по теме http://electronix.ru/forum/index.php?showt...=116819&hl=
slawikg
Цитата
т.е. основной вопрос прост: как осознать результат, вываленный MIG-ом?

Инсталируйте файл с названием проекта и расширением ".v", а как его использовать смотрите в файле sim_tb_top, с его иерархией.
AVR
Цитата(RobFPGA @ Jan 28 2014, 19:29) *
Да ничего сложного! Горздно легче чем собирать ядро линукса из исходников sm.gif

Собрать Linux это как чай заварить, а с DDR2 не похоже чтобы просто...

Цитата
В EDK можно к существующей системе на Microblaze - подключить еще например DMA контроллер и записывать данные в память напрямую.

У меня мысль такая возникла - я могу ведь подключить к Microblaze двухпортовую BRAM? С внешней стороны подавать, а внутри микроба - считывать и класть в DDR2 (дальше хоть по UART слать, главное без разрывов несколько сот мегабит заглотить)? А может есть специальный компонент FIFO для шины AXI...
NahaL
Цитата(AVR @ Jan 29 2014, 00:04) *
У меня мысль такая возникла - я могу ведь подключить к Microblaze двухпортовую BRAM? С внешней стороны подавать, а внутри микроба - считывать и класть в DDR2 (дальше хоть по UART слать, главное без разрывов несколько сот мегабит заглотить)?

А микроб успеет такой поток "перекидать"?
Цитата
А может есть специальный компонент FIFO для шины AXI...

Дык вроде есть.
AVR
Цитата(NahaL @ Jan 28 2014, 21:07) *
А микроб успеет такой поток "перекидать"?
Дык вроде есть.

Примитивный рачет показывает мне что 300*10^6 / 32 бит = ~10 млн. операций "туда-сюда", около десяти тактов на каждое перемещение. Я опасаюсь что таки не хватит... На Spartan 6 я больше чем 100 МГц от микроба не выжму, поэтому наверное всё же лучше няпрямую с DDR2 разбираться...
RobFPGA
Приветствую!

Цитата(AVR @ Jan 28 2014, 19:28) *
Примитивный рачет показывает мне что 300*10^6 / 32 бит = ~10 млн. операций "туда-сюда", около десяти тактов на каждое перемещение. Я опасаюсь что таки не хватит... На Spartan 6 я больше чем 100 МГц от микроба не выжму, поэтому наверное всё же лучше няпрямую с DDR2 разбираться...



Тяга к знаниям похвальна но для получения результата Вы лучше с DMA разбирайтесь - подключите в EDK к рабочей системе на Miicroblaze axi_dma_* и будет Вам простой интерфейс для записи потока данных в память (и даже для чтения из оной).

Успехов! Rob.
count_enable
Сделайте систему на AXI4 DMA и свою корку на AXI Stream. Или сделайте свою корку на AXI4 Master, если длина бёрста в 256 слов достаточна. Тогда надо будет разобраться только с шиной, она в разы проще чем MIG.
lemorus
Вот ссылка на референс дизайн буфера для видеопотока на DDR2 на Spartan3AN
http://www.xilinx.com/support/documentatio...tes/xapp458.pdf
http://www.xilinx.com/support/documentatio...tes/xapp458.zip

И прикрепил xapp702, еле нашел сам дизайн, DDR2 на Virtex4. Подробно не смотрел.

Мельком пробегал дизайн на SP605 плату, точно видел на DDR3, но вроде как есть и на DDR2.
AVR
Цитата(lemorus @ Jan 28 2014, 23:38) *
Вот ссылка на референс дизайн буфера для видеопотока на DDR2 на Spartan3AN
Мельком пробегал дизайн на SP605 плату, точно видел на DDR3, но вроде как есть и на DDR2.

Спасибо!
Обязательно отпишусь когда что-то получится, чтобы другим кому интересно тоже было всё понятно.
AVR
Докладываю, временно не было программатора, а теперь попробовал.

Код
    int count = 0;
    while(true)
    {
        int sz = (64 * 1024 * 1024) / 8;
        xil_printf("\n\r----- %d\n\r", count++);
        u64 *ddr2 = (u64*) XPAR_MCB_DDR2_S0_AXI_BASEADDR;
        for(int i = 0; i < sz; i++) ddr2[i] = 0xAABBCCDD;
    }
    return 0;


Между ----- проходит 2.75 секунды на запись 64 Мб - это 24.4*10^6 байт/с, используется кэширование, память с 16-битным интерфейсом.

Прежде чем городить DMA, я бы поинтересовался - я смогу выжать больше чем жалкие 24 Мбайт/с? Или это предел?

P.S.
Думаю задействовать http://xillybus.com как быстрое решение проблемы - хороший вариант?
RobFPGA
Приветствую!

А кактус то оказался значительно выше sad.gif

Цитата(AVR @ Feb 13 2014, 14:54) *
Докладываю, временно не было программатора, а теперь попробовал.
...
Между ----- проходит 2.75 секунды на запись 64 Мб - это 24.4*10^6 байт/с, используется кэширование, память с 16-битным интерфейсом.

Прежде чем городить DMA, я бы поинтересовался - я смогу выжать больше чем жалкие 24 Мбайт/с? Или это предел?


Сможете! для 16 бит 400MHz DDR2 как минимум в 60 раз больше. Это если все же будете пересылать данные через стандартный axi_dma или axi_cdma контроллеры.

Цитата(AVR @ Feb 13 2014, 14:54) *
P.S.
Думаю задействовать http://xillybus.com как быстрое решение проблемы - хороший вариант?


Ответ на этот вопрос зависит в первую очередь от толщины Вашего кошелька.

Успехов! Rob



mr.alexeevas
Цитата(AVR @ Jan 28 2014, 18:09) *
У меня есть плата со Spartan 6 и DDR2, и через Microblaze мне было относительно просто заставить работать DDR2, т.е. железо рабочее. Но как то же самое сделать без микроба?

Я выполнил генерацию (coregen) с помощью MIG точно так же как я это делал когда-то для Microblaze, и вижу кучу файлов, а сгенерированных файлов - десятки, куча .v-файлов, десятки сотни линий... Как в этом сориентироваться? Ожидал что раз DDR2-контроллер есть - то он всё делает, а пользователю даёт простой интерфейс, чтобы он голову не ломал...


Недавно занимался тем же самым. Необходимо было записать в память как можно больше и быстрее, а потом медленно считать. Правда я работал с VHDL, а top-level собирал в схематике.

Для теста использовал счетчик который работал с частотой 40 МГц и на каждый такт он выдавал по 8 бит (1 байт), можно было конечно и 32 бита, на записи бы это никак не отразилось. Все прекрасно работает если учесть все прерывания которые выдает DDR. Главное было написать машину состояний, чтобы грамотно управлять потоком данных и памятью.

Если будут конкретные вопросы пишите, чем смогу помогу wink.gif
Mad Makc
А вот скажите- у вас DDR2 один корпус стоит на плате? Если да, то используются ли терминирующие резисторы? А то логика подсказывает, что они вроде как не нужны( соединение точка-точка), однако в явном виде это нигде прочитать не удалось. Может, конечно не там читал?
mr.alexeevas
Цитата(Mad Makc @ Feb 14 2014, 11:05) *
А вот скажите- у вас DDR2 один корпус стоит на плате? Если да, то используются ли терминирующие резисторы? А то логика подсказывает, что они вроде как не нужны( соединение точка-точка), однако в явном виде это нигде прочитать не удалось. Может, конечно не там читал?


Я использовал отладочную плату lx9 microboard, и подобным вопросом не задавался. На эту плату куча документации есть в интернете, можете посмотреть если интересует.
Yuris
Во первых, в корегенераторе в окне генерации xilinx MIG есть кнопки User Guide и MCB User Guide, по нажатии на которую открываются ug416 и ug388. Это и есть вменяемые гайды. Для понимания работы MCB читать ug388.
Во вторых, по делу, генерить можно в двух режимах - axi и без него. Если нет процессора, то лучше генерить без axi.
В этом случае лепится native mig wrapper с простым внутренним интерфейсом. На этапе сборки корки нужно выбрать количество внутренних портов (максимум 6), их ширину (32/64) и направление(rd/wr). Для доступа к памяти через каждый порт интерфейса имеются: фифо команд глубиной 4 и фифо данных глубиной 64, ну и весь набор необходимых флагов.
Упрощенный алгоритм записи: в фифо данных толкаются данные, потом в фифо команд толкается команда записи и их объем и мониторится флаг empty фифо данных. По необходимости повторить.
Алгоритм чтения: сначала посылается команда чтения и необходимый объем, потом опять таки мониторится empty фифо данных, по готовности читаем данные из фифо.
Понятное дело, для оптимизации пропускной способности требуется написать грамотный автомат управления, подобрать объем берстов и т.п.
Если хочется сделать быстро welcome to EDK.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.