РадиоКот :: Первое знакомство с ПЛИС Xilinx.
Например TDA7294

РадиоКот >Обучалка >Микроконтроллеры и ПЛИС >Осваиваем ПЛИС Xilinx >

Теги статьи: ПЛИС(FPGA)Добавить тег

Первое знакомство с ПЛИС Xilinx.

Автор: KT315B
Опубликовано 13.11.2008

Итак, начну свое повествование о программируемой логике фирмы Xilinx, в котором постараюсь помочь начинающим с освоением этих замечательных микросхем. Начнем с самого главного - что эти микросхемы из себя представляют, и с чем их едят. Ну-с, приступим! Эта контора (Xilinx, разумеется) выпускает несколько семейств микросхем программируемой логики, предназначенных для различных целей и отличающихся между собой ценой и объемом (эквивалентным количеством логических вентилей). Микросхемы разделяются между собой на три основных группы: CPLD (CMOS Programmed Logic Device), FPGA (Field Programmed Gate Array) и конфигурационные ПЗУ для FPGA, разделенные между собой на три семейства - XC17xx, XC18xx и Platform Flash. Рассмотрим подробней что из себя представляют все эти группы и какие микросхемы в них входят.

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

С FPGA дело обстоит несколько иначе - эти микросхемы гораздо сложнее устроены (некоторые даже содержат в себе по несколько процессорных ядер PowerPC), требуют наличия конфигурационного ПЗУ (это объясняется тем, что сами микросхемы построены по технологии Static RAM, то есть при каждом включении их нужно "загружать"), однако они способны вместить в себя гораздо более сложные и большие проекты, нежели CPLD и достаточно гибки для проектировщика (в частности снимается ограничение по количеству триггеров).

Конфигурационные ПЗУ предназначены для загрузки статической памяти FPGA. Семейство XC17xx - самое старое, представляет собой однократно программируемые микросхемы. XC18xx - EEPROM, а значит, их можно перепрограммировать многократно. Platform Flash - новое семейство конфигурационных микросхем, выполненных по технологии Flash ROM.

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

Итак, начнем! Для начала нам понадобится собрать программатор и установить необходимое ПО на свой компьютер. Вот схема программатора:

Программатор

Как видите - все просто и никаких мудреностей ненужно. Такой программатор позволяет работать с многими типам ПЛИС и конфигурационных ПЗУ Xilinx. Теперь о софте - основной продукт для разработке устройств на ПЛИС Xilinx - это Xilinx ISE. ISE существует в нескольких вариантах, однако доступней всех - дистрибутив ISE Webpack, который можно скачать отсюда, правда для этого придется зарегистрироваться. Денег никто просить не будет, поэтому все останутся довольны и никто не будет обманут. Итак, программатор собран, ISE установлен - можно начинать!

С чего же мы начнем? Чтобы начать проектировать на ПЛИС нам нужно определиться с микросхемой, на которой мы будем проектировать. Возьмем XC95144 - это КМОП ПЛИС, с архитектурой CPLD, с 5-и вольтовым вводом-выводом, содержащая 144 макроячейки. Макроячейка - это основной кирпичик CPLD. Каждая макроячейка содержит запоминающий элемент, который может быть запрограммирован как D-триггер или как тактируемый триггер-защелка, а может быть и не использован вовсе. Отсюда и такое ограничение по триггерам (144 макроячейки=144 триггера). Микросхема XC95144 поддерживает внутрисистемное программирование - то есть ее можно перепрограммировать сколько угодно (в пределах ее ресурса, конечно!) раз, прямо на плате, на которой она используется. Еще одно важное замечание - XC95144 производится в нескольких корпусах - TQFP-100, PQFP-100 и PQFP-160, которые отличаются распиновкой и количеством выводов, доступных для программирования пользователем. Мы будем рассматривать вариант микросхемы в корпусе PQFP-160. Вот так она выглядит:

XC95144

Ну что, страшно? Да ничего страшного - бывают корпуса и пострашнее!
Ну а теперь, непосредственно приступим к делу! Запускаем ISE с помощью ярлыка на рабочем столе, который был создан инсталлятором. Открывается пустое окно с двумя боковыми панелями, рядом кнопок наверху и менюшкой. Зачем это все нужно - разберемся позже - сейчас нам нужно создать проект.

Выбираем в меню File->New Project, вводим имя проекта, путь, где наш проект будет располагаться и выбираем Top->Level Source Type->Schematic. Это означает, что основной модуль нашего проекта (в иерархической системе) будет введен в виде схемы.

