Первое знакомство с ПЛИС Xilinx.
Автор: KT315B
Итак, начну свое повествование о программируемой логике фирмы Xilinx, в котором постараюсь помочь начинающим с освоением этих замечательных микросхем. Начнем с самого главного - что эти микросхемы из себя представляют, и с чем их едят. Ну-с, приступим! Эта контора (Xilinx, разумеется) выпускает несколько семейств микросхем программируемой логики, предназначенных для различных целей и отличающихся между собой ценой и объемом (эквивалентным количеством логических вентилей). Микросхемы разделяются между собой на три основных группы: CPLD (CMOS Programmed Logic Device), FPGA (Field Programmed Gate Array) и конфигурационные ПЗУ для FPGA, разделенные между собой на три семейства - XC17xx, XC18xx и Platform Flash. Рассмотрим подробней что из себя представляют все эти группы и какие микросхемы в них входят.
Как видите - все просто и никаких мудреностей ненужно. Такой программатор позволяет работать с многими типам ПЛИС и конфигурационных ПЗУ Xilinx. Теперь о софте - основной продукт для разработке устройств на ПЛИС Xilinx - это Xilinx ISE. ISE существует в нескольких вариантах, однако доступней всех - дистрибутив ISE Webpack, который можно скачать отсюда, правда для этого придется зарегистрироваться. Денег никто просить не будет, поэтому все останутся довольны и никто не будет обманут. Итак, программатор собран, 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 и проект создан.
Для начала разберемся с назначением его выводов: Отлично, счетчик у нас есть, но он будет считать не до 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 отчета, который создается после каждой перекомпиляции проекта.
Вопросы, как обычно, складываем тут.
Эти статьи вам тоже могут пригодиться: |
|
|||||||||||||||
|
||||