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

Перенос проекта с DDR3 в BRAM на microblaze

Добрый день!

У меня в проекте есть xilinx ml605, microblaze, к нему elf ф-л и ddr, в котором хранится программа, куча и стек. Сейчас появилась задача уйти от DDR, вырезать его из MBZ и перенести elf, кучу и стек в BRAM. Программа в elf занимает 255 Кб. BRAM в MBZ доступно 128 кб. Оптимизируя и урезая программу сильно много места я не выиграю. Получается нужно увеличивать BRAM. Подскажите пожалуйста, возможно ли сделать BRAM = 512 Кб или около того? Если нет, то возможно есть какие то типовые решения данной проблемы? Если я чего то не правильно понимаю, пните в нужную сторону:) Спасибо всем!

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


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

Добрый день!

У меня в проекте есть xilinx ml605, microblaze, к нему elf ф-л и ddr, в котором хранится программа, куча и стек. Сейчас появилась задача уйти от DDR, вырезать его из MBZ и перенести elf, кучу и стек в BRAM. Программа в elf занимает 255 Кб. BRAM в MBZ доступно 128 кб. Оптимизируя и урезая программу сильно много места я не выиграю. Получается нужно увеличивать BRAM. Подскажите пожалуйста, возможно ли сделать BRAM = 512 Кб или около того? Если нет, то возможно есть какие то типовые решения данной проблемы? Если я чего то не правильно понимаю, пните в нужную сторону:) Спасибо всем!

ml605 -> XC6VLX240T -> 14976 Kb BRAM -> 1872KB. Возможно.

Надо в xps сконфигурировать компонент BRAM внешний, на шине (вот только не помню нет ли в нем ограничений).

 

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


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

ml605 -> XC6VLX240T -> 14976 Kb BRAM -> 1872KB. Возможно.

Надо в xps сконфигурировать компонент BRAM внешний, на шине (вот только не помню нет ли в нем ограничений).

К сожалению, ограничения есть. Не всю BRAM можно отвести под исполняемый код, а именно:

1. На шине памяти local memory bus (ILMB и DLMB) в XC6VLX240T можно адресовать не более 128 кБайт.

2. На шине AXI можно создавать BRAM-контроллеры в любом количестве.

 

Сегмент .text, .init, .fini можно располагать только в памяти на шине LMB.

Остальные сегменты можно располагать и в LMB, и в AXI.

 

Для Spartan-6 есть один замороченный метод, позволяющий увеличить размер LMB в два раза. Подозреваю, что и в Virtex можно сделать то же самое.

Если кому потребуется - изложу.

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


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

Сегмент .text, .init, .fini можно располагать только в памяти на шине LMB.

Думаю тут имеется ввиду код исполняемый непосредственно после старта, т.к. .text в DDR на AXI разместить можно.

Как вариант - в BRAM на LMB bootloader который грузит из внешнего флеша в BRAM на AXI и передает туда управление.

Bootloader у автора судя по всему есть, т.к. что-то в DDR программу ему грузит, только поменять DDR на BRAM.

 

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


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

К сожалению, ограничения есть. Не всю BRAM можно отвести под исполняемый код, а именно:

1. На шине памяти local memory bus (ILMB и DLMB) в XC6VLX240T можно адресовать не более 128 кБайт.

2. На шине AXI можно создавать BRAM-контроллеры в любом количестве.

 

Сегмент .text, .init, .fini можно располагать только в памяти на шине LMB.

Остальные сегменты можно располагать и в LMB, и в AXI.

 

Для Spartan-6 есть один замороченный метод, позволяющий увеличить размер LMB в два раза. Подозреваю, что и в Virtex можно сделать то же самое.

Если кому потребуется - изложу.

 

Спасибо за ответы всем!

Я немного уточню задачу. Необходимо, чтобы при включении платы, автоматически загружался MBZ и с CompactFlash грузилась прошивка. Сейчас MBZ и *.elf устанавливаю через XSDK.

Так же, на данный момент, проект *.elf загружается в DDR, а нужно чтобы он грузился в BRAM. Можете одробнее описать алгоритм расширения BRAM? И у блока BRAM есть 2 выхода. Как этот блок прицепить на AXI правильно?

 

Как раскидать сегменты типа .text, .init итп, по шинам?

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


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

Думаю тут имеется ввиду код исполняемый непосредственно после старта, т.к. .text в DDR на AXI разместить можно.

Как вариант - в BRAM на LMB bootloader который грузит из внешнего флеша в BRAM на AXI и передает туда управление.

Bootloader у автора судя по всему есть, т.к. что-то в DDR программу ему грузит, только поменять DDR на BRAM.

 

Автору необходимо уйти от использования DDR, следовательно, и bootloader как таковой не нужен. Т.е. имеющийся основной исполняемый файл грузится при включении платы. Его как-то нужно как-то разместить по BRAMs.

 

нужно чтобы он грузился в BRAM. Можете одробнее описать алгоритм расширения BRAM? И у блока BRAM есть 2 выхода. Как этот блок прицепить на AXI правильно?

Предлагаю начать с добавления BRAM на AXI. BRAM-контроллер - это модуль, который позволяет присоединить BRAM-блоки к AXI. Для этого необходимо в EDK на вкладке IP-catalog дважды щелкнуть по AXI BRAM Controller. Далее устанавливаете его размер = 128 кБ на вкладке adresses. BRAM-блоки при этом присоединяться автоматически.

