Программирование XC2C64A в среде Xilinx ISE WebPack |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
В этой статье описаны базовые шаги для программирования микросхем логики CPLD на примере микросхемы XC2C64A. 1. Запустите ISE Project Navigator. 2. Выберите в меню File -> New Project. Используйте диалог New Project Wizard - Create New Project Page для ввода общей информации для Вашего проекта. Этот диалог содержит следующие опции для настройки. Name. Задает имя для проекта. Location. Указывает место для размещения (папку) проекта. Вы можете выбрать на диске нужный каталог или ввести имя для директории. Если Вы введете имя директории, которая не существует, то Project Navigator создаст эту директорию. По умолчанию программное обеспечение автоматически создаст подкаталог на основе введенного имени в поле Name. Обратите внимание, что рекомендуется сохранять только один проект в одной папке. Если в одной папке сохранить несколько проектов, то могут произойти конфликты. Working Directory. Задает место размещения рабочей директории. По умолчанию рабочая директория совпадает с директорией проекта (указанной в поле Location). Однако Вы можете указать рабочую директорию, если хотите содержать Ваш файл проекта ISE Design Suite (с расширением .xise) отдельно от рабочей области. Description. Позволяет добавить произвольное текстовое описание для Вашего проекта. Это поле опционально (его заполнять не обязательно). Top-Level Source Type. Выпадающий список, который задает тип исходного модуля для верхнего уровня проекта (top-level design). HDL Выберите этот вариант, если Ваш модуль верхнего уровня должен быть файлом на языке VHDL или Verilog. Проект HDL может включать модули уровнем ниже с другими типами файла, такие как другие файлы HDL, файлы схемы и "черные ящики", такие как интегрированные ядра процессоров (IP cores) и файлы EDIF. Schematic Выберите этот вариант, если Ваш модуль верхнего уровня должен быть файлом схемы. Схематичный проект также может подключать модули уровнем ниже с другими типами файла, точно так же, как это было указано для выбора HDL. Project Navigator автоматически преобразует любые файлы схем в Вашем дизайне в структурированный HDL перед запуском имплементации проекта; таким образом, Вы должны указать инструмент синтеза, когда работаете со схематическими проектами. Примечание: для новичков вариант Schematic подходит лучше всего. EDIF Выберите эту опцию, если хотите использовать список цепей EDIF в качестве исходного модуля верхнего уровня для Вашего проекта. Это может быть тот случай, когда Вы используете инструмент синтеза вне Project Navigator. NGC/NGO Выберите эту опцию, если хотите использовать список цепей NGC или NGO в качестве модуля исходного кода верхнего уровня для Вашего проекта. Следующее окно задает свойства проекта, такие как семейство и тип микросхемы, тип корпуса, скорость, инструмент синтеза и т. д. Используйте диалог свойств проекта для ввода устройства и другой информации. Evaluation Development Board. Указывает модель платы разработчика, используемой в проекте, если это имеет место. Выбор платы автоматически установит следующие опции: Product Category, Family, Device, Package и Speed. Если Вы хотите установить эти опции вручную, установите тип платы None Specified (не указано). Product Category. Задает применимую категорию проекта. Этот выбор фильтрует семейства устройств и устройства, которые доступны для выбора в опциях Family и Device. Family. Задает семейство устройства или архитектуру Xilinx®, в которой реализуется проект. Device. Задает устройство, в котором будет реализован проект. Package. Задает тип корпуса устройства. От этого зависит количество доступных выводов для подключения внешних цепей. Speed. Указывает быстродействие (speed grade) применяемого устройства. Top-Level Source Type. Задает тип исходного кода для модуля верхнего уровня проекта. HDL. Выберите эту опцию, если Ваш модуль верхнего уровня проекта это файл VHDL или файл Verilog. Проект HDL может включать в себя друге модули уровня ниже различных типов, включая файлы HDL, схемы и "черные ящики", такие как ядра интегрированных процессоров (IP cores). Schematic. Выберите эту опцию, если Ваш модуль верхнего уровня проекта это схема. Проект в виде схемы может включать в себя друге модули уровня ниже различных типов, включая файлы HDL, схемы и "черные ящики", такие как ядра интегрированных процессоров (IP cores). Project Navigator автоматически преобразует любые файлы схем в Вашем дизайне в структурированный HDL перед запуском имплементации проекта; таким образом, Вы должны указать инструмент синтеза, когда работаете со схематическими проектами. EDIF Выберите эту опцию, если хотите использовать список цепей EDIF в качестве исходного модуля верхнего уровня для Вашего проекта. Это может быть тот случай, когда Вы используете инструмент синтеза вне Project Navigator. NGC/NGO Выберите эту опцию, если хотите использовать список цепей NGC или NGO в качестве модуля исходного кода верхнего уровня для Вашего проекта. Synthesis Tool. Задает инструментарий синтеза и язык синтеза для проекта. Для инструментов синтеза, которые поддерживают только один язык дизайна, выберите для проекта подходящий язык - например Synplify (VHDL) или Synplify (Verilog). XST. Синтез Xilinx Synthesis Technology (XST) предоставляется вместе с ISE® Design Suite. Он поддерживает проекты, которые используют файлы дизайна VHDL, Verilog и схем. Т. е. поддерживается дизайн, состоящий из смеси языков. Для дополнительной информации см. XST Synthesis Overview site:xilinx.com. Synplify and Synplify Pro. Synplify and Synplify Pro это сторонний интегрированный инструментарий синтеза, который должен быть приобретен отдельно у компании Synopsys, Inc. Программное обеспечение Synplify не поддерживает проекты, которые включают в себя все разновидности языков файлов проекта. Поддерживаются проекты, которые содержат в одном проекте смесь языковых файлов на VHDL и Verilog. Программное обеспечение Synplify и Synplify Pro не поддерживает проекты, которые включают в файлы схем. Для дополнительной информации см. Using Synplify or Synplify Pro Software for Synthesis site:xilinx.com. Precision. Это сторонний интегрированный инструментарий синтеза, который должен быть приобретен отдельно у компании Mentor Graphics, Inc. Программное обеспечение Precision поддерживает проекты, которые включают файлы схем и проекты, которые включают смесь исходных файлов на языках VHDL и Verilog в одном проекте. Для дополнительной информации см. Using Precision Software for Synthesis site:xilinx.com. Обратите внимание, что сторонние инструменты синтеза, такие как Synplify и Precision, доступны только как опция, если это ПО установлено на Вашем компьютере. Если инструмент синтеза установлен, но не появляется в качестве опции, то убедитесь, что путь до инструмента правильно установлен на странице Integrated Tools диалога настроек Preferences. Simulator. Укажите инструмент, используемый для симуляции и язык, используемый для генерации списков сетей симуляции. ISim. Симулятор ISim поставляется в составе ISE Design Suite. Для дополнительной информации см. ISim User Guide (UG660) site:xilinx.com. ModelSim SE/ModelSim PE/ModelSim DE. Симулятор ModelSim это сторонний инструмент, используемый вместе с ISE Design Suite. Для дополнительной информации см. Using the ModelSim or Questa Simulator site:xilinx.com. Имейте в виду, что после приобретения и установки ModelSim укажите перед симуляцией корректный путь до исполняемого файла на странице Integrated Tools диалога настроек Preferences. Questa. Симулятор Questa это сторонний инструмент, используемый вместе с ISE Design Suite. Для дополнительной информации см. ModelSim or Questa Simulator site:xilinx.com. Имейте в виду, что при использование симулятора, который не интегрирован с ISE Design Suite, Вы должны указать ISim. Это гарантирует, что все сгенерированные файлы записаны в правильном формате. Preferred Language. Управляет установкой по умолчанию для обработки свойств, которые генерируют вывод HDL, такие как исходные файлы, промежуточные файлы или структурированные списки цепей симуляции. Если опции Synthesis Tool и Simulator установлены в инструмент на одном языке, то язык по умолчанию для сгенерированных выходных файлов HDL установится автоматически. Если обе опции Synthesis Tool и Simulator установлены на смешанные языки (VHDL/Verilog), то Вы можете использовать свойство Preferred Language для выбора языка, в котором будут создаваться генерируемые выходные файлы HDL. Verilog. Выберите эту опцию, если в обоих установках Synthesis Tool и Simulator заданы смешанные языки, и если Вы хотите использовать в качестве языка по умолчанию Verilog. VHDL. Выберите эту опцию, если в обоих установках Synthesis Tool и Simulator заданы смешанные языки, и если Вы хотите использовать в качестве языка по умолчанию VHDL. N/A. Эта опция появляется, если обе установки Synthesis Tool и Simulator установлены на один язык, потому что генерируемый язык базируется на языке, который выбран в опциях Synthesis Tool и Simulator. Примечание: альтернативно Вы можете поменять целевой язык для каждого процесса в по отдельности в окне Processes панели Design, для этого выберите Process -> Process Properties, и установите язык в окне диалога. Например, для процесса View HDL Functional Model Вы можете указать язык структурированного списка цепей цели в окне диалога Functional Model Properties. Property Specification in Project File. Управляет тем, как свойства сохраняются в файле .xise проекта. Store non-default values only. Выберите эту опцию для сохранения только тех установок, которые не являются установкой свойства по умолчанию. Store all values. Выберите эту опцию для сохранения всех установок свойств, включая значения свойств по умолчанию. Эта опция полезна, когда ведется работа с системами управления исходным кодом, и когда проекты перемещаются между разными версиями ISE Design Suite, потому что будут явно сохранены все свойства проекта. Примечание: для получения дополнительной информации по файлу проекта .xise см. Understanding the Project File site:xilinx.com. Manual Compile Order. По умолчанию порядок компиляции RTL определяется автоматически на основе иерархии дизайна. Эта опция позволяет Вам изменить поведение по умолчанию и установить порядок компиляции вручную. Выбор этой опции запрещает весь иерархический анализ файлов исходного кода HDL, когда они добавляются в проект, и исходные модули дизайна отображаются как плоский список вместо иерархического. Для проектов с большим количеством исходных модулей HDL это может позволить быстрее добавлять файлы в проект. Для дополнительной информации см. Setting a Custom Compile Order site:xilinx.com. VHDL Source Analysis Standard. Задает стандарт языка VHDL, используемый парсером иерархии проекта. Для дополнительной информации см. Understanding the Front-End Design Parser site:xilinx.com. VHDL-93. Выберите эту опцию для установки стандарта VHDL-93, который предоставляет продвинутую поддержку всех конструкций VHDL-93. VHDL-200X. Выберите эту опцию для установки стандарта VHDL-200X, который предоставляет поддержку для выбора дополнительных конструкций, представленных в post-VHDL-93. Примечание: установка этой опции позволяет Project Navigator анализировать проекты, использующие конструкции VHDL-200X. Из-за того, что XST не поддерживает конструкции VHDL-200X, Вы должны использовать разные инструменты синтеза для своего проекта. Enable Message Filtering. Показывает количество сообщений, которые Вы отфильтровали. Вы должны разрешить эту опцию, отфильтровать сообщения, и затем запустить программное обеспечение, чтобы показать количество отфильтрованных сообщений. Для дополнительной информации см. Using Message Filters site:xilinx.com. После клика на кнопке Finish откроется окно пустого проекта. 3. Выберите в меню Project -> New Source... Здесь нас интересует тип Schematic. Выберите его, введите в поле "File Name" имя модуля (я ввел имя top), кликните Next и OK. Я не случайно назвал этот модуль "top". Это особый модуль проекта, так называемый модуль верхнего уровня. Если сравнивать с языками программирования C/C++, то это аналог модуля исходного кода, где находится функция main. Известно, что такой модуль исходного кода на C/C++ может быть только один, то же самое и здесь - в проектах, которые содержат одну микросхему CPLD или FPGA, может быть только один модуль верхнего уровня. В простых проектах вся логика может содержаться только в этом модуле, в более сложных к нему в качестве подчиненных могут быть добавлены дополнительные модули. В нашем случае мы создаем в качестве учебного примера простой логический элемент 2И-НЕ, поэтому будет только один модуль, модуль верхнего уровня, именно поэтому я и назвал его "top" (получится файл top.sch). 4. После создания нового модуля схемы откроется окно редактора схемы (Schematic Editor) с пустой схемой. Если текущий инструмент редактора Select (кнопка со стрелкой), то закладка Options покажет возможный выбор опций для этого инструмента.
5. Перейдите на закладку Symbols. Для начала давайте создадим простейший логический элемент, как в старой доброй микросхеме К155ЛА3, т. е. 2И-НЕ. Для этого нам понадобится инструмент Add Symbol. Слева в разделе Categories выберите пункт Logic, чуть ниже в разделе Symbols выберите nand2, переведите курсор мыши в правую часть окна - возле курсора появится символ логического элемента, который можно вставить в схему. Кликните на любое место чертежа, на схему будет добавлен элемент NAND2. Колесиком мыши можно приближать и удалять (zoom) отображаемое поле схемы. 6. Логический элемент создан, теперь нужно его входы и выходы подключить к выводам реального чипа. Для этого сначала нужно к выводам подключить соединительные провода, что делается кнопкой Add Wire. Если текущий инструмент редактора Add Wire, то закладка Options покажет возможный выбор опций для этого инструмента.
Для соединения двух точек схемы используйте клик левой кнопкой мыши на начальной точке, перетаскивание и отпускание левой кнопки на конечной точке. Используйте последовательные клики, чтобы задавать отдельные сегменты проводника. Двойным кликом завершайте ввод соединения. Добавьте проводники, получится примерно так: 7. Подключение буферов ввода-вывода. Снова выберите инструмент Add Symbol, и перейдите в категорию символов IO, и подключите ко входам символ ibuf, а к выходу символ obuf. Получится вот такая схема: Примечание: ISE позволяет пропустить этот шаг, поскольку настройки компиляции по умолчанию автоматически добавят буферы IO на завершающих шагах компиляции проекта. 8. Размещение маркеров ввода/вывода. Для этого служит инструмент Add IO Marker. Если текущий инструмент редактора Add IO Marker, то закладка Options покажет возможный выбор опций для этого инструмента.
В дополнение к кликам на конце ветви Вы можете выделить курсором мыши прямоугольную область вокруг одной или большего количества точек окончания ветви, чтобы добавить или удалить маркеры I/O в этих точках. Получится примерно следующая схема: 9. Назначение имен сигналов схемы. Сейчас пока что на маркерах проставлены имена, назначенные автоматически. Чтобы дать более осмысленные названия, двойным кликом на маркере можно отредактировать эти значения. Внешний вид завершенной схемы: 10. Для того, чтобы маркеры IO соответствовали именно тем ножкам чипа, которые нам нужны, следует добавить в проект новый файл, так называемый файл ограничений реализации (Implementations Constraints File). Выберите в меню Project -> New Source..., и в качестве типа файла укажите Implementations Constraints File. Дайте имя для файла, для простоты я назвал его pins. Примечание: термин "файл ограничений пользователя" (User Comstraints File, UCF) поначалу вводит начинающего пользователя в заблуждение, поскольку для него трудно ожидать, что этот файл задает привязку создаваемой логики к выводам корпуса микросхемы. Но на самом деле это действительно ограничения, потому что требует от системы синтеза и разводки определенным образом прокладывать на кристалле логические связи. При отсутствии таких ограничений разводка может быть сделана более оптимально - либо с минимальными задержками, либо с минимальной тратой ресурсов микросхемы. Кроме того, файл UCF также может вводить ограничения на интервалы времени (в этом обзоре такие ограничения не рассматриваются). Файл получит расширение *.ucf (сокращение от User Constraints File), и он будет размещен в дереве иерархии проекта (Design Hierarchy) как дочерний по отношению к файлу top. Это простой текстовый файл, в котором можно вручную прописать назначение определенных цепей нужным ножкам микросхемы. Предположим, что нужно сделать такое подключение цепей (цоколевку используемой микросхемы можно посмотреть в даташите):
Тогда файл ограничений (у нас это pins.ucf) будет такой: NET "IN1" LOC = "P38"; NET "IN2" LOC = "P37"; NET "OUT1" LOC = "P28"; Здесь команда NET задает имя цепи схемы, а команда LOC задает номер ножки выбранного корпуса микросхемы (P28 соответствует выводу 28 корпуса, P38 выводу 38, и т. д.). 1. На закладке Sources (Design -> Hierarchy), выберите вариант просмотра Implementation. 2. Выберите корневой элемент проекта (на рисунке это xc2c64a-7VQ44). 3. На закладке Processes раскройте раздел User Constraints. 4. Сделайте двойной клик курсором мыши на пункт Floorplan IO - Pre-Synthesis. Откроется окно запроса "Этот процесс требует добавления файла UCF к проекту и привязки его к выбранному модулю проекта. Хотите ли Вы, чтобы Project Navigator автоматически создал UCF и добавил его к проекту? Если выберете 'No', то Вам нужно будет создать или добавить существующий файл UCF к проекту перед тем, как запустить этот процесс." Выберите Yes, будет автоматически создан файл UCF (для нашего примера это top.ucf) и добавлен к проекту. Также запустится окно редактора Xilinx PACE. 5. С помощью этого редактора можно очень удобно создавать файл ограничений реализации UCF. В окошке Design Object List показана таблица с сигналами нашей схемы (IN1, IN2, OUT1), где можно редактировать привязку этих сигналов к внешним выводам корпуса и их атрибуты, а справа окно Package Pins дает подсказку по именам выводов (P1..P44). Через меню View -> Toolbars -> Legend (Ctrl+L) можно открыть легенду обозначения выводов выбранной микросхемы (Package Pin Legend). 6. Редактированием столбца Loc таблицы Design Object List делается привязка сигналов к выводам: Обратите внимание, что после редактирования поменялась картинка Package Pins, на ней синим цветом закрашиваются выбранные выводы корпуса. Косой черной штриховкой обозначен текущий редактируемый сигнал в таблице (OUT1/P28). 7. Белые ячейки в таблице можно редактировать, задавая различные атрибуты для сигналов на выводах микросхемы. Для нашего примера можно отредактировать: Slew. Этот атрибут можно отредактировать для выхода OUT1, установив его в значение FAST или SLOW. Этот параметр задает скорость переключения выхода микросхемы. Вариант SLOW будет переключать выход медленнее, но снизит энергопотребление. I/O Std. Задает уровни логики, с которыми работает этот сигнал можно выбрать один из вариантов: LVCMOS15, LVCMOS18, LVCMOS25, LVCMOS33 или LVTTL. Цифры обозначают уровни 1.5V, 1.8V, 2.5 и 3.3V. Если Ваша схема питается от 3.3V, то можно выбрать вариант LVCMOS33. Termination. Задает наличие подтяжки к лог. 1 (PULLUP), отсутствие подтяжки (FLOAT) и терминирование по внешней цепи (KEEPER). Подробнее про эти варианты терминирования см. руководство Constraints Guide (папка doc\cgd.pdf [3]). Schmitt. Если выбрать ON, то к сигналу будет подключен триггер Шмитта. Globals. Позволяет выбрать варианты CLK, COOL_CLK, OE или SR (подробнее см. руководство Constraints Guide, папка doc\cgd.pdf [3]). В результате редактирования у меня получилась такая таблица: 8. Сохраните UCF выбором в меню File -> Save. Откроется оно запроса Bus Delimiter, оставьте там все по умолчанию и кликните OK. На диске в корневой папке проекта обновится файл ограничений. У меня получился следующий файл: #PACE: Start of Constraints generated by PACE
#PACE: Start of PACE I/O Pin Assignments
NET "IN1" LOC = "P38" | IOSTANDARD = LVCMOS33 | PULLUP ; NET "IN2" LOC = "P37" | IOSTANDARD = LVCMOS33 | PULLUP ; NET "OUT1" LOC = "P28" | SLEW = SLOW | IOSTANDARD = LVCMOS33 | FLOAT ; #PACE: Start of PACE Area Constraints
#PACE: Start of PACE Prohibit Constraints
#PACE: End of Constraints generated by PACE
11. Все готово к генерации прошивки для микросхемы. Кликните на кнопку с зеленым треугольником Implament Top Module. Друг за другом запустятся процессы Implement Design: Synthesize - XST, Translate, Fit, Generate Programming File. Зеленые кружки с галочками показывают, что все соответствующие процессы завершены успешно. [Запись полученной программы в микросхему] Осталось теперь запрограммировать нашу микросхему XC2C64A. 12. Подключите адаптер Xilinx Program Cable USB к компьютеру и к программируемому устройству через JTAG. На адаптере светодиод должен загореться красным, сигнализируя об успешном подключении к порту USB. Подайте питание 3.3V на программируемую микросхему (у нас это CPLD XC2C64A. На адаптере светодиод поменяет цвет на зеленый, показывая тем самым, что питание на микросхему подано, и железо готово к работе. 13. Выберите в меню Tools -> iMPACT..., запустится окно утилиты программатора. При первом запуске утилиты iMPACT откроется предупреждение, что пока что не существует файл проекта. 14. Выберите в меню Edit -> Launch Wizard..., откроется окно Welcome to iMPACT.
Оставьте выбранным первый вариант "Configure devices using Boundary-Scan chain -> Automatically connect to a cable and identify Boundary-Scan chain", кликните OK. 15. Через несколько секунд автоматически будет обнаружена JTAG-цепь подключенной микросхемы XC2C64A, и будет выведено сообщение "Identify Succeeded". Окно утилиты iMPACT поменяется, справа символически будет показана детектированная цепочка JTAG, состоящая из одной нашей микросхемы. Примечание: при наличии проблем с подключением выберите Output -> Cable Setup..., откроется диалог настройки подключения к адаптеру Xilinx Program Cable (программатор JTAG). Радиокнопками Communication Mode выберите тип кабеля (мой кабель, купленный на aliexpress, соответствует варианту Platform Cable USB/II) и кликните OK. 16. После детектирования цепочки JTAG мастер отобразит окно запроса "Auto Assign Configuration Files Query Dialog" (Вы хотите продолжить и назначить файл (файлы) конфигурации?): Кликните Yes, откроется окно выбора файла, выберите файл top.jed, находящийся в корневой папке проекта, он добавится в проект iMPACT, и откроется окно Device Programming Properties для настройки цепочки JTAG. Ничего менять в этом окне не надо, просто нажмите OK. 17. Кликните на микросхему, слева будет показан список возможных операций над ней. Кликните на Program. Через несколько секунд микросхема запрограммируется, и будет готова к работе. Сохраните файл проекта iMPACT (файл с расширением *.ipf). [Проверка результата] Для проверки, как работает мой логический элемент 2И-НЕ, я собрал вот такой стенд: Для подачи логических сигналов на входы использовались DIP-переключатели, и состояние уровня показывал зеленый светодиод. Схема для одного входа: Для оценки выходного сигнала использовался красный светодиод, включенный вот по такой схеме: После программирования созданный элемент 2И-НЕ работает как полагается:
[Реализация с помощью схемы] RC-генератор можно сделать по классической схеме, с помощью двух инверторов (категория Logic, символ inv), одного входного буфера, двух выходных буферов (категория Buffer, символы ibuf и obuf соответственно), и подключенных снаружи резистора и конденсатора. Пример таблицы настроек портов в программе ISE PACE и соответствующий файл UCF: NET "XTALIN" LOC = "P12" | IOSTANDARD = LVTTL ; NET "XTALOUT1" LOC = "P18" | SLEW = FAST | IOSTANDARD = LVTTL ; NET "XTALOUT2" LOC = "P14" | SLEW = FAST | IOSTANDARD = LVTTL ; Частота RC-генератора не стабильна, и зависит не только от емкости конденсатора и номинала резистора, но и от температуры и напряжения питания. Если конденсатор не ставить, то схема будет генерировать на частоте порядка 70..100 МГц. Если установить кварцевый резонатор вместо конденсатора, то получится кварцевый генератор, работающий на стабильной частоте. Соответствующий автоматически сгенерированный код на языке VHDL (файл top.vhd): library ieee; use ieee.std_logic_1164.ALL; use ieee.numeric_std.ALL; library UNISIM; use UNISIM.Vcomponents.ALL; entity top is port ( XTALIN : in std_logic; XTALOUT1 : out std_logic; XTALOUT2 : out std_logic); end top; architecture BEHAVIORAL of top is attribute BOX_TYPE : string ; signal XLXN_25 : std_logic; signal XLXN_58 : std_logic; signal XLXN_61 : std_logic; component IBUF port ( I : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of IBUF : component is "BLACK_BOX"; component OBUF port ( I : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of OBUF : component is "BLACK_BOX"; component INV port ( I : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of INV : component is "BLACK_BOX"; begin XLXI_29 : IBUF port map (I=>XTALIN, O=>XLXN_25); XLXI_31 : OBUF port map (I=>XLXN_61, O=>XTALOUT1); XLXI_32 : INV port map (I=>XLXN_25, O=>XLXN_61); XLXI_33 : INV port map (I=>XLXN_61, O=>XLXN_58); XLXI_59 : OBUF port map (I=>XLXN_58, O=>XTALOUT2); end BEHAVIORAL; Сокращенный отчет (файл top.rpt): Device Used: XC2C64A-7-VQ44 Fitting Status: Successful ************************* Mapped Resource Summary ************************** Macrocells Product Terms Function Block Registers Pins Used/Tot Used/Tot Inps Used/Tot Used/Tot Used/Tot 2 /64 ( 3%) 2 /224 ( 1%) 2 /160 ( 1%) 0 /64 ( 0%) 3 /33 ( 9%) ** Function Block Resources ** Function Mcells FB Inps Pterms IO CTC CTR CTS CTE Block Used/Tot Used/Tot Used/Tot Used/Tot Used/Tot Used/Tot Used/Tot Used/Tot FB1 0/16 0/40 0/56 0/ 8 0/1 0/1 0/1 0/1 FB2 0/16 0/40 0/56 0/ 9 0/1 0/1 0/1 0/1 FB3 1/16 1/40 1/56 1/ 9 0/1 0/1 0/1 0/1 FB4 1/16 1/40 1/56 1/ 7 0/1 0/1 0/1 0/1 ----- ------- ------- ----- --- --- --- --- Total 2/64 2/160 2/224 2/33 0/4 0/4 0/4 0/4 CTC - Control Term Clock CTR - Control Term Reset CTS - Control Term Set CTE - Control Term Output Enable ** 2 Outputs ** Signal Total Total Bank Loc Pin Pin Pin I/O I/O Slew Reg Reg Init Name Pts Inps No. Type Use STD Style Rate Use State XTALOUT1 1 1 2 FB3_15 18 I/O O LVTTL FAST XTALOUT2 1 1 1 FB4_14 14 I/O O LVTTL FAST ** 1 Inputs ** Signal Bank Loc Pin Pin Pin I/O I/O Name No. Type Use STD Style XTALIN 1 FB4_11 12 I/O I LVTTL KPR ****************************** Device Pin Out ***************************** Device : XC2C64A-7-VQ44 -------------------------------- /44 43 42 41 40 39 38 37 36 35 34 \ | 1 33 | | 2 32 | | 3 31 | | 4 30 | | 5 XC2C64A-7-VQ44 29 | | 6 28 | | 7 27 | | 8 26 | | 9 25 | | 10 24 | | 11 23 | \ 12 13 14 15 16 17 18 19 20 21 22 / -------------------------------- Pin Signal Pin Signal No. Name No. Name 1 KPR 23 KPR 2 KPR 24 TDO 3 KPR 25 GND 4 GND 26 VCCIO-3.3 5 KPR 27 KPR 6 KPR 28 KPR 7 VCCIO-3.3 29 KPR 8 KPR 30 KPR 9 TDI 31 KPR 10 TMS 32 KPR 11 TCK 33 KPR 12 XTALIN 34 KPR 13 KPR 35 VCCAUX 14 XTALOUT2 36 KPR 15 VCC 37 KPR 16 KPR 38 KPR 17 GND 39 KPR 18 XTALOUT1 40 KPR 19 KPR 41 KPR 20 KPR 42 KPR 21 KPR 43 KPR 22 KPR 44 KPR Legend : NC = Not Connected, unbonded pin PGND = Unused I/O configured as additional Ground pin KPR = Unused I/O with weak keeper (leave unconnected) WPU = Unused I/O with weak pull up (leave unconnected) TIE = Unused I/O floating -- must tie to VCC, GND or other signal VCC = Dedicated Power Pin VCCAUX = Power supply for JTAG pins VCCIO-3.3 = I/O supply voltage for LVTTL, LVCMOS33, SSTL3_I VCCIO-2.5 = I/O supply voltage for LVCMOS25, SSTL2_I VCCIO-1.8 = I/O supply voltage for LVCMOS18 VCCIO-1.5 = I/O supply voltage for LVCMOS15, HSTL_I VREF = Reference voltage for indicated input standard *VREF = Reference voltage pin selected by software GND = Dedicated Ground Pin TDI = Test Data In, JTAG pin TDO = Test Data Out, JTAG pin TCK = Test Clock, JTAG pin TMS = Test Mode Select, JTAG pin PROHIBITED = User reserved pin Автоматически сгенерированный код на языке VHDL (файл top.vhd): library ieee; use ieee.std_logic_1164.ALL; use ieee.numeric_std.ALL; library UNISIM; use UNISIM.Vcomponents.ALL; entity COMPM8_MXILINX_top is port ( A : in std_logic_vector (7 downto 0); B : in std_logic_vector (7 downto 0); GT : out std_logic; LT : out std_logic); end COMPM8_MXILINX_top; architecture BEHAVIORAL of COMPM8_MXILINX_top is attribute BOX_TYPE : string ; signal EQ_1 : std_logic; signal EQ_3 : std_logic; signal EQ_5 : std_logic; signal EQ_7 : std_logic; signal EQ2_3 : std_logic; signal EQ4_5 : std_logic; signal EQ6_7 : std_logic; signal GE0_1 : std_logic; signal GE2_3 : std_logic; signal GE4_5 : std_logic; signal GE6_7 : std_logic; signal GTA : std_logic; signal GTB : std_logic; signal GTC : std_logic; signal GTD : std_logic; signal GT_1 : std_logic; signal GT_3 : std_logic; signal GT_5 : std_logic; signal GT_7 : std_logic; signal GT0_1 : std_logic; signal GT2_3 : std_logic; signal GT4_5 : std_logic; signal LE0_1 : std_logic; signal LE2_3 : std_logic; signal LE4_5 : std_logic; signal LE6_7 : std_logic; signal LTA : std_logic; signal LTB : std_logic; signal LTC : std_logic; signal LTD : std_logic; signal LT_1 : std_logic; signal LT_3 : std_logic; signal LT_5 : std_logic; signal LT_7 : std_logic; signal LT0_1 : std_logic; signal LT2_3 : std_logic; signal LT4_5 : std_logic; component AND2B1 port ( I0 : in std_logic; I1 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of AND2B1 : component is "BLACK_BOX"; component OR4 port ( I0 : in std_logic; I1 : in std_logic; I2 : in std_logic; I3 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of OR4 : component is "BLACK_BOX"; component NOR2 port ( I0 : in std_logic; I1 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of NOR2 : component is "BLACK_BOX"; component AND3 port ( I0 : in std_logic; I1 : in std_logic; I2 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of AND3 : component is "BLACK_BOX"; component OR2 port ( I0 : in std_logic; I1 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of OR2 : component is "BLACK_BOX"; component AND3B1 port ( I0 : in std_logic; I1 : in std_logic; I2 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of AND3B1 : component is "BLACK_BOX"; component XNOR2 port ( I0 : in std_logic; I1 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of XNOR2 : component is "BLACK_BOX"; component AND2 port ( I0 : in std_logic; I1 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of AND2 : component is "BLACK_BOX"; component AND4 port ( I0 : in std_logic; I1 : in std_logic; I2 : in std_logic; I3 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of AND4 : component is "BLACK_BOX"; begin I_36_1 : AND2B1 port map (I0=>A(7), I1=>B(7), O=>LT_7); I_36_3 : OR4 port map (I0=>LTD, I1=>LTC, I2=>LTB, I3=>LTA, O=>LT); I_36_4 : NOR2 port map (I0=>GT4_5, I1=>LT4_5, O=>EQ4_5); I_36_5 : AND3 port map (I0=>EQ6_7, I1=>EQ4_5, I2=>LT2_3, O=>LTB); I_36_6 : OR2 port map (I0=>LT_3, I1=>LE2_3, O=>LT2_3); I_36_7 : OR2 port map (I0=>GT_3, I1=>GE2_3, O=>GT2_3); I_36_8 : OR2 port map (I0=>GT_1, I1=>GE0_1, O=>GT0_1); I_36_9 : AND3B1 port map (I0=>A(0), I1=>EQ_1, I2=>B(0), O=>LE0_1); I_36_10 : AND3B1 port map (I0=>B(0), I1=>EQ_1, I2=>A(0), O=>GE0_1); I_36_11 : AND3B1 port map (I0=>A(2), I1=>EQ_3, I2=>B(2), O=>LE2_3); I_36_12 : AND3B1 port map (I0=>B(2), I1=>EQ_3, I2=>A(2), O=>GE2_3); I_36_13 : XNOR2 port map (I0=>A(1), I1=>B(1), O=>EQ_1); I_36_14 : AND2B1 port map (I0=>B(1), I1=>A(1), O=>GT_1); I_36_15 : XNOR2 port map (I0=>A(3), I1=>B(3), O=>EQ_3); I_36_16 : AND2B1 port map (I0=>A(1), I1=>B(1), O=>LT_1); I_36_17 : AND2B1 port map (I0=>B(3), I1=>A(3), O=>GT_3); I_36_18 : OR2 port map (I0=>LT_1, I1=>LE0_1, O=>LT0_1); I_36_19 : AND2B1 port map (I0=>A(3), I1=>B(3), O=>LT_3); I_36_20 : AND2 port map (I0=>GT4_5, I1=>EQ6_7, O=>GTC); I_36_21 : AND2 port map (I0=>EQ6_7, I1=>LT4_5, O=>LTC); I_36_22 : NOR2 port map (I0=>GTD, I1=>LTD, O=>EQ6_7); I_36_23 : OR2 port map (I0=>LT_5, I1=>LE4_5, O=>LT4_5); I_36_24 : AND2B1 port map (I0=>B(7), I1=>A(7), O=>GT_7); I_36_25 : AND2B1 port map (I0=>A(5), I1=>B(5), O=>LT_5); I_36_26 : XNOR2 port map (I0=>A(7), I1=>B(7), O=>EQ_7); I_36_27 : AND2B1 port map (I0=>B(5), I1=>A(5), O=>GT_5); I_36_28 : XNOR2 port map (I0=>A(5), I1=>B(5), O=>EQ_5); I_36_29 : AND3B1 port map (I0=>B(6), I1=>EQ_7, I2=>A(6), O=>GE6_7); I_36_30 : AND3B1 port map (I0=>A(6), I1=>EQ_7, I2=>B(6), O=>LE6_7); I_36_31 : AND3B1 port map (I0=>B(4), I1=>EQ_5, I2=>A(4), O=>GE4_5); I_36_32 : AND3B1 port map (I0=>A(4), I1=>EQ_5, I2=>B(4), O=>LE4_5); I_36_33 : OR2 port map (I0=>GT_5, I1=>GE4_5, O=>GT4_5); I_36_34 : OR2 port map (I0=>GT_7, I1=>GE6_7, O=>GTD); I_36_35 : OR2 port map (I0=>LT_7, I1=>LE6_7, O=>LTD); I_36_36 : AND4 port map (I0=>EQ6_7, I1=>EQ4_5, I2=>EQ2_3, I3=>LT0_1, O=>LTA); I_36_37 : AND4 port map (I0=>GT0_1, I1=>EQ2_3, I2=>EQ4_5, I3=>EQ6_7, O=>GTA); I_36_38 : AND3 port map (I0=>GT2_3, I1=>EQ4_5, I2=>EQ6_7, O=>GTB); I_36_39 : NOR2 port map (I0=>GT2_3, I1=>LT2_3, O=>EQ2_3); I_36_40 : OR4 port map (I0=>GTD, I1=>GTC, I2=>GTB, I3=>GTA, O=>GT); end BEHAVIORAL; library ieee; use ieee.std_logic_1164.ALL; use ieee.numeric_std.ALL; library UNISIM; use UNISIM.Vcomponents.ALL; entity CJD8CE_MXILINX_top is port ( C : in std_logic; CE : in std_logic; CLR : in std_logic; Q : out std_logic_vector (7 downto 0)); end CJD8CE_MXILINX_top; architecture BEHAVIORAL of CJD8CE_MXILINX_top is attribute BOX_TYPE : string ; signal Q7B : std_logic; signal Q_DUMMY : std_logic_vector (7 downto 0); component INV port ( I : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of INV : component is "BLACK_BOX"; component FDDCE generic( INIT : bit := '0'); port ( C : in std_logic; CE : in std_logic; CLR : in std_logic; D : in std_logic; Q : out std_logic); end component; attribute BOX_TYPE of FDDCE : component is "BLACK_BOX"; begin Q(7 downto 0) <= Q_DUMMY(7 downto 0); I_36_61 : INV port map (I=>Q_DUMMY(7), O=>Q7B); XLXI_1 : FDDCE port map (C=>C, CE=>CE, CLR=>CLR, D=>Q_DUMMY(2), Q=>Q_DUMMY(3)); XLXI_2 : FDDCE port map (C=>C, CE=>CE, CLR=>CLR, D=>Q_DUMMY(1), Q=>Q_DUMMY(2)); XLXI_3 : FDDCE port map (C=>C, CE=>CE, CLR=>CLR, D=>Q_DUMMY(0), Q=>Q_DUMMY(1)); XLXI_4 : FDDCE port map (C=>C, CE=>CE, CLR=>CLR, D=>Q7B, Q=>Q_DUMMY(0)); XLXI_5 : FDDCE port map (C=>C, CE=>CE, CLR=>CLR, D=>Q_DUMMY(3), Q=>Q_DUMMY(4)); XLXI_6 : FDDCE port map (C=>C, CE=>CE, CLR=>CLR, D=>Q_DUMMY(4), Q=>Q_DUMMY(5)); XLXI_7 : FDDCE port map (C=>C, CE=>CE, CLR=>CLR, D=>Q_DUMMY(5), Q=>Q_DUMMY(6)); XLXI_8 : FDDCE port map (C=>C, CE=>CE, CLR=>CLR, D=>Q_DUMMY(6), Q=>Q_DUMMY(7)); end BEHAVIORAL; library ieee; use ieee.std_logic_1164.ALL; use ieee.numeric_std.ALL; library UNISIM; use UNISIM.Vcomponents.ALL; entity top is port ( D0 : in std_logic; D1 : in std_logic; D2 : in std_logic; D3 : in std_logic; D4 : in std_logic; D5 : in std_logic; XTALIN : in std_logic; PWMN : out std_logic; PWMP : out std_logic; XTALOUT1 : out std_logic; XTALOUT2 : out std_logic); end top; architecture BEHAVIORAL of top is attribute BOX_TYPE : string ; attribute HU_SET : string ; signal A : std_logic_vector (7 downto 0); signal B : std_logic_vector (7 downto 0); signal Q : std_logic_vector (7 downto 0); signal XLXN_25 : std_logic; signal XLXN_58 : std_logic; signal XLXN_61 : std_logic; signal XLXN_176 : std_logic; signal XLXN_177 : std_logic; signal XLXN_179 : std_logic; signal XLXN_180 : std_logic; component IBUF port ( I : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of IBUF : component is "BLACK_BOX"; component OBUF port ( I : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of OBUF : component is "BLACK_BOX"; component INV port ( I : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of INV : component is "BLACK_BOX"; component CJD8CE_MXILINX_top port ( C : in std_logic; CE : in std_logic; CLR : in std_logic; Q : out std_logic_vector (7 downto 0)); end component; component PULLUP port ( O : out std_logic); end component; attribute BOX_TYPE of PULLUP : component is "BLACK_BOX"; component GND port ( G : out std_logic); end component; attribute BOX_TYPE of GND : component is "BLACK_BOX"; component COMPM8_MXILINX_top port ( A : in std_logic_vector (7 downto 0); B : in std_logic_vector (7 downto 0); GT : out std_logic; LT : out std_logic); end component; component BUF port ( I : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of BUF : component is "BLACK_BOX"; attribute HU_SET of XLXI_134 : label is "XLXI_134_0"; attribute HU_SET of XLXI_137 : label is "XLXI_137_1"; begin XLXI_29 : IBUF port map (I=>XTALIN, O=>XLXN_25); XLXI_31 : OBUF port map (I=>XLXN_61, O=>XTALOUT1); XLXI_32 : INV port map (I=>XLXN_25, O=>XLXN_61); XLXI_33 : INV port map (I=>XLXN_61, O=>XLXN_58); XLXI_59 : OBUF port map (I=>XLXN_58, O=>XTALOUT2); XLXI_134 : CJD8CE_MXILINX_top port map (C=>XLXN_61, CE=>XLXN_176, CLR=>XLXN_177, Q(7 downto 0)=>Q(7 downto 0)); XLXI_135 : PULLUP port map (O=>XLXN_176); XLXI_136 : GND port map (G=>XLXN_177); XLXI_137 : COMPM8_MXILINX_top port map (A(7 downto 0)=>A(7 downto 0), B(7 downto 0)=>B(7 downto 0), GT=>XLXN_179, LT=>XLXN_180); XLXI_138 : OBUF port map (I=>XLXN_179, O=>PWMP); XLXI_139 : OBUF port map (I=>XLXN_180, O=>PWMN); XLXI_143 : BUF port map (I=>Q(5), O=>A(5)); XLXI_144 : BUF port map (I=>Q(4), O=>A(4)); XLXI_145 : BUF port map (I=>Q(3), O=>A(3)); XLXI_146 : BUF port map (I=>Q(2), O=>A(2)); XLXI_148 : BUF port map (I=>Q(1), O=>A(1)); XLXI_149 : BUF port map (I=>Q(0), O=>A(0)); XLXI_175 : IBUF port map (I=>D5, O=>B(5)); XLXI_176 : IBUF port map (I=>D4, O=>B(4)); XLXI_177 : IBUF port map (I=>D3, O=>B(3)); XLXI_178 : IBUF port map (I=>D2, O=>B(2)); XLXI_179 : IBUF port map (I=>D1, O=>B(1)); XLXI_180 : IBUF port map (I=>D0, O=>B(0)); end BEHAVIORAL; Сокращенный отчет (файл top.rpt): Device Used: XC2C64A-7-VQ44 Fitting Status: Successful ************************* Mapped Resource Summary ************************** Macrocells Product Terms Function Block Registers Pins Used/Tot Used/Tot Inps Used/Tot Used/Tot Used/Tot 14 /64 ( 22%) 42 /224 ( 19%) 28 /160 ( 17%) 8 /64 ( 12%) 11 /33 ( 33%) ** Function Block Resources ** Function Mcells FB Inps Pterms IO CTC CTR CTS CTE Block Used/Tot Used/Tot Used/Tot Used/Tot Used/Tot Used/Tot Used/Tot Used/Tot FB1 10/16 12/40 21/56 0/ 8 1/1* 0/1 0/1 0/1 FB2 0/16 0/40 0/56 0/ 9 0/1 0/1 0/1 0/1 FB3 3/16 15/40 20/56 3/ 9 0/1 0/1 0/1 0/1 FB4 1/16 1/40 1/56 1/ 7 0/1 0/1 0/1 0/1 ----- ------- ------- ----- --- --- --- --- Total 14/64 28/160 42/224 4/33 1/4 0/4 0/4 0/4 CTC - Control Term Clock CTR - Control Term Reset CTS - Control Term Set CTE - Control Term Output Enable * - Resource is exhausted ** 4 Outputs ** Signal Total Total Bank Loc Pin Pin Pin I/O I/O Slew Reg Reg Init Name Pts Inps No. Type Use STD Style Rate Use State PWMN 14 14 2 FB3_1 29 I/O O LVTTL FAST PWMP 10 14 2 FB3_2 28 I/O O LVTTL FAST XTALOUT1 1 1 2 FB3_15 18 I/O O LVTTL FAST XTALOUT2 1 1 1 FB4_14 14 I/O O LVTTL FAST ** 7 Inputs ** Signal Bank Loc Pin Pin Pin I/O I/O Name No. Type Use STD Style D0 2 FB1_1 38 I/O I LVTTL KPR D1 2 FB1_2 37 I/O I LVTTL KPR D2 2 FB1_3 36 I/O I LVTTL KPR D3 2 FB1_9 34 GTS/I/O I LVTTL KPR D4 2 FB1_10 33 GTS/I/O I LVTTL KPR D5 2 FB1_11 32 GTS/I/O I LVTTL KPR XTALIN 1 FB4_11 12 I/O I LVTTL KPR ****************************** Device Pin Out ***************************** Device : XC2C64A-7-VQ44 -------------------------------- /44 43 42 41 40 39 38 37 36 35 34 \ | 1 33 | | 2 32 | | 3 31 | | 4 30 | | 5 XC2C64A-7-VQ44 29 | | 6 28 | | 7 27 | | 8 26 | | 9 25 | | 10 24 | | 11 23 | \ 12 13 14 15 16 17 18 19 20 21 22 / -------------------------------- Pin Signal Pin Signal No. Name No. Name 1 KPR 23 KPR 2 KPR 24 TDO 3 KPR 25 GND 4 GND 26 VCCIO-3.3 5 KPR 27 KPR 6 KPR 28 PWMP 7 VCCIO-3.3 29 PWMN 8 KPR 30 KPR 9 TDI 31 KPR 10 TMS 32 D5 11 TCK 33 D4 12 XTALIN 34 D3 13 KPR 35 VCCAUX 14 XTALOUT2 36 D2 15 VCC 37 D1 16 KPR 38 D0 17 GND 39 KPR 18 XTALOUT1 40 KPR 19 KPR 41 KPR 20 KPR 42 KPR 21 KPR 43 KPR 22 KPR 44 KPR **************************** Compiler Options **************************** Following is a list of all global compiler options used by the fitter run. Device(s) Specified : xc2c64a-7-VQ44 Optimization Method : DENSITY Multi-Level Logic Optimization : ON Ignore Timing Specifications : OFF Default Register Power Up Value : LOW Keep User Location Constraints : ON What-You-See-Is-What-You-Get : OFF Exhaustive Fitting : OFF Keep Unused Inputs : OFF Slew Rate : FAST Set Unused I/O Pin Termination : KEEPER Global Clock Optimization : ON Global Set/Reset Optimization : ON Global Ouput Enable Optimization : ON Enable Input Registers : ON Function Block Fan-in Limit : 38 Use DATA_GATE Attribute : ON Set Tristate Outputs to Termination Mode : KEEPER Default Voltage Standard for All Outputs : LVCMOS18 Input Limit : 32 Pterm Limit : 28 [Реализация на VHDL] Давайте попробуем сравнить, как будет отличаться реализация того же самого ШИМ, если применить не редактор схем, а прямое программирование VHDL. Код, написанный вручную, получается намного проще автоматически сгенерированного из схемы, хотя он выполняет те же самые функции: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.numeric_std.all; use IEEE.std_logic_arith.all; entity top is Port ( XTALIN : in STD_LOGIC; XTALOUT1: out STD_LOGIC; XTALOUT2: out STD_LOGIC; D : in STD_LOGIC_VECTOR (5 downto 0); PWMP : out STD_LOGIC; PWMN : out STD_LOGIC); end top; architecture Behavioral of top is signal COUNT : unsigned ( 5 downto 0 ); signal CLK: STD_LOGIC; begin CLK <= not XTALIN; XTALOUT1 <= CLK; XTALOUT2 <= not CLK; process (CLK)begin if CLK'event and CLK='1' then COUNT <= COUNT + 1; end if; end process; PWMP <= '0' when std_logic_vector(COUNT) < D else '1'; PWMN <= '0' when std_logic_vector(COUNT) >= D else '1'; end Behavioral; Различия по используемым ресурсам CPLD для схематической реализации и реализации на VHDL я для сравнения свел в таблицу.
Реализация на VHDL однозначно выигрывает по количеству использования макроячеек, функциональных блоков и P-термов. [Реализация на Verilog] Тот же самый проект, но реализованный на Verilog.
Интересно, что реализация на Verilog по некоторым параметрам обошла реализацию на VHDL.
[Ссылки] 1. Как установить Xilinx ISE Design Tools. |