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

как создать RPM из VHDL кода?

Участвую в разработке большого проекта для FPGA Xilinx Spartan 3.

Мне поручили разработать модуль многоканального счетчика в виде RPM (Relationally Placed Macros).

Он должен быть в виде файла mcc.ngc

При финальной сборке проекта этот модуль не должен перекомпилироватся.

Т.е. его можно двигать внутри кристалла без изменения внутренней разводки этого модуля.

 

1. Я создал пустой проект, написал реализацию на VHDL.

Топ модуль у меня - схема - top.sch

 

2. Создал графический элемент и поместил его в top.sch

 

3. На ноги компонента повесил пады

и обозвал их в файле top.ucf с аттрибутом S (SAVE) типа:

...

NET "mcc_data(0)" S;

...

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

иначе синтезатор выкидывает всю логику

 

4. Настроил синтезатор:

"Optimization Goal" - Area

"Add I/O Buffers" - DISABLED

"Keep Hierarchy" - YES

"Enable autofloorplaning" - Incremental design

"Synthesis constraints file" - mcc.xcf

 

в этом файле всего одна строчка:

MODEL "mcc" incremental_synthesis = yes ;

 

"Creation of I/O Pads from Ports" - DISABLED

 

5. Далее запустил Implement design-> View/Edit Routed Design (FPGA Editor)

вижу размещенные компоненты

Запускаю Route -> Auto Route All

...

"Completed route status: 0 of 95 nets are fully routed."

 

6.Tools -> Directed Routing Constraints

Тут 3 опции:

 

First Setting Option: Do not generate Placement Constraint

This setting will generate a constraint for the routing only. It is designed to be used with existing RPMs.

 

Second Setting Option: Use Relative Location Constraint

This setting will generate an RPM for the source and load components along with the routing constraint.

The RPM can be relocated around the device letting the Placer make the final decision on placement.

 

Third Setting Option: Use Absolute Location Constraint

This setting will cause the source and load components attached to the target net to be locked in place.

 

Выбираю 2-ю опцию: Use Relative Location Constraint

Ставлю галочку "Append directed routing constarints to a file"

И жму Apply

 

Делается аппенд(вставка) в файл top.ucf

коментирую свои аттрибуты типа: NET "mcc_data(0)" S;

оставляю незакоменированными аттрибуты которые сгенерил FPGA editor

 

7. Запускаю Implement чтобы используя новый top.ucf синтезировать

mcc.ngc, т.е. RPM файл, который можно будет подцепить к любому проекту....

 

Но синтезатор ругаеца на эти строчки:

 

NET "GLOBAL_LOGIC0"

ROUTE="";

 

NET "XLXI_1/channel_addr_cnt<0>/XLXI_1/channel_addr_cnt<0>.C1VDD.1"

ROUTE="";

 

Закоментирвал первую... Осталась ругань на вторую...

Что делать со второй - не знаю

Похоже он ее не развел...

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


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

Участвую в разработке большого проекта для FPGA Xilinx Spartan 3.

Мне поручили разработать модуль многоканального счетчика в виде RPM (Relationally Placed Macros).

Он должен быть в виде файла mcc.ngc

При финальной сборке проекта этот модуль не должен перекомпилироватся.

Т.е. его можно двигать внутри кристалла без изменения внутренней разводки этого модуля.

Теперь я знаю как это сделать....

Итак как я сделал RPM:

 

1. создал пустой проект top, добавил в проект свой модуль VHDL - mcc.vhd

 

2. создал графический элемент и поместил его в top.sch

 

3. порты модуля в файле top.ucf указал с аттрибутом S (SAVE), например:

NET "mcc_data(0)" S;

... и т.д.

иначе синтезатор выкинет всю логику

 

4. Настроил синтезатор:

 

Synthesize - XST -> Properties:

"Optimization Goal" - Area

"Add I/O Buffers" - DISABLED

"Optimization effort" - HIGH

 

Implement Design -> Properties:

"Creation of I/O Pads from Ports" - DISABLED

"Map Properties -> Trim unconnected Signals" - DISABLED

 

5. Далее запустил Implement design-> View/Edit Placed Design (FPGA Floorplanner)

 

Выделил мышкой свой компонент

 

Floorplan -> Replace All with Placement

 

Разместил необходимые элементы так, как считаю нужно

Размещение лучше начинать от ячейки с координатами R1C1

В этом случае RPM получится менее смещенным,

чем если начать размещение с произвольного места.

 

File -> Write RPM to UCF

сохранил в файл mcc_rpm.ucf

в сохраненном файле нужно заменить

LOC на RLOC

и т.п.

