|
MIG, DDR2 на Spartan 6, напрямую, без Microblaze |
|
|
|
Jan 28 2014, 14:09
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
У меня есть плата со Spartan 6 и DDR2, и через Microblaze мне было относительно просто заставить работать DDR2, т.е. железо рабочее. Но как то же самое сделать без микроба?
Я выполнил генерацию (coregen) с помощью MIG точно так же как я это делал когда-то для Microblaze, и вижу кучу файлов, а сгенерированных файлов - десятки, куча .v-файлов, десятки сотни линий... Как в этом сориентироваться? Ожидал что раз DDR2-контроллер есть - то он всё делает, а пользователю даёт простой интерфейс, чтобы он голову не ломал...
т.е. основной вопрос прост: как осознать результат, вываленный MIG-ом? Я просто в шоке и не верю что осознаю как это делать, а нормальный туториал гуглением не попался.
Другой вопрос состоит в том, а что если я возьму Microblaze с его работающим DDR2? Мне необходимо закачать несколько пару секунд потока "без единого разрыва" около 300 Мбит/с, напрямую в DDR2 я может и закачаю столько, но в случае Microblaze что может быть быстрым интерфейсом ввода от своей кастомной логики?
--------------------
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 16)
|
Jan 28 2014, 15:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Да ничего сложного! Горздно легче чем собирать ядро линукса из исходников  Для начала посмотрите user guide для выбраного Вами контролера - среди всего ужаса описанного Вами найдется один top модуль который включает в себя все остальные и предоставляет для юзера очень простой интерфейс в пару-тройку сотен линий  Ткже в генерируемых файлах присутствует образец скрипта для синтеза корки. В EDK можно к существующей системе на Microblaze - подключить еще например DMA контроллер и записывать данные в память напрямую. Сам контрллер можно взять гоотовый из EDK, а можно и самому наваять - и подключить к контроллеру DDR через отдельный порт или к AXI interconnect шине. Но в любом случае придется повозится с подключением кучи сигналов - в FPGA без этого увы никак. Успехов! Rob. P.S. вот по теме http://electronix.ru/forum/index.php?showt...=116819&hl=
|
|
|
|
|
Jan 28 2014, 15:46
|
Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 31-07-06
Пользователь №: 19 224

|
Цитата т.е. основной вопрос прост: как осознать результат, вываленный MIG-ом? Инсталируйте файл с названием проекта и расширением ".v", а как его использовать смотрите в файле sim_tb_top, с его иерархией.
|
|
|
|
|
Jan 28 2014, 17:04
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(RobFPGA @ Jan 28 2014, 19:29)  Да ничего сложного! Горздно легче чем собирать ядро линукса из исходников  Собрать Linux это как чай заварить, а с DDR2 не похоже чтобы просто... Цитата В EDK можно к существующей системе на Microblaze - подключить еще например DMA контроллер и записывать данные в память напрямую. У меня мысль такая возникла - я могу ведь подключить к Microblaze двухпортовую BRAM? С внешней стороны подавать, а внутри микроба - считывать и класть в DDR2 (дальше хоть по UART слать, главное без разрывов несколько сот мегабит заглотить)? А может есть специальный компонент FIFO для шины AXI...
--------------------
|
|
|
|
|
Jan 28 2014, 17:07
|
Частый гость
 
Группа: Свой
Сообщений: 85
Регистрация: 5-07-06
Из: Барнаул
Пользователь №: 18 592

|
Цитата(AVR @ Jan 29 2014, 00:04)  У меня мысль такая возникла - я могу ведь подключить к Microblaze двухпортовую BRAM? С внешней стороны подавать, а внутри микроба - считывать и класть в DDR2 (дальше хоть по UART слать, главное без разрывов несколько сот мегабит заглотить)? А микроб успеет такой поток "перекидать"? Цитата А может есть специальный компонент FIFO для шины AXI... Дык вроде есть.
|
|
|
|
|
Jan 28 2014, 18:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(AVR @ Jan 28 2014, 19:28)  Примитивный рачет показывает мне что 300*10^6 / 32 бит = ~10 млн. операций "туда-сюда", около десяти тактов на каждое перемещение. Я опасаюсь что таки не хватит... На Spartan 6 я больше чем 100 МГц от микроба не выжму, поэтому наверное всё же лучше няпрямую с DDR2 разбираться... Тяга к знаниям похвальна но для получения результата Вы лучше с DMA разбирайтесь - подключите в EDK к рабочей системе на Miicroblaze axi_dma_* и будет Вам простой интерфейс для записи потока данных в память (и даже для чтения из оной). Успехов! Rob.
|
|
|
|
|
Feb 13 2014, 12:54
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Докладываю, временно не было программатора, а теперь попробовал. Код 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 как быстрое решение проблемы - хороший вариант?
--------------------
|
|
|
|
|
Feb 13 2014, 15:09
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! А кактус то оказался значительно выше  Цитата(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
|
|
|
|
|
Feb 14 2014, 05:33
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 29-04-13
Из: Санкт-Петербург
Пользователь №: 76 668

|
Цитата(AVR @ Jan 28 2014, 18:09)  У меня есть плата со Spartan 6 и DDR2, и через Microblaze мне было относительно просто заставить работать DDR2, т.е. железо рабочее. Но как то же самое сделать без микроба?
Я выполнил генерацию (coregen) с помощью MIG точно так же как я это делал когда-то для Microblaze, и вижу кучу файлов, а сгенерированных файлов - десятки, куча .v-файлов, десятки сотни линий... Как в этом сориентироваться? Ожидал что раз DDR2-контроллер есть - то он всё делает, а пользователю даёт простой интерфейс, чтобы он голову не ломал... Недавно занимался тем же самым. Необходимо было записать в память как можно больше и быстрее, а потом медленно считать. Правда я работал с VHDL, а top-level собирал в схематике. Для теста использовал счетчик который работал с частотой 40 МГц и на каждый такт он выдавал по 8 бит (1 байт), можно было конечно и 32 бита, на записи бы это никак не отразилось. Все прекрасно работает если учесть все прерывания которые выдает DDR. Главное было написать машину состояний, чтобы грамотно управлять потоком данных и памятью. Если будут конкретные вопросы пишите, чем смогу помогу
|
|
|
|
|
Feb 14 2014, 07:34
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 29-04-13
Из: Санкт-Петербург
Пользователь №: 76 668

|
Цитата(Mad Makc @ Feb 14 2014, 11:05)  А вот скажите- у вас DDR2 один корпус стоит на плате? Если да, то используются ли терминирующие резисторы? А то логика подсказывает, что они вроде как не нужны( соединение точка-точка), однако в явном виде это нигде прочитать не удалось. Может, конечно не там читал? Я использовал отладочную плату lx9 microboard, и подобным вопросом не задавался. На эту плату куча документации есть в интернете, можете посмотреть если интересует.
|
|
|
|
|
Feb 14 2014, 14:03
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 15-12-04
Из: Зеленоград
Пользователь №: 1 492

|
Во первых, в корегенераторе в окне генерации 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.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|