Ок?

 

 

Как раскидать сегменты типа .text, .init итп, по шинам?

Для начала хорошо посмотреть размеры секций Вашего ELF. Для это в SDK нужно дважды щелкнуть по .ELF-файлу.

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


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

Это уже 2 подход на моей памяти за этот год, где-то весной кто-то уже делал...

В спартане 6 для микроблайза под память программ и данных на брамах выделяют 64 кБайта, и все найденные способы это победить привели к тому что в итоге ничего не вышло (хотели без бутлоадера обойтись)

 

Единственное решение - это сделать проц с 64 кБайтами памяти, в которых будет загрузчик и что-то еще. А все остальные брамы собрать в один огромный массив и сделать из них память. Повесить ее на АКСИ шину, выделить адресное пространство и написать бутлоадер, точно также как в случае с ДДР. Прочие варианты с бубнами и без в итоге не заработали, а народ пару месяцев бился, даже какие-то файлы переписывали руками и пытались среду обмануть...

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


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

Автору необходимо уйти от использования DDR, следовательно, и bootloader как таковой не нужен. Т.е. имеющийся основной исполняемый файл грузится при включении платы. Его как-то нужно как-то разместить по BRAMs.

Необходимо, чтобы при включении платы, автоматически загружался MBZ и с CompactFlash

Таки нужен бутлоадер, и то не маленький - с CF грузить. А куда грузить - в DDR или BRAM на AXI на фоне обслуживания CF не имеет значения.

 

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


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

Это уже 2 подход на моей памяти за этот год, где-то весной кто-то уже делал...

В спартане 6 для микроблайза под память программ и данных на брамах выделяют 64 кБайта, и все найденные способы это победить привели к тому что в итоге ничего не вышло (хотели без бутлоадера обойтись)

Можно в Spartan-6 расширить 64к в два раза.

Можно в Spartan-6 разместить все сегменты кроме .text, .init, .fini в дополнительных axi_bram_controllers.

 

Проверено. Работает.

 

 

Таки нужен бутлоадер, и то не маленький - с CF грузить. А куда грузить - в DDR или BRAM на AXI на фоне обслуживания CF не имеет значения.

 

У Автора есть CF??

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


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

Ну, так пишет :-)

Я немного уточню задачу. Необходимо, чтобы при включении платы, автоматически загружался MBZ и с CompactFlash грузилась прошивка...

 

 

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


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

Ну, так пишет :-)

Да. Проглядел. ))

Так тоже, наверное, можно сделать.

 

Но все-таки в случае 255 кБ можно и без CF обойтись.

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


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

Можно в Spartan-6 расширить 64к в два раза.

Можно в Spartan-6 разместить все сегменты кроме .text, .init, .fini в дополнительных axi_bram_controllers.

 

И обойтись при этом без бутлоадера? Научите!

Можно для начала с того как 64К в 2 раза расширить. В среде 14.4 и младших вроде как ничего не вышло.

 

А размещение дополнительных сегментов во внешней памяти конечно можно, но только после этого требуется бутлоадер, встроенными средствами вроде как само не выходит...

 

Кстати учитывая наличие CF так может даже проще, в основной памяти, той что легко и непринужденно грузиться сама разместить прожку которая подымает CF, проверяет и копирует образ с нее во "внешнюю память" (массив брамов) и передает туда управление. Это даже проще чем когда исходную прошивку вычитывают из загрузочной флэши ПЛИС...

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


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

И обойтись при этом без бутлоадера? Научите!

Можно для начала с того как 64К в 2 раза расширить. В среде 14.4 и младших вроде как ничего не вышло.

1. Добавить новые BRAM-controllers на шины LMB (а не на AXI).

2. Generate bitstream. Отредактировать system_bd.bmm: добавить ADDRESS_RANGEs, как написано в UG658 в гл. Combined address spaces.

3. Export to SKD. Заменить в linker script два bram-контроллера на один контроллер двойного размера. Расположить в нем все сегменты elf. ProgramFPGA. Enjoy.

4. Зафиксировать в UCF расположение BRAM, чтобы не приходилось всякий раз редактировать BMM. Хотя вообще говоря, редактирование BMM-файла - при использовании totalcmd в буквальном смысле 5 секунд.

Кстати учитывая наличие CF так может даже проще, в основной памяти, той что легко и непринужденно грузиться сама разместить прожку которая подымает CF, проверяет и копирует образ с нее во "внешнюю память" (массив брамов) и передает туда управление. Это даже проще чем когда исходную прошивку вычитывают из загрузочной флэши ПЛИС...

Это, конечно, интересная мысль использовать BRAMs в качестве "внешней памяти". Особенно, когда много BRAMs, и они не нужны .

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


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

и можно кеш выключить и его брамы тоже туда отправить, доступ то наибыстрейший

 

надо будет попробовать по рецепту собрать контроллер с 2 брамами. А также с 4 можно собрать? Ведь с 2 можно, че с 4 нельзя:)?

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


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

и можно кеш выключить и его брамы тоже туда отправить, доступ то наибыстрейший

 

В смысле "кеш выключить"? Он и не мог бы быть включен при отсутствии DDR.

 

надо будет попробовать по рецепту собрать контроллер с 2 брамами. А также с 4 можно собрать? Ведь с 2 можно, че с 4 нельзя:)?

 

Больше чем с 2-мя в Спартане не работает. Проверял.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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