короче нужно этот файл привести к формату:

INST "_n0017(20)421" RLOC = X10Y10 ;

 

далее сохраняю измененный файл как mcc_rpm_rloc.ucf

 

в запускаю в директории проекта команду:

ngcbuild -uc mcc_rpm_rloc.ucf mcc mcc.ngc >io.txt

 

6. теперь полученный файл mcc.ngc и mcc.sym

можно использовать в других проектах без перекомпиляции в виде "black box"

Например, я создал тестовый проект

скопировал туда mcc.ngc и mcc.sym

добавил эти файлы в проект

создал test.ucf:

INST "/*/" RLOC_ORIGIN = X17Y31 ;

 

и сместил таким образом мой "black box" в нужное место

Изменено пользователем cornflyer

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


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

File -> Write RPM to UCF

сохранил в файл mcc_rpm.ucf

в сохраненном файле нужно заменить

LOC на RLOC

и т.п.

короче нужно этот файл привести к формату:

INST "_n0017(20)421" RLOC = X10Y10 ;

Работы провел много, молодец. Для относительно небольших проектов вполне допустимо. По своему личному опыту рекомендую в самом проекте применять RLOC'ки. Преимуществ масса:

1) полный контроль над проектом

2) высокая скорость синтеза и компиляции

3) независимость от версий синтезаторов и компиляторов

4) временные ограничения выполняются вне зависимости от занимаемого объема

5) значительно меньшее энергопотребление за счет коротких связей

6) легко сделать свое IP-core в виде *.edn, *.vhd(wrapped), *.ngc

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


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

Не совсем понятно, зачем создавать графический элемент?

графический элемент создавать не нужно

но млин все равно при сборке проекта мой модуль mcc.ngc

разрываеца на куски по всей площади кристалла

почему так?

он ведь должен был оставаца "кубиком"

 

Работы провел много, молодец. Для относительно небольших проектов вполне допустимо. По своему личному опыту рекомендую в самом проекте применять RLOC'ки. Преимуществ масса:

1) полный контроль над проектом

2) высокая скорость синтеза и компиляции

3) независимость от версий синтезаторов и компиляторов

4) временные ограничения выполняются вне зависимости от занимаемого объема

5) значительно меньшее энергопотребление за счет коротких связей

6) легко сделать свое IP-core в виде *.edn, *.vhd(wrapped), *.ngc

все равно при сборке проекта мой модуль mcc.ngc

разрываеца на куски по всей площади кристалла

почему так?

он ведь должен был оставаца "кубиком"...

может от того что другие модули у меня в проекте не RPM?

поэтому раздробился и мой "black box"....

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


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

все равно при сборке проекта мой модуль mcc.ngc

разрываеца на куски по всей площади кристалла

почему так?

он ведь должен был оставаца "кубиком"

может от того что другие модули у меня в проекте не RPM?

поэтому раздробился и мой "black box"....

Другие модули абсолютно не причем. Все зависит от иерархии, выхода здесь два:

1) изначально ищете в опциях синтезатора исключение иерархии и повторяете свой путь заново

2) в уже полученном *.ucf назначаете дополнительно всем инстанциям атрибут U_SET или каждому иерархическому уровню в целом свой отдельный RLOC

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


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

Другие модули абсолютно не причем. Все зависит от иерархии, выхода здесь два:

1) изначально ищете в опциях синтезатора исключение иерархии и повторяете свой путь заново

2) в уже полученном *.ucf назначаете дополнительно всем инстанциям атрибут U_SET или каждому иерархическому уровню в целом свой отдельный RLOC

млин, хотелось бы поподробнее узнать что делать )))

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


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

хотелось бы поподробнее узнать что делать )))

Попробую показать на примере, а Вы сами потом попытаетесь это проверить.

 

Допустим, у нас есть два примитива в *.ucf:

 

INST "A/A1" RLOC = "R0C0" ;

INST "B/B1" RLOC = "R0C1" ;

 

или другая, эквивалентная запись:

 

INST "A/A1" HU_SET = "BLOCK1" ;

INST "A/A1" RLOC = "R0C0" ;

INST "B/B1" HU_SET = "BLOCK1" ;

INST "B/B1" RLOC = "R0C1" ;

 

где "/" - иерархический символ

В этом случае A1 и B1 будут располагаться, где угодно, потому что принадлежат разным блокам A и B соответственно, даже не смотря на то, что каждому присвоено одинаковое иерархическое имя - "BLOCK1".

Теперь немножко изменим запись на

 

INST "A/A1" U_SET = "BLOCK1" ;

INST "A/A1" RLOC = "R0C0" ;