Щелкаем Next - перед нами появляется окно с кучей параметров нашего проекта. Поле Product Category нас сейчас мало волнует (честно говоря, вообще не пойму, как оно отражается на проекте). Family - это семейство ПЛИС, с которым мы будем работать - выбираем 9500 CPLDs. Device - непосредственно микросхема, под которую будет создаваться проект - тут выбираем угадайте что? Правильно - XC95144! Package - тип корпуса у нашей микросхемы - выбираем PQ160. Speed - скоростной параметр микросхемы (на фотке микросхемы выше обозначен как 15С в самом низу. А вообще этот параметр обозначает минимальную задержку распространения сигнала в ПЛИС "контакт-контакт" в наносекундах. То есть в указанной микросхеме такая задержка равна 15нс - таким образом можно рассчитать максимальную тактовую частоту - около 66МГц. Остальные параметры касаются синтеза (процесса перегонки нашего проекта в вид, в котором он будет расположен на кристалле) и симуляции проекта. Выбираем XST в качестве Synthesis Tool, симулятор ISE Simulator (что характерно) и Preferred Language - VHDL. VHDL - потому что этот язык гораздо "ближе" к Xilinx, нежели Verilog.

Когда мы все заполнили - самое время нажать Next и добавить "головной" файл проекта в появившемся диалоге выбираем тип Schematic и вводим имя файла, пускай это будет main.sch. Далее нажимаем еще несколько раз Next, Finish и проект создан.
Что мы видим: пустое поле, где мы будем вводить схему, две панели с вкладками и окошко с консолью снизу. Сейчас нас интересует панель, на которой присутствуют четыре вкладки - Sources, Shapshots, Libraries и Symbols. Зайдем на вкладку Symbols - остальные нас пока не интересуют. Перед нами два списка - Categories и Symbols. Догадаться не сложно - в первой у нас находится список категорий символов (арифметика, буферы и т.п.) а во второй - сами символы. При выбранной категории All Symbols - в нижнем списке отображаются все символы, которые мы можем использовать в нашем проекте. Для разных семейств ПЛИС эти списки могут отличаться.
Попробуем построить какую-нибудь схему, например счетчик, считающий до 10. Для этого выберем категорию Counter, а в ней элемент - cb4ce. Выделив этот компонент мы можем "бросить" на схему сколь угодно таких счетчиков - прекратить это можно нажатием на правую кнопку мыши (появится контекстное меню) или выбором инструмента "стрелочка" на панели вверху. Итак, кидаем на схему один такой счетчик.

Для начала разберемся с назначением его выводов:
CE - вход разрешения счета, можно повесить на него какую-нибудь логику, а можно просто подтянуть на "плюс питания" с помощью компонента Vcc из категории General, что мы и сделаем.
С - собственно счетный вход нашего счетчика, сюда будем подавать тактовый сигнал.
CLR - асинхронный сброс счетчика, счетчик находится в состоянии сброса всегда, когда на этом входе присутствует логическая "1".
Q0..Q3 - выходы счетчика, как несложно догадаться.
CEO - выход разрешения счета, его значение соответствует значению, поданному на вход CE - предназначен для каскадирования счетчиков
TC - окончание счета - при переполнении счетчика на этом выходе появляется лог. "1".

Отлично, счетчик у нас есть, но он будет считать не до 10, как нам нужно а от 0 до 15 - значит нам понадобится цепь сброса. Спроектировать ее можно так: поставить логику на выход счетчика, которая будет отлавливать число "11" на его выходе и сразу при его появлении сбрасывать счетчик. Для этих целей нам хорошо подойдет компонент and4b3 - (b3 здесь означает, что 2 входа вентиля "И" в данном случае инверсные). Но мы пойдем иным путем, и вот почему. Допустим, счетчик у нас должен считать не до 10, а, скажем до 1234, а это 11 разрядов - придется городить логику, что не есть хорошо, когда все можно сделать просто и красиво. Воспользуемся компаратором. Выбираем категорию Comparator и компонент comp4. Компаратор работает просто - при равенстве чисел, поданных на входы A[1..4] и B[1..4] он выдает логическую единицу на своем единственном выходе EQ. Подсоединим входы "А" нашего компаратора к выходам счетчика, а выход компаратора соединим с входом асинхронного сброса счетчика. Для этого на панели сверху выберем инструмент Add Wire, нажав на кнопку, на которой нарисован карандаш рисующий провод. Итак, счетчик с компаратором у нас соединены, осталось подать число "11" на вход компаратора обозначенный как "В". Можно просто подтянуть на питание и землю (c помощью компонентов vcc и gnd) входы компаратора, а можно сделать тоже самое с помощью компонента Constant из категории General. Бросим этот компонент на нашу схему. По умолчанию в него записана константа FFFF, но нам нужно записать туда число "В" в шестнадцатеричной системе счисления равное 11. Для этого два раза щелкнем мышкой на этом компоненте, чтобы отредактировать его свойства. В открывшемся окне нас интересует свойство Cvalue - туда запишем "В", причем безо всяких нулей и нажмем "ОК". После нажатия "ОК" мы видим на схеме, что значение константы равно "В", то есть 11 в десятеричной системе. И тут мы сталкиваемся с одной трудностью: входов у компаратора четыре, а выход у константы всего один! Как быть? Дело в том, что выход компонента Constant представляет собой шину, этим-то мы и воспользуемся! Выберем уже знакомый инструмент Add Wire с помощью кнопки с карандашом и "соединим" нашу константу с пустым местом на схеме - просто немного "протянем от нее провод" и закрепим его двойным щелчком рядом с компонентом. Это и будет наша шина. Чтобы можно было работать с этой шиной - ей нужно присвоить имя. Выбираем инструмент Add Net Name, кнопкой, на которой нарисован провод с буквами "ABC" и на панели, на которой всего две вкладки (на скриншотах - слева) выбираем вкладку Options, где в поле Name вводим: "count_max(3:0)"

После ввода имени шины курсор стал выглядеть как крестик с надписью "count_max(3:0)" - подведем курсор к красному квадратику с края "провода" у компонента с константой и щелкнем. Таким образом мы только что присвоили имя шине, которая подключена у нас к компоненту constant. Теперь можно с помощью этой шины подключить константу ко входу "В" компаратора. Для этого уже знакомым образом соединим входы "В" компаратора с пустым местом на схеме. И с помощью инструмента присвоения имени цепи подключим компаратор к константе таким образом:

Итак, перед нами почти завершенная схема - теперь осталось создать порты для связи с внешним миром. В этом нам поможет инструмент Add I/O Marker. Выглядит он вот так: . Просто выбираем этот инструмент, щелкаем по квадратику радом с выводом "С" нашего счетчика и тут же вход счетчика становится портом. Осталось его только переименовать в нечто удобочитаемое, скажем в "CLK". Для этого два раза щелкнем мышкой на маркер и в окне свойств введем имя "CLK". Теперь осталось сделать тоже самое с выходами счетчика. Так как они уже заняты компаратором - придется их "вытягивать" наружу, чтобы можно было подключить к ним маркеры. Протянем четыре "провода" от выходов счетчика в свободное место на схеме, прямо из середины, вот так:

Теперь можно подключить к ним маркеры и присвоить им имена, допустим такие Q0, Q1, Q2 и Q3. Когда все сделано правильно - схема должна выглядеть вот так:

Теперь проект можно сохранять и компилировать. Сохраним проект тривиальным образом, нажав кнопку с дискеткой на панели. Теперь его надо откомпилировать. Для этого на панели с четырьмя вкладками выберем Sources, а на той панели, которая с двумя вкладками выберем Processes. Под "процессами" тут подразумевается набор действий, который мы можем сделать с выбранным исходником. Для этого выбираем наш "головной" файл main.sch. Смотрим, что мы можем с ним сделать. На этом этапе нас интересует процесс Implement Design - это собственно компиляция проекта. Раскроем дерево.

Перед нами четыре этапа компиляции проекта - Synthesize - это собственно синтез проекта, разложение того, что мы только что нарисовали на элементарные части, входящие в макроячейку. Translate - перевод всего этого на язык описания аппаратуры (кстати, на нем тоже можно прекрасно проектировать, но это я оставлю для самостоятельного изучения, ибо VHDL не уместить даже в десятке подобных статей). Fit - это оптимизация нашего проекта под выбранную ПЛИСину и, наконец, Generate Programming File - это и есть генерация кода, который будет записан в ПЛИС. Щелкнем два раза по "корню" дерева - Implement Design. Начался процесс компиляции проекта - спокойно дождемся когда он закончится. Зайдем на вкладку Warnings на панели с логом компиляции внизу. Там нам сообщают, что мы не подключили выходы счетчика CEO и TC, которые нам собственно не нужны, и что также, не подключен вход счетчика CE (разрешение счета) и поэтому он установлен в "0". Это говорит о том, что счетчик работать не будет - исправим эту ошибку, подтянув этот вход к питанию, с помощью компонента Vcc.

Сохраним и заново перекомпилируем проект. Как мы видим предупреждение о неподключенном входе разрешения счета исчезло - можно продолжать. Чтобы проверить работоспособность нашего проекта - его нужно просимулировать, чем мы сейчас и займемся. В левой панели сверху мы видим список, в котором сейчас выбрано Synthesis/Implementation. Для симуляции проекта нам нужно выбрать пункт Behavioral Simulation в котором щелкнув правой кнопкой мыши по списку исходников создать новый файл в проекте. Для симуляции нам нужно задать входные параметры - это мы и сделаем с помощью добавления в проект файла типа Test Bench Waveform, который назовем counter_test.tbw.

Нам предложат выбрать элемент проекта, который мы хотим просимулировать - так как у нас в проекте всего один файл - выбираем его. Появляется окно, в котором надо указать параметры симуляции проекта.

Оставим там все как есть и нажмем Finish. Файл с данными для симуляции создан, однако на экране мы видим всего четыре тактовых импульса, чего явно недостаточно для полноценной проверки работоспособности нашего счетчика. Увеличим виртуальное время симуляции проекта щелкнув правой кнопкой на нашей свежесозданной временной диаграмме и выбрав пункт Set end of test bench. Пускай это будет 10000 nS - этого времени нам будет достаточно, чтобы увидеть как наш счетчик досчитает до 10 и сбросится. Сохраним наш файл с временной диаграммой и посмотрим, что можно с ним сделать во вкладке Processes (как это сделать, надеюсь, запомнили?) Помимо предложений создать новый исходник и просмотреть то, что мы только что натворили в виде VHDL нам предлагают просимулировать наш проект, что мы сейчас и сделаем. Раскрываем "дерево" Xilinx ISE Simulator и запускаем процесс Simulate Behavioral Model. Итак, в панели с логом побежали сообщения, комп задумался и выдал нам временную диаграмму симуляции нашего проекта. И о чудо! Счетчик действительно считает до 10-и!

Ну что же, проект создан, проверен на работоспособность - неплохо бы его и в ПЛИСину зашить? Ну тогда приступим к подготовительным мероприятиям. Задумайся, читатель - у нашей микросхемы XC95144 аж целых 160 ног, а в нашем проекте использованы только 5, к каким же ногам подключать осциллограф и куда подавать тактовые импульсы? В этом нам поможет утилита PACE, которую можно найти в меню Пуск->Программы->Xilinx ISE 9.2i->Accessories. Запустим эту программу. Перед нами открылось пустое окно - нужно создать новый файл распиновки. Выбираем в меню пункт File->New и перед нами появляется окно для создания нового файла. В поле New Constrains (UCF) file укажем путь, где будет располагаться наш файл с распиновкой. Самым правильным будет создать его в директории проекта и назвать так же, как головной модуль проекта. В поле Input Design File необходимо указать файл с данными о компиляции проекта (с расширением .ngd) и в третьем поле, с помощью кнопки Select Part выбрать семейство (9500 CPLDs), микросхему (XC95144), корпус (PQ160) и скоростную способность (-15) микросхемы. Завершающим этапом создания нового файла будет нажатие кнопки ОК. Итак, перед нами окно в котором мы видим схематическое изображение корпуса ПЛИСины, и список сигналов нашего проекта (на нижней панели слева). Как мы видим, на схематичном изображении корпуса микросхемы выводы помечены разными цветами. Выводы помеченные красным, светло-зеленым и фиолетовым это питание ядра, земля и питание выходных буферов соответственно. Желтые выводы - это выводы JTAG, предназначенные для программирования микросхемы - именно их нужно подключать к программатору. Еще видны выводы, обведенные красным, черным и синим цветами - это GSR (Global Set/Reset), который можно использовать для установки или сброса всех триггеров в проекте (для этого достаточно их назначить), GTS (Global Tri-State) - для перевода всех буферов ПЛИС в "третье" состояние и GCK (Global Clock) - для подачи тактового сигнала. Пусть наш тактовый сигнал будет подключен к GCK1 (33-я нога ПЛИС), остальные сигналы нашего проекта можно расположить произвольно. Однако для определенности пусть они будут подключены к выводам 11,12,13 и 14 по возрастанию. Если все сделано правильно - должно получиться вот так:

Теперь нужно сохранить наш файл и вернуться в ISE, чтобы добавить его в проект. Только чтобы его добавить нужно вернуться в список исходников Synthesis/Implementation. После добавления файла с распиновкой можно закрыть PACE и перекомпилировать проект. Для верности - можно заглянуть в раздел Pin List отчета, который создается после каждой перекомпиляции проекта.
На этом этапе проект готов - можно делать макетную плату с ПЛИСиной и тактовым генератором и проверять проект на "живом железе", но это я, пожалуй, оставлю для самостоятельной работы. Скажу лишь то, что для программирования ПЛИС предназначена утилита iMPACT, запустить которую можно прямо из ISE. Много материалов по программированию доступно на сайте Xilinx, поэтому повторяться не буду.

Вопросы, как обычно, складываем тут.




Как вам эта статья?

Заработало ли это устройство у вас?

41 1 0
3 2 0

Эти статьи вам тоже могут пригодиться: