|
Содержание
Синтез Xilinx FPGA в пакетном режимеРазработчики FPGA обычно пользуются графическими оболочками типа Xilinx ISE или Aldec Active-HDL. Но существует также возможность запуска транслятора в пакетном режиме, что имеет определённые преимущества. Например, при длительном сопровождении проекта возникает необходимость пересборки системы из исходных текстов на другом компьютере или на другой версии синтезатора. При диалоговом режиме возникают проблемы с восстановлением нужных режимов синтезатора (а их сотни). Второе преимущество - возможность отслеживания изменений в конфигурации синтезатора. При пакетном запуске все настройки режимов синтезатора хранятся в текстовом виде, что даёт возможность сравнения версий в SVN. Диалоговые оболочки обычно хранят настройки в бинарном виде, и сравнение версий не работает. Синтез для XilinxПодробно процесс синтеза описан в статье Валерия Зотова. xstСинтезатор XST (расшифровывается как Xilinx Synthesis Technology) преоразует исходное описание на языке высокого уровня в список логических цепей (netlist). Документация на сайте Xilinx. На входе нужно создать файл параметров синтеза и файл-список модулей на языке Verilog. Файл параметров синтеза “project.xst”: run -top regfile -p xc3s500e-fg320-5 -opt_mode Speed -opt_level 1 -ifn project.src -ifmt mixed -ofn project.ngc -ofmt NGC Файл со списком модулей исходного Verilog-кода “project.src”: verilog work regs.v verilog work alu.v verilog work bus.v verilog work uart.v Запуск синтезатора: xst -ifn project.xst -ofn project.log -intstyle silent В результате порождаются следующие файлы:
ngdbuildУтилита NGDBuild преобразует файл NGC в файл формата NGD, описывающий схему в виде элементарных логических элементов (И, ИЛИ, декодеры, триггеры и память). Документация на сайте Xilinx. Кроме файла NGC, требуется также файл топологических ограничений UCF. В частности, в нем задается привязка сигналов к ножкам микросхемы, например файл “pins.ucf”: NET "clk" LOC = "A10"; NET "reg_wr" LOC = "A3"; NET "reg_a[0]" LOC = "A4"; NET "reg_a[1]" LOC = "A5"; NET "reg_a[2]" LOC = "A6"; (и т. д.) При запуске необходимо указать также тип микросхемы: ngdbuild -p xc3s500e-fg320-5 project.ngc -uc pins.ucf В результате порождаются следующие файлы:
mapУтилита MAP отображает схему из файла NGD, представленную в виде элементарных логических элементов, на компоненты заданной конкретной микросхемы программируемой логики. Результат записывается в файл NCD (Native Circuit Description) — физическое представление проекта в компонентах данного чипа Xilinx FPGA. Документация на сайте Xilinx. При запуске необходимо указать тип микросхемы. Флаг “-pr b” разрешает размещать триггеры как в i-, так и в o-регистрах: map -pr b -p xc3s500e-fg320-5 project В результате порождаются следующие файлы:
parТрассировщик PAR читает файл NСD, производит размещение компонентов и трассировку соединений. Также используется файл ограничений PCF, порожденный утилитой MAP. Результат записывается в другой файл в вормате NCD (Native Circuit Description). Документация на сайте Xilinx. При запуске флаг “-w” разрешает перезаписывать существующие файлы: par -w project project_r.ncd В результате порождаются следующие файлы:
trceУтилита TRCE (Timing Reporter and Circuit Evaluator) производит временной анализ синтезированной схемы. Документация на сайте Xilinx. Вызов: trce -v 25 project_r.ncd project.pcf Порождается файл:
bitgenУтилита BITGEN читает файл NCD и выдает файл прошивки для загрузки в чип FPGA. Документация на сайте Xilinx. При запуске флаг “-w” разрешает перезаписывать существующие файлы, флаг “-l” включает создание файла “project_r.ll”: bitgen project_r.ncd -l -w ФЛАГИ Флаги задают конфигурацию микросхемы, например: -g TdoPin:PULLNONE \ -g DonePin:PULLUP \ -g CRC:enable \ -g StartUpClk:CCLK Порождается файл:
Обобщающий MakefileВсе эти этапы синтеза можно объединить в одном файле Makefile. DESIGN = regfile SRC = regfile.v DEVICE = xc3s500e-fg320-5 BGFLAGS = -g TdoPin:PULLNONE -g DonePin:PULLUP \ -g CRC:enable -g StartUpClk:CCLK all: $(DESIGN).bit clean: rm -f *~ cleanall: clean rm -rf build $(DESIGN).bit build/project.src: @[ -d build ] || mkdir build @rm -f $@ for i in $(SRC); do echo verilog work ../$$i >> $@; done build/project.xst: build/project.src echo "run" > $@ echo "-top $(DESIGN)" >> $@ echo "-p $(DEVICE)" >> $@ echo "-opt_mode Speed" >> $@ echo "-opt_level 1" >> $@ echo "-ifn project.src" >> $@ echo "-ifmt mixed" >> $@ echo "-ofn project.ngc" >> $@ echo "-ofmt NGC" >> $@ build/project.ngc: build/project.xst $(SRC) cd build && xst -ifn project.xst -ofn project.log -intstyle silent build/project.ngd: build/project.ngc pins.ucf cd build && ngdbuild -p $(DEVICE) project.ngc -uc ../pins.ucf build/project.ncd: build/project.ngd cd build && map -pr b -p $(DEVICE) project build/project_r.ncd: build/project.ncd cd build && par -w project project_r.ncd build/project_r.twr: build/project_r.ncd cd build && trce -v 25 project_r.ncd project.pcf $(DESIGN).bit: build/project_r.ncd build/project_r.twr cd build && bitgen project_r.ncd -l -w $(BGFLAGS) @mv -f build/project_r.bit $@ |
||