INST "B/B1" U_SET = "BLOCK1" ;

INST "B/B1" RLOC = "R0C1" ;

 

или

 

INST "A" RLOC = "R0C0" ;

INST "A/A1" HU_SET = "BLOCK1" ;

INST "A/A1" RLOC = "R0C0" ;

INST "B" RLOC = "R0C0" ;

INST "B/B1" HU_SET = "BLOCK1" ;

INST "B/B1" RLOC = "R0C1" ;

 

или

 

INST "A" RLOC = "R0C0" ;

INST "A/A1" RLOC = "R0C0" ;

INST "B" RLOC = "R0C0" ;

INST "B/B1" RLOC = "R0C1" ;

 

Теперь, в первом случае, мы сказали, что A/A1 и B/B1 - это один и тот же блок ("BLOCK1"). Во втором и третьем - просто указали, каким образом скрепить два отдельных блока, в итоге для A/A1 R0C0+R0C0=R0C0, для B/B1 R0C0+R0C1=R0C1.

Более подробно читайте в документе "Constraints Guide", в разделе Constraint Types/Placement Constraints

 

Если проблема не в этом, будем разбираться дальше.

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


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

Более подробно читайте в документе "Constraints Guide", в разделе Constraint Types/Placement Constraints

 

теперь мой файл mcc.ucf

выглядит так:

 

INST "_n0017<20>421" RLOC = "X5Y5" ;

INST "_n0017<20>421" U_SET="MCC_SET" ;

.... и т.п.

 

но это не помогло...

в финальном проекте мой компонент опять разбросало по кристаллу...

млин, придеца еще раз прочиать "Constraints Guide"...

нигде в явном виде не написано как делать rpm (???)

чтобы разводка и расположение оставались в неизменном виде...

 

есть ли такая опция "не трогать этот компонент при разводке"?

Изменено пользователем cornflyer

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


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

есть ли такая опция "не трогать этот компонент при разводке"?

т.е. хотелось бы сохранить топологию компонента

чтобы его на раскидывало с процессе сборки по углам кристалла

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


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

РЕШЕНО : RPM в xilinx ISE 7.1i

 

1. Cоздаем пустой проект, добавляем в проект свой модуль VHDL - my_module.vhd

 

2. Добавляем файл аттрибутов my_module.ucf:

NET "bus(0)" S ;

NET "bus(1)" S ;

...

NET "bus(15)" S ;

...

INST "/*/" AREA_GROUP = "AG_my_module" ;

AREA_GROUP "AG_my_module" RANGE = SLICE_X0Y0:SLICE_X12Y20 ;

 

4. Настраиваем ISE:

 

Synthesize - XST -> Properties:

"Add I/O Buffers" - DISABLED

"Optimization effort" - HIGH

"Optimization Goal" - Speed

 

Implement Design -> Properties:

"Creation of I/O Pads from Ports" - DISABLED

"Map Properties -> Trim unconnected Signals" - DISABLED

 

5. Запускаем синтез проекта:

Запускаем "Implement Design / Place & Route / View/Edit Placed Design (FPGA Floorplanner)"

 

Проверяем что наш модуль поместился в выбранный диапазон SLICE_X0Y0:SLICE_X12Y20

Т.е. смотрим во вкладке Warnings в самом низу окна ISE

Там должны быть только такие сообщения:

...

WARNING:Par:275 - The signal number_of_channels(0) has no driver

...

 

ЕСЛИ ТАМ ЕСТЬ ЧТО-ТО ТИПА:

...

...can't ....

...

Значит проект не поместился -> Повторяем пункт 2 с другим диапазоном SLICE

 

6. В открывшемся окне Floorplanner:

6.1 Выделяем наш модуль

6.2 Floorplan -> Replace All with Placement

6.3 Жмем кнопку Save

 

В появившемся окошке выбираем наш файл атрибутов my_module.ucf и жмем OK.

 

7. В среде ISE запускаем "User Constraints -> Edit Constraints (Text)

Видим что в этот файл были добавлены новые строчки типа:

INST "_n00113611" LOC = "SLICE_X3Y18" ;

...

 

Кликаем правой кнопкой мышки по этому файлу и в выпадающем меню выбираем Select All

Таким образом мы выделили весь текст

Далее меню ISE -> Edit -> Replace...

 

В появившемся окне в поле "Find what:" пишем LOC

В поле "Replace with:" пишем RLOC

Жмем Replace All

 

Таким образом мы заменили во всем файле LOC на RLOC.

 

Теперь повторяем процедуру замены - меняем "SLICE_ на пробел и меняем " ; на ;

Теперь наш файл должен выглядеть следующим образом:

INST "_n00113611" RLOC = X3Y18 ;

...

 

Далее удаляем из нашего файла все строчки типа:

NET "bus(0)" S ;

NET "bus(1)" S ;

...

NET "bus(15)" S ;

...

INST "/*/" AREA_GROUP = "AG_my_module" ;

AREA_GROUP "AG_my_module" RANGE = SLICE_X0Y0:SLICE_X12Y20 ;

 

Отсавляем только строчки, добавленыем Floorplanner'ом.

 

Добавляем к полученному файлу строчку:

INST "/*/" U_SET = "my_module_set" ;

 

8. Создаем в папке нашего проекта файл make_rpm.bat с текстом:

ngcbuild -uc my_module.ucf my_module my_module_RPM.ngc > error.log

 

Запускаем это файл.

В результаете создается файл error.log

Этот файл должен выглядеть так:

...

NGCBUILD Design Results Summary:

Number of errors: 0

Number of warnings: 0

 

Writing NGC file "rpm.ngc" ...

 

Writing NGCBUILD log file "rpm.blc"...

 

NGCBUILD done.

...

 

9. Созданный файл my_module_RPM.ngc является RPM.

Теперь этот модуль можно использовать в других проектах.

Теперь осталось создать для нашего компонента графический модуль:

Design Utilities -> Create Schematic Symbol.

В результате будет создан файл my_module.sym

 

10. Чтобы использовать этот модуль в другом проекте, напрмер top.sch, необходимо

сделать следующее:

 

10.1 Копируем в папку проекта файлы my_module_RPM.ngc и my_module.sym

 

10.2 Synthesize - XST -> Properties:

"Add I/O Buffers" - ENABLED

"Optimization effort" - normal

"Optimization Goal" - Speed

 

10.3 Implement Design -> Properties:

"Map Properties -> Trim unconnected Signals" - ENABLED

 

10.4 Добавляем в проект файл my_module_RPM.ngc

 

10.5 В файл аттрибутов текущего проекта top.ucf добаляем строчки:

INST "my_module_INST" RLOC_ORIGIN = X4Y4 ; # место расположения модуля внутри кристалла ПЛИС

INST "my_module_INST" OPTIMIZE = OFF ;

 

Запускаем "Implement Design / Place & Route / View/Edit Placed Design (FPGA Floorplanner)"

и видим наш модуль размещенным внутри кристалла ПЛИС.

Изменено пользователем cornflyer

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


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

РЕШЕНО : RPM в xilinx ISE 7.1i

.....

Сложно все получается, плюс зависимость от версии. Попробовал сам повторить - у меня в голове все извилины переплелись. Лучше следовать документированным и описанным возможностям. :wacko:

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


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

Сложно все получается, плюс зависимость от версии. Попробовал сам повторить - у меня в голове все извилины переплелись. Лучше следовать документированным и описанным возможностям. :wacko:

Это готовый рабочий способ, если сделать все точно как написано.

Я пытался следовать документированным и описанным возможностям - не получалось.

Ngcbuild ругался что не может найти экземпляр моего компонента, когда я во floorplanner

пытался нажимать Write to UCF file и ставил галочку generate NGC file.

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


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

Сложно все получается, плюс зависимость от версии. Попробовал сам повторить - у меня в голове все извилины переплелись. Лучше следовать документированным и описанным возможностям. :wacko:

Дай хотя бы ссылку на мануал, по которому можно "следовать документированным и описанным возможностям".

Я нашел лишь http://direct.xilinx.com/bvdocs/appnotes/xapp422.pdf

для версии xilinx ISE 6.2i

Но в моей версии 7.1i это не сработало )))

Это вынудило меня заняца хакерством и не поленица написать мануал,

чтобы народ знал как решать такие проблемы.

 

Согласен, что это плохой стиль и неудобно.

Но зато этот способ работает.

Подумаешь, потратишь 5 минут - зато получишь готовый RPM.

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


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

<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>

<<< Как сделать RPM в xilinx ISE 7.1i >>>

<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>

 

1. Cоздаем пустой проект, добавляем в проект свой модуль VHDL - my_module.vhd

 

2. Добавляем файл аттрибутов my_module.ucf:

NET "bus(0)" S ;

NET "bus(1)" S ;

...

NET "bus(15)" S ;

...

INST "/*/" AREA_GROUP = "AG_my_module" ;

AREA_GROUP "AG_my_module" RANGE = SLICE_X0Y0:SLICE_X12Y20 ;

 

4. Настраиваем ISE:

 

Synthesize - XST -> Properties:

"Add I/O Buffers" - DISABLED

"Optimization effort" - HIGH

"Optimization Goal" - Speed

 

Implement Design -> Properties:

"Creation of I/O Pads from Ports" - DISABLED

"Map Properties -> Trim unconnected Signals" - DISABLED

 

5. Запускаем синтез проекта:

Запускаем "Implement Design / Place & Route / View/Edit Placed Design (FPGA Floorplanner)"

 

Проверяем что наш модуль поместился в выбранный диапазон SLICE_X0Y0:SLICE_X12Y20

Т.е. смотрим во вкладке Warnings в самом низу окна ISE

Там должны быть только такие сообщения:

...

WARNING:Par:275 - The signal number_of_channels(0) has no driver

...

 

ЕСЛИ ТАМ ЕСТЬ ЧТО-ТО ТИПА:

...

...can't ....

...

Значит проект не поместился -> Повторяем пункт 2 с другим диапазоном SLICE

 

6. В открывшемся окне Floorplanner:

6.1 Выделяем наш модуль

6.2 Floorplan -> Replace All with Placement

6.3 Жмем кнопку Save

 

В появившемся окошке выбираем наш файл атрибутов my_module.ucf и жмем OK.

 

7. В среде ISE запускаем "User Constraints -> Edit Constraints (Text)

Видим что в этот файл были добавлены новые строчки типа:

INST "_n00113611" LOC = "SLICE_X3Y18" ;

...

 

Кликаем правой кнопкой мышки по этому файлу и в выпадающем меню выбираем Select All

Таким образом мы выделили весь текст

Далее меню ISE -> Edit -> Replace...

 

В появившемся окне в поле "Find what:" пишем LOC

В поле "Replace with:" пишем RLOC

Жмем Replace All

 

Таким образом мы заменили во всем файле LOC на RLOC.

 

Теперь повторяем процедуру замены - меняем "SLICE_ на пробел и меняем " ; на ;

Теперь наш файл должен выглядеть следующим образом:

INST "_n00113611" RLOC = X3Y18 ;

...

 

Далее удаляем из нашего файла все строчки типа:

NET "bus(0)" S ;

NET "bus(1)" S ;

...

NET "bus(15)" S ;

...

INST "/*/" AREA_GROUP = "AG_my_module" ;

AREA_GROUP "AG_my_module" RANGE = SLICE_X0Y0:SLICE_X12Y20 ;

 

Отсавляем только строчки, добавленыем Floorplanner'ом.

 

Добавляем к полученному файлу строчку:

INST "/*/" U_SET = "my_module_set" ;

 

8. Создаем в папке нашего проекта файл make_rpm.bat с текстом:

ngcbuild -uc my_module.ucf my_module my_module_RPM.ngc > error.log

 

Запускаем это файл.

В результаете создается файл error.log

Этот файл должен выглядеть так:

...

NGCBUILD Design Results Summary:

Number of errors: 0

Number of warnings: 0

 

Writing NGC file "rpm.ngc" ...

 

Writing NGCBUILD log file "rpm.blc"...

 

NGCBUILD done.

...

 

9. Созданный файл my_module_RPM.ngc является RPM.

Теперь этот модуль можно использовать в других проектах.

Теперь осталось создать для нашего компонента графический модуль:

Design Utilities -> Create Schematic Symbol.

В результате будет создан файл my_module.sym

 

10. Чтобы использовать этот модуль в другом проекте, напрмер top.sch, необходимо

сделать следующее:

 

10.1 Копируем в папку проекта файлы my_module_RPM.ngc и my_module.sym

 

10.2 Synthesize - XST -> Properties:

"Add I/O Buffers" - ENABLED

"Optimization effort" - normal

"Optimization Goal" - Speed

 

10.3 Implement Design -> Properties:

"Map Properties -> Trim unconnected Signals" - ENABLED

 

10.4 Добавляем в проект файл my_module_RPM.ngc

 

10.5 В файл аттрибутов текущего проекта top.ucf добаляем строчки:

 

INST "XLXI_4" U_SET = "mcc_set1" ;

INST "XLXI_4" RLOC_ORIGIN = X8Y4 ; # место расположения модуля внутри кристалла ПЛИС

INST "XLXI_4" OPTIMIZE = OFF ;

 

INST "XLXI_5" U_SET = "mcc_set2" ;

INST "XLXI_5" RLOC_ORIGIN = X8Y28 ;

INST "XLXI_5" OPTIMIZE = OFF ;

 

Запускаем "Implement Design / Place & Route / View/Edit Placed Design (FPGA Floorplanner)"

и видим наш модуль размещенным внутри кристалла ПЛИС.

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


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

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

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

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

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

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

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

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

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

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