МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ им. Н. Э. БАУМАНА Факультет: Информатика и системы управления. Кафедра: Проектирование и технология производства электронной аппаратуры (ИУ4). ______________________________________________________________________________ Методическое пособие по теме: «Основы проектирования ПЛИС на примере архитектуры FPGA фирмы Xilinx с использованием системы сквозного проектирования Xilinx ISE и системы цифрового моделирования ModelSim SE» Москва 2009 Содержание 1. Введение. ...................................................................................................................................................................... 3 2. Теоретическая часть. ................................................................................................................................................. 4 2.1. Общие вопросы проектирования цифровых схем. .................................................................................................. 4 2.2. Внутренняя структура ПЛИС. ................................................................................................................................ 8 2.3. Основы языка описания цифровых схем VHDL. .................................................................................................... 13 2.4. Краткое описание используемой отладочной платы. .......................................................................................... 18 2.5. Краткое описание средств проектирования ПЛИС............................................................................................. 20 3. Практическая часть. ................................................................................................................................................ 22 3.1. Знакомство со средой Xilinx ISE WebPACK. Создание проекта. ......................................................................... 22 3.2. Реализация проекта при помощи графического редактора схем. ....................................................................... 25 3.3. Реализация проекта при помощи языка VHDL. ..................................................................................................... 28 3.4. Моделирование проекта в среде ModelSim SE....................................................................................................... 33 3.5. Конфигурирование кристалла и проверка его работы на отладочном комплекте. .......................................... 38 3.6. Задание для самостоятельного выполнения. ........................................................................................................ 39 4. Список литературы. ................................................................................................................................................. 40 1. Введение. В данном методическом пособии будет рассмотрено одно из перспективных на сегодняшний день направлений в проектировании цифровых схем — технология программируемых логических интегральных схем, сокращенно ПЛИС. Будут рассмотрены области применения ПЛИС и их премущества перед другими техническими решениями в конкретных областях. Также будут представлены краткие теоретические сведения по архитектуре ПЛИС FPGA фирмы Xilinx и по языку описания цифровых схем VHDL. В практическую часть войдёт описание работы со средами Xilinx ISE WebPACK и ModelSim SE и упражнения для начального освоения навыков проектирования. 3 2. Теоретическая часть. 2.1. Общие вопросы проектирования цифровых схем. Прежде всего, рассмотрим, какая на сегодняшний день существует элементная база в области разработки цифровых схем, и для решения каких задач используются цифровые схемы, а затем оттолкнемся от этой информации в нужном нам направлении. С момента появления электроники, цифровая техника прошла большой путь. Не будем вспоминать про первые ламповые компьютеры размерами с огромный зал, а перейдем сразу к транзисторной эпохе. С появлением в 1947 году транзисторов постепенно была развита область цифровых интегральных схем (первые появились в 1958г), которые получили широкое распространение благодаря небольшим размерам и низкой стоимости. Микросхемы те, как правило были довольно простые (по сегодняшним меркам) и выполняли как правило одну конкретную логическую функцию — логические операции И, ИЛИ, НЕ, исключающее ИЛИ. Помимо этих, самых простых функций существовали всевозможные шифраторы, дешифраторы, триггеры, счетчики и прочие элементы, с которыми читатель наверняка знаком. Подобные микросхемы выпускаются и по сей день (хотя, конечно, они стали меньше по размерам и лучше по характеристикам), до сих пор находят применение и получили кодовое название «жесткая логика». В 1971 году, тогда еще очень молодая и небольшая компания Intel выпустила свой первый микропроцессор — i4004, предназначавшийся для использования в калькуляторах, однако, по сути, он был универсальным. За прошедшие почти 40 лет микропроцессорная область всячески развивалась и совершенствовалась, и сейчас мы видим изобилие компаний, занимающихся их разработкой и производством. Помимо этого, появился производный от 4 микропроцессора элемент — микроконтроллер, отличающийся от своего предшественника наличием встроенных периферийных интерфейсов, специализированных таймеров, внутренних тактовых генераторов и прочих полезных дополнений, вплоть до встроенных АЦП и ЦАП. В конце 70-х годов прошлого столетия произошел еще один переворот в области цифровой техники. Появились программируемые логические интегральные схемы (ПЛИС, PLD — programming logic device), позволявшие в одном кристалле моделировать любые сложные логические функции. На сегодняшний день существует множество различных архитектур ПЛИС (CPLD, FPGA, FPOA, FPSC, PAL, GAL, PLA, ULA) и их разработкой и производством занимается множетсво компаний, к примеру Actel, Altera, Atmel, Xilinx, Lattice Semiconductor, QuickLogic, Achronix Semiconductor, MathStar. В двух словах, ПЛИС представляют из себя матрицу логических блоков или ячеек, каждая из которых может быть запрограммирована разработчиком нужным ему образом. В противовес «жесткой логике», такие электронные компоненты называют «программируемой логикой». Помимо описанных выше трёх направлений цифровой логики, существуют еще микросхемы памяти, области применения которых, пожалуй, очевидны (кстати говоря, микросхемы EPROM относят к первым PLD), а также всевозможные специализированные под конкретную задачу микросхему (к примеру — преобразователи уровня, или микросхема-FM-приемник). Кроме того, существуют так называемые ASIC — «application-specific integrated circuit», заказные микросхемы с функциональностью, заложенной заказчиком. Какие же задачи решает цифровая электроника? Это задачи хранения, обработки и отображения цифровых данных (к примеру — обработка хранящейся во flash-памяти информации с целью последующей выдачи её на экран дисплея), задачи управления и автоматизации 5 различных систем (к примеру — управление подачей питания на различные устройства в завимимости от состояния внешней среды), цифровая обработка сигналов (к примеру, частотная фильтрация звука, или избавление от шумов в аудио и видео данных). Так что же можно получить от ПЛИС? Ну во-первых, выполнить сложную логическую схему под конкретную задачу на одном кристалле, это будет намного эффективнее, чем использовать жесткую логику, занимать меньше места на печатной плате, и соотношение цена/качество будет выше. Причем тем выше, чем сложнее схема, т.к. моделирование ПЛИС значительно проще по сравнению с моделированием схем на жесткой логике. Таким образом, ПЛИС — достойный конкурент ASIC. А если учесть, что ASIC выгодно заказывать только большими партиями (сделать на заказ всего лишь 1 кристалл, или даже небольшую партию выльется в приличную сумму), то для малого и среднего производства ПЛИС — единственный вариант. Во-вторых, задача цифровой обработки сигналов. Обычные микроконтроллеры для этого не подходят, т.к. в их принцип положено последовательное выполнение команд, а в ЦОС как правило требуется параллельная обработка. Поэтому быстродействие ПЛИС будет в несколько раз больше быстродействия микроконтроллера, работающего на той же частоте. Есть правда, специализированное направление среди микроконтроллеров, так называемые DSP (ЦСП) — digital signal processor (цифровой сигнальный процессор), но и их отношение цена/производительность значительно ниже, чем у ПЛИС. Для сравнения на рисунке 2.1.1 приведены характеристики по производительности универсального процессора Pentium II (450 МГц), цифровых сигнальных процессоров TMS320C5416 (160 МГц), TMS320C6701 (167 МГц) и AD21062 (40 МГц), ПЛИС Xilinx XCV100-4 (серия Virtex, 100 тыс. 6 вентилей) и XCV400-4 (серия Virtex, 400 тыс. вентилей) при выполнении операций умножения с накоплением (MAC, multiply & accumulation, эти операции используются во многих алгоритмах ЦОС) 8-, 16- и 32-битных операндов с фиксированной точкой. Рис. 2.1.1. Конечно, было бы некорректным проводить анализ сравнительной производительности реализации алгоритмов ЦОС без учета их стоимости. На рисунке 2.1.2 приведена удельная стоимость 1 млн. МАС в секунду для ранее рассмотренных устройств, и, как видно, ПЛИС обеспечивают наиболее низкие стоимостные затраты при значительном выигрыше в производительности. Рис. 2.1.2. 7 2.2. Внутренняя структура ПЛИС. Как уже говорилось выше, существует множество различных фирмпроизводителей ПЛИС и множество различных архитектур. Остановимся на ПЛИС фирмы Xilinx, т.к. она является общепризнанным лидером в этом сегменте, а также обладает хорошей и подробной документацией. Небольшое лирическое отступление: к сожалению, впечатление от нынешнего изобилия выпускаемых микросхем сильно портит документация — у многих компаний она совершенно нечеткая и непоследовательная, порой даже с ошибками, а некоторые компании вообще не удосуживаются её созданием, в результате чего, применение их продукции становится практически невозможным. Помимо качественной документации, фирма Xilinx свободно распространяет программное обеспечение для проектирования. Фирма Xilinx выпускает ПЛИС двух архитектур — CPLD (Complex Programmable Logic Devices) и FPGA (Field Programmable Gate Array). Остановимся на архитектуре FPGA, т.к. она является более гибкой, и в конечном счете, предоставляет больше возможностей, хотя в данном пособии подробно рассмотреть их все не удастся. Как же устроена архитектура FPGA? Основу FPGA составляют CLB — configurable logic block, конфигурируемая логическая ячейка. Каждый CLB состоит из четырех так называемых Slice, см. рисунок 2.2.1. 8 Рис. 2.2.1. Каждый Slice включает в себя: 2 элемента комбинационной логики - look-up table (LUT) 2 элемента последовательной логики (D-триггер/защелка) Логика переноса Несколько мультиплексоров для каскадирования LUT На рисунке 2.2.2 представлена упрощенная структура Slice. Рис. 2.2.2. 9 LUT представляет из себя элемент комбинационной логики с четырьмя входами и одним выходом, который может быть запрограммирован под выполнение любой логической функции четырех переменных, y = f(x1, x2, x3, x4). D-триггеры обладают, как это им и положено тактовым входом (на рисунке 2.2.2 он обозначен в виде треугольника), data-входом («D»), входом разрешения работы («CE», chip enable), входом сброса («CLR»), входом установки начального значения («PRE») и выходом «Q». Также, элементы последовательностной логики могут быть запрограммированы не только как триггер, но и как защелка. Логика переноса выполнена таким образом, что перенос распространяется по кристаллу снизу вверх. Мультиплексоры используются для построения функций, более сложных, чем те, которые могут быть реализованы двумя LUT одного Slice. При помощи них можно каскадировать выходы LUT из различных Slice. На рисунке 2.2.3 отражен принцип, по которому происходит описанное выше каскадирование LUT нескольких Slice при помощи мультиплексоров. Как это видно из рисунка, существует несколько типов мультиплексоров, каждый из которых обладает определенной функцией и названием (MUXF5, 6, 7, 8). Рис. 2.2.3. 10 LUT можно запрограммировать на выполнение функции 16-разрядного сдвигового регистра, так называемого SRL16CE, см. рисунок 2.2.4. Рис. 2.2.4. При менени е SRL16 CE даёт возмож ность организовать задержку на 16 тактов без использования 16-ти триггеров, что позволяет более эффективно использовать ресурсы кристалла. К каждому программируемому выводу кристалла FPGA подключен специальный блок IOB, реализующий переключение функции вывода — вход или выход. Структура IOB представлена на рисунке 2.2.5. 11 Рис. 2.2.5. Однако, устройство FPGA не ограничивается одними CLB и IOB. Помимо них в кристалле имеется также специальная оперативная память, разделенная на блоки 18Кбит, из-за чего получила кодовое название «блочная память» (Block RAM, Block memory, BRAM). Также, в FPGA есть встроенные скоростные умножители двух 18-разрядных операндов, выполняющие операцию умножения за 1 такт. Во многом благодаря этим умножителям FPGA и имеет возможность дать фору в скорости вычислений обычным процессорам и ЦСП. И еще одна полезная функция есть в FPGA — по всему кристаллу идут специальные цепи для тактирующего сигнала, задержка распространения по которым составляет не более 1нс, что позволяет создавать высокоскоростные синхронные схемы, т.к. в сихронных схемах очень важно, чтобы тактовые импульсы приходили одновременно (читать «с наименьшей задержкой по времени») на все элементы. 12 2.3. Основы языка описания цифровых схем VHDL. VHDL (VHSIC (very-high-speed-integrated-circuit) hardware description language) – специальный язык для описания высокоскоростных цифровых схем. Он отличается от всем привычных и широко используемых ныне императивных языков программирования (таких, как С++ или Pascal; далее будем называть их «обычными» языками). И основное его отличие заключается в следующем. Суть обычного языка программирования сводится к тому, что компьютер последовательно, команду за командой выполняет программу. И в каждый конкретный момент времени выполняется только одна команда (не будем сейчас рассматривать многозадачность и создание потоков, в простейшем случае – это так). И вообще говоря, это соответствует изначальной структуре всех процессоров – последовательное выполнение кода. Но всем известно, что в цифровой схеме может одновременно, параллельно проходить несколько цепочек вычислений. Реализацию такой функциональности и даёт нам VHDL. Чтобы понять, как реализован этот принцип, рассмотрим такой простой пример. Строки: Net1 <= ‘0’; Net2 <= Net1; приведут к тому же результату, что и Net2 <= Net1; Net1 <= ‘0’; а именно к тому, что двум цепям (сигналам, или просто кускам провода, если хотите), Net1 и Net2 будет присвоено значение «0», т.е. выражаясь понятиями цифровой схемотехники, логического нуля. Здесь «<=», как нетрудно догадаться, это оператор присваивания в языке VHDL. В конце каждой команды ставится точка с запятой. Значения сигналов пишутся в одинарных кавычках – ‘0’, ‘1’. 13 Значения шин – в двойных кавычках – “00001010”, X”0A”. По умолчанию все данные представляются в двоичном коде, если же перед первой кавычкой стоит знак X – то в шестнадцатеричном. Сами сигналы объявляются следующим образом: signal Net1: std_logic; signal Net2: std_logic = ‘1’; Здесь во второй строчке сигналу присвоено значение по умолчанию, которое будет загружено в него сразу после загрузки кристалла. Для объявления шины используется следующая конструкция: signal Bus1: std_logic_vector (7 downto 0); - это мы объявили 8-разрядную шину. Помимо сигналов, можно объявлять также и всем привычные переменные целого типа, integer, которые нам также пригодятся (забегая вперед – для реализации счетчиков), к примеру: signal Count: integer range 0 to 65535; Простейшие логические операции, такие как НЕ, И, ИЛИ, исключающее ИЛИ, выполняются соответствующими ключевыми словами — not, and, or, xor, к примеру, следующая конструкция y <= not (x1 and x2); является аналогией такой схемы: Рис. 2.3.1. 14 Еще одним важным элементом языка VHDL является процесс – он используется для описания как элементов комбинаторной, так и последовательностной логики. Выглядит он в общем случае вот так: process (<all_input_signals_separated_by_commas>) begin <statements>; end process; Вне процессов описываются только элементы комбинаторной логики. Есть в VHDL и оператор условия, используется внутри процесса: if <condition> then <statement> elsif <condition> then <statement> else <statement> end if; Есть и оператор CASE, также для процесса: case (<2-bit select>) is when "00" => <statement>; when "01" => <statement>; when "10" => <statement>; when "11" => <statement>; when others => <statement>; end case; 15 У обоих последних операторов есть аналоги для использования вне процесса. Для IF: <name> <= <expression> when <condition> else <expression> when <condition> else <expression>; Для CASE: with <choice_expression> select <name> <= <expression> when <choices>, <expression> when <choices>, <expression> when others; Всевозможные шифраторы-дешифраторы реализуются очень просто – при помощи выше описанных операторов CASE, и комбинаторных аналогов IF и CASE. Чтобы описать простейший D-триггер, используется следующая конструкция (на рисунке 2.3.2, справа от кода, представлено соответствующее УГО элемента): process (C) begin if rising_edge(C) then Q <= D; end if; end process; Рис. 2.3.2. 16 Описание простейшего счетчика выглядит так: process (<clock>) begin if <clock>='1' and <clock>'event then if <clock_enable>='1' then <count> <= <count> + 1; end if; end if; end process; Все эти конструкции запоминать не обязательно, т.к. они есть в специальном «Language Templates» среды Xilinx ISE WebPACK, работу с которой мы рассмотрим далее. Помимо выше приведенных, там еще очень много всевозможных шаблонов кода на все случаи жизни. 17 2.4. Краткое описание используемой отладочной платы. В нынешнее время многими фирмами практикуется выпуск специальных отладочных комплектов, позволяющих проверить конкретную микросхему в действии и оценить её возможности, не тратя время на подробное изучение документации, рисование принципиальной схемы и разводку печатной платы. Называются такие комплекты разными словами: отладочный (оценочный) комплект (макет, плата), Starter Kit, Evaluation Kit, Evaluation Board. Также их можно использовать и для разработки устройств общего назначения. Отладочные комплекты представляют из себя печатную плату с установленными на ней тестируемой микросхемой (ради которой всё и затевается) и еще группы различных элементов, предназначенных для правильной работы микросхемы и для её проверки (в частности, это могут быть всевозможные устройства ввода/вывода). Архитектура FPGA фирмой Xilinx представлена в двух семействах — Spartan и Virtex. Если в двух словах, то микросхемы семейства Spartan — более простые и дешевые, а Virtex — более сложные и дорогие, причем разница между ними составляет в среднем примерно порядок, как в цене, так и в производительности. Поэтому мы в данном методическом пособии остановимся на семействе Spartan, а точнее — на подсемействе Spartan 3E, как одной из последних на сегодняшний день разработок Xilinx. Spartan 3E состоит из пяти микросхем: XC3S100E, XC3S250E, XC3S500E, XC3S1200E и XC3S1600E. Их названия различаются числами, которые являются количеством вентилей, из которых они состоят, разделенным на 1000. Соответственно, микросхемы различаются количеством CLB, IOB, умножителей и блоков BRAM. В данном методическом пособии мы будем работать с микросхемой XC3S100E и отладочной платой для неё DL-BASYS фирмы DIGILENT. 18 Далее представлены основные сведения об отладочной плате DL-BASYS. Отличительные особенности: установленная ПЛИС Spartan 3 в корпусе TQFP100 (100 тыс. вентилей); установленный резонатор 50МГц, сокет для дополнительного резонатора; XCF02 Platform Flash ROM; интерфейс JTAG; PS/2 порт; четыре разъема расширения по шесть выводов; пользовательские светодиоды (8шт.), кнопки (4шт.), переключатели (8шт.); четырехразрядный семисегментный индикатор; VGA интерфейс. Комплектация: отладочная плата DL-BASYS; загрузочный кабель; источник питания. Области применения: системы управления учебные цели системы общего назначения. 19 2.5. Краткое описание средств проектирования ПЛИС. Для проектирование ПЛИС, фирма Xilinx предоставляет разработчку среду Xilinx ISE, одной из разновидностью которой является свободно распространяемая Xilinx ISE WebPACK. Последнюю версию этой программы всегда можно скачать с сайта xilinx.com, пройдя несложную процедуру регистрации. Конечно, бесплатный WebPACK несколько ограничен в возможностях, но ограничения эти касаются использования только самых больших кристаллов семейства Virtex, использование которых разработчиком повлечет денежные затраты, вполне сравнимые со стоимостью среды проектирования, обладающей полным функционалом. Итак, что же представляет собой среда Xilinx ISE? Xilinx ISE — это так называемая система сквозного проектирования. Что такое «система проектирования», читателю должно быть понятно, но что означает слово «сквозного»? Это означает, что данная система позволяет разработчику организовать весь процесс, от постановки задачи, до готовой реализации, используя только одну эту систему. Процесс этот состоит из следующих этапов: 1. Описание функционала ПЛИС (это можно сделать как при помощи как графического редактора, так и при помощи VHDL; также можно сочетать эти два приёма) 2. Отладка созданной в предыдущем пункте схемы или кода. 3. Разводка кристалла (данный процесс выполняется автоматически встроенным в систему САПР; задача разработчика сводится к установке некоторых параметров, направляющих деятельность САПР в нужное русло). 4. Создание конфигурационного файла и загрузка его непосредственно в кристалл. 20 Этап разводки кристалла, вообще говоря представляет из себя довольно сложную задачу, причем, как для человека, так и для персонального компьютера. А дело вот в чем: количество Slice даже в простых кристаллах может быть около 1000 (960 для младшего из семейства Spartan 3E), а в сложных — в несколько раз больше. Вариантов расположения этих блоков по кристаллу огромное множество, а точнее n!, где n — количество блоков. Попробуйте взять факториал хотя бы от 100, и представьте, что на расчет одного варианта расположения уходит хотя бы милисекунда, и получите, что для расчета всех возможных вариантов уйдет столько времени, что к концу вычислений наверняка уже погаснет Солнце. Поэтому САПР может просчитать лишь относительно небольшое число вариантов расстановки, и задача человека — помочь ей вести расчеты в нужном направлении. Этап разводки кристалла состоит из четырёх подэтапов: 1. Synthesize. Здесь происходит проверка исходного кода или схемы и его «компиляция». 2. Translate. Здесь происходит генерация списка соединений проекта. 3. Map. Здесь происходит распределение элементов проекта по блокам кристалла (Slice, CLB, IOB, BRAM, умножители) без привязки к конкретным блокам кристалла. 4. Place and Route (PAR). Здесь происходит привязка к конкретным блокам кристалла, т.е. размещение блоков на конкретные места в кристалле (Place) и трассировка соединений между блоками (Route). Несмотря на то, что в среде Xilinx ISE имеются встроенные средства отладки, в данном методическом пособии мы будем использовать для этой задачи среду ModelSim SE, т.к. она более удобная. ModelSim SE представляет собой систему цифрового моделирования, т.е. позволяет строить и анализировать временные диаграммы с целью отладки проекта. Кроме того, после установки эта среда интегрируется в Xilinx ISE. 21 3. Практическая часть. 3.1. Знакомство со средой Xilinx ISE WebPACK. Создание проекта. Итак, первым делом запускаем среду, в результате чего появляется окно, как на рисунке 3.1.1 (все скриншоты в данном методическом пособии сделаны для версий WebPACK 9.1 и ModelSim SE 6.0). Рис. 3.1.1. Внутри окна содержатся: сверху – главное меню и различные иконки, слева – окно с исходными файлами проекта (“Sources”) и окно управления проектом (“Processes”). Основную же часть окна занимает рабочая область (на рисунке она пустая, т.к. не открыт проект, с которым нужно работать). Выбираем пункт меню File->New Project…, появляется диалоговое окно, в котором вводим имя проекта, его размещение на жестком диске и тип исходника верхнего уровня (как уже говорилось выше, проект можно выполнять в виде схемы в графическом редакторе или в виде кода на VHDL), см. рисунок 3.1.2. 22 Рис. 3.1.2. Нажимаем кнопку Next. В следующем диалоговом окне выбираем семейство Spartan3E, кристалл XC3S100E, тип корпуса VQ100, быстродействие кристалла -4, симулятор ModelSim-SE VHDL и язык VHDL, см. рисунок 3.1.3. Рис. 3.1.3. 23 Нажимаем кнопку Next. В следующем диалоговом окне предлагается сразу добавить в проект новые файлы-исходники. Учтём эту возможность, но не воспользуемся ею и снова нажмём кнопку Next. В следующем диалоговом окне предлагается добавить в проект уже существующие исходники. Поступим аналогично предыдущей ситуации. И наконец, в заключительном окне будет представлена краткая информация о создаваемом проекте, см. рисунок 3.1.4. Рис. 3.1.4. Нажимаем кнопку Finish. Проект создан. Переходим непосредственно к проектированию. 24 3.2. Реализация проекта при помощи графического редактора схем. Итак, прежде всего, добавим в наш проект файл-схему (далее будем называть его и подобные ему файлы, включая vhdl-файлы словом «исходник»). Сделать это можно либо через главное меню (Project->New Source…), либо щелкнув правой кнопкой в окне Sources и в появившемся контекстном меню выбрав пункт New Source…, после чего появится диалоговое окно с полями выбора типа и ввода названия файла, см. рисунок 3.2.1. Рис. 3.2.1. После того как необходимые действия выполнены, нажимаем кнопку Next. В следующем диалоговом окне будут представлены краткие сведения о добавляемом в проект файле, убедившись в правильности которых необходимо нажать кнопку Finish. После выполнения этих действий автоматически в рабочей области появятся вкладки Design Summary и наш main_scheme.sch. Вручную открыть любой исходник можно из вкладки Sources окна Sources. 25 Теперь приступим к рисованию схемы. Для примера, реализуем схему, которая будет по нажатию кнопки инкрементировать счетчик, значение с которого после дешифрации попадёт на семисегментный индикатор. Для простоты возьмем диапазон цифр от 0 до 3, т.к. дело осложняется тем, что в среде нет семисегментного дешифратора и его придется сделать вручную. Выберем вкладку main_scheme.sch в рабочей зоне, а в окне Sources – вкладку Symbols. В окне Sources можно выбирать всевозможные логические символы и устанавливать их в схему, которая теперь находится в рабочей зоне. Соединять выводы элементов можно различными способами, самый удобный из них – нажатием комбинации клавиш ctrl+W. Искомая схема представлена на рисунке 3.2.2. Рис. 3.2.2. Схема работает следующим образом. Сигнал с кнопки представляет собой довольно продолжительный сигнал относительно тактовой частоты, поэтому, чтобы по каждому нажатию осуществлялся переход счетчика только на одно значение вперед, применена схема преобразования фронта в импульс, состоящая из D-триггера (на рисунке – FD) и элемента «И» с одним инвертированным входом. Сигнал с кнопки задерживается триггером на один 26 такт и инвертируется, после чего логически умножается на исходный сигнал. Другие два D-триггера служат для защиты синхронизации сигнала и защиты от метастабильности. Полученный короткий импульс поступает на разрешающий сигнал двухразрядного двоичного счетчика (на рисунке – CB2CE). Выходы счетчика дешифрируются в значения сегментов семисегментного индикатора простыми логическими элементами (на рисунке находятся справа, расположены в столбиком). Сигнал сброса счетчика подключен к земле, т.к. счетчик сбрасывается автоматически, когда достигает значения больше 3. Сигнал переполнения счетчика (TC) и выходной сигнал разрешения работы счетчика для каскадирования (CEO) не используются. Схема имеет два входных вывода, Clock и Button, и 7 выходных, по количеству сегментов индикатора – Segment_A, Segment_B, Segment_C, Segment_D, Segment_E, Segment_F и Segment_G. 27 3.3. Реализация проекта при помощи языка VHDL. В этом разделе мы реализуем проект, аналогичный по функциональности проекту предыдущего раздела, но на этот раз – с применением VHDL. Итак, создадим второй проект, который назовем VHDL_Project. Добавим в него исходник VHDL-кода, для этого в уже известном нам диалоговом окне укажем параметры, как на рисунке 3.3.1. Рис. 3.3.1. Нажимаем кнопку Next. Появляется диалоговое окно, в котором нужно указать входы и выходы создаваемого блока. Укажем их в соответствии со схемой из предыдущего раздела, см. рисунок 3.3.2. 28 Рис. 3.3.2. После этого нажимаем Next и убедившись в следующем диалоговом окне с краткой информацией о создаваемом файле, что всё верно, нажимаем Finish. В результате будет создан код, представленный на листинге 3.3.1. Листинг 3.3.1. ----------------------------------------------------------------------------------- Company: -- Engineer: --- Create Date: 14:55:56 03/06/2009 -- Design Name: -- Module Name: main_vhdl - Behavioral -- Project Name: -- Target Devices: -- Tool versions: -- Description: --- Dependencies: --- Revision: -- Revision 0.01 - File Created -- Additional Comments: ----------------------------------------------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; 29 ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity main_vhdl is Port ( Clock : in STD_LOGIC; Button : in STD_LOGIC; Segment_A : out STD_LOGIC; Segment_B : out STD_LOGIC; Segment_C : out STD_LOGIC; Segment_D : out STD_LOGIC; Segment_E : out STD_LOGIC; Segment_F : out STD_LOGIC; Segment_G : out STD_LOGIC); end main_vhdl; architecture Behavioral of main_vhdl is begin end Behavioral; Чтобы реализовать нужную нам функциональность, нужно ввести код, представленный на листинге 3.3.2. В коде даны комментарии, проводящие параллель между описанием схемы из предыдущего раздела и непосредственно самим кодом. Листинг 3.3.2. ----------------------------------------------------------------------------------- Company: -- Engineer: --- Create Date: 14:55:56 03/06/2009 -- Design Name: -- Module Name: main_vhdl - Behavioral -- Project Name: -- Target Devices: -- Tool versions: -- Description: --- Dependencies: --- Revision: -- Revision 0.01 - File Created -- Additional Comments: ----------------------------------------------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating 30 ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity main_vhdl is Port ( Clock : in STD_LOGIC; Button : in STD_LOGIC; Segment_A : out STD_LOGIC; Segment_B : out STD_LOGIC; Segment_C : out STD_LOGIC; Segment_D : out STD_LOGIC; Segment_E : out STD_LOGIC; Segment_F : out STD_LOGIC; Segment_G : out STD_LOGIC); end main_vhdl; architecture Behavioral of main_vhdl is signal Button_Sync: std_logic; signal Button_Sync_NoMS: std_logic; signal Button_Sync_NoMS_Delayed: std_logic; signal Button_Pulse: std_logic; signal Count: integer range 0 to 4; signal Reset: std_logic; signal Count_Bus: std_logic_vector (1 downto 0); begin -- Три D-триггера: для синхронизации, защиты от метастабильности и задержки сигнала process (Clock) begin if rising_edge(Clock) then -- условие переднего фронта сигнала Clock Button_Sync <= Button; Button_Sync_NoMS <= Button_Sync; Button_Sync_NoMS_Delayed <= Button_Sync_NoMS; end if; end process; -- Преобразование фронта в короткий импульс Button_Pulse <= Button_Sync_NoMS and not Button_Sync_NoMS_Delayed; -- Двоичный счетчик process (Clock) begin if (Reset = '1') then -- асинхронный сброс счетчика, здесь его нужно сделать вручную Count <= 0; elsif rising_edge(Clock) then if (Button_Pulse = '1') then -- сигнал разрешения работы счетчика Count <= Count + 1; end if; end if; end process; -- Компаратор (проверяет, досчитал ли счетчик до 3 и выдает сигнал сброса) process (Clock) begin if rising_edge(Clock) then if (Count > 3) then Reset <= '1'; else Reset <= '0'; end if; 31 end if; end process; -- преобразовываем переменную Count в двухразрядную шину Count_Bus <= CONV_STD_LOGIC_VECTOR(Count, 2); -- Семисегментный дешифратор, здесь он выполняется простым case process (Clock) begin case (Count_Bus) is when "00" => Segment_A <= '1'; Segment_B <= '1'; Segment_C <= '1'; Segment_D <= '1'; Segment_E <= '1'; Segment_F <= '1'; Segment_G <= '0'; when "01" => Segment_A <= '0'; Segment_B <= '1'; Segment_C <= '1'; Segment_D <= '0'; Segment_E <= '0'; Segment_F <= '0'; Segment_G <= '0'; when "10" => Segment_A <= '1'; Segment_B <= '1'; Segment_C <= '0'; Segment_D <= '1'; Segment_E <= '1'; Segment_F <= '0'; Segment_G <= '1'; when "11" => Segment_A <= '1'; Segment_B <= '1'; Segment_C <= '1'; Segment_D <= '1'; Segment_E <= '0'; Segment_F <= '0'; Segment_G <= '1'; when others => end case; end process; end Behavioral; 32 3.4. Моделирование проекта в среде ModelSim SE. Теперь перейдем к процессу отладки наших проектов. Для этого нужно создать так называемый испытательный стенд, или TestBench, суть которого в том, что он будет подавать на блок, который мы создали путём использования графического редактора или кода VHDL, определенные сигналы, позволяющие проверить его работу посредством анализа получающихся временных диаграмм. Итак, вызываем пункт меню New Source…, в появившемся диалоговом окне указываем параметры, как на рисунке 3.4.1. Рис. 3.4.1. Нажимаем кнопку Next, в следующем диалоговом окне будет предложено выбрать файл, к которому следует прикрепить наш испытательный стенд. Выбираем файл main_vhdl и нажимаем Next. В следующем диалоговом окне содержится краткая информация о создаваемом файле, убедившись в правильности которой нажимаем кнопку Finish. 33 В результате получаем файл main_vhdl_tb.vhd, с исходным кодом, который представлен в листинге 3.4.1. Листинг 3.4.1. --------------------------------------------------------------------------------- Company: -- Engineer: --- Create Date: 15:43:38 03/06/2009 -- Design Name: main_vhdl -- Module Name: D:/TestProjects/VHDL_Project/main_vhdl_tb.vhd -- Project Name: VHDL_Project -- Target Device: -- Tool versions: -- Description: --- VHDL Test Bench Created by ISE for module: main_vhdl --- Dependencies: --- Revision: -- Revision 0.01 - File Created -- Additional Comments: --- Notes: -- This testbench has been automatically generated using types std_logic and -- std_logic_vector for the ports of the unit under test. Xilinx recommends -- that these types always be used for the top-level I/O of a design in order -- to guarantee that the testbench will bind correctly to the post-implementation -- simulation model. -------------------------------------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; ENTITY main_vhdl_tb_vhd IS END main_vhdl_tb_vhd; ARCHITECTURE behavior OF main_vhdl_tb_vhd IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT main_vhdl PORT( Clock : IN std_logic; Button : IN std_logic; Segment_A : OUT std_logic; Segment_B : OUT std_logic; Segment_C : OUT std_logic; Segment_D : OUT std_logic; Segment_E : OUT std_logic; Segment_F : OUT std_logic; Segment_G : OUT std_logic ); END COMPONENT; --Inputs SIGNAL Clock : std_logic := '0'; 34 SIGNAL Button : std_logic := '0'; --Outputs SIGNAL Segment_A : SIGNAL Segment_B : SIGNAL Segment_C : SIGNAL Segment_D : SIGNAL Segment_E : SIGNAL Segment_F : SIGNAL Segment_G : std_logic; std_logic; std_logic; std_logic; std_logic; std_logic; std_logic; BEGIN -- Instantiate the Unit Under Test (UUT) uut: main_vhdl PORT MAP( Clock => Clock, Button => Button, Segment_A => Segment_A, Segment_B => Segment_B, Segment_C => Segment_C, Segment_D => Segment_D, Segment_E => Segment_E, Segment_F => Segment_F, Segment_G => Segment_G ); tb : PROCESS BEGIN -- Wait 100 ns for global reset to finish wait for 100 ns; -- Place stimulus here wait; -- will wait forever END PROCESS; END; Дописываем код в соответствии с листингом 3.4.2. Листинг 3.4.2. … <предыдущую часть оставляем без изменений> BEGIN -- Instantiate the Unit Under Test (UUT) uut: main_vhdl PORT MAP( Clock => Clock, Button => Button, Segment_A => Segment_A, Segment_B => Segment_B, Segment_C => Segment_C, Segment_D => Segment_D, Segment_E => Segment_E, Segment_F => Segment_F, Segment_G => Segment_G ); 35 Clock <= not Clock after 10 ns; tb : PROCESS BEGIN -- Wait 100 ns for global reset to finish wait for 100 ns; Button <= '0'; wait for 500 ns; Button <= '1'; wait for 300 ns; Button <= '0'; wait for 700 ns; Button <= '1'; wait for 150 ns; Button <= '0'; wait for 400 ns; Button <= '1'; wait for 200 ns; Button <= '0'; wait for 600 ns; Button <= '1'; wait for 250 ns; wait; -- will wait forever END PROCESS; END; Как можно сообразить, здесь мы задаем частоту изменения сигнала Clock (50МГц в данном случае), а также имитируем нажатия на кнопку, различные по длительности. Теперь в окне Sources в поле Sources for: выбираем значение Behavorial Simulation. Выбираем наш испытательный стенд в окне Sources и в окне Procsesses дважды щелкаем по надписи Simulate Behavorial Model. В результате этих действий загрузится среда ModelSim. Установите в поле ввода время 10000 ns, нажмите кнопку (Restart), в появившемся диалоговом окне нажмите Restart, затем нажмите кнопку (Run). В результате Вы получите временную диаграмму, как на рисунке 3.4.2, из которой ясно видно работу нашего проекта. 36 Рис. 3.4.2. Аналогичные действия следует провести и с проектом, реализованном в графическом редакторе, чтобы убедиться в совпадении его временной диаграммы с временной диаграммой проекта на VHDL. 37 3.5. Конфигурирование кристалла и проверка его работы на отладочном комплекте. 38 3.6. Задание для самостоятельного выполнения. После освоения основ проектирования, предлагается разделить группу на две подгруппы для самостоятельного выполнения следующих заданий: Подгруппа 1: Двоичный суммирующий счетчик с синхронным сбросом и возможностью загрузки значения. Активный сигнал сброса – “0”. Модуль счета выбирается согласно варианту студента по списку + 5. Подгруппа 2: Двоичный вычитающий счетчик с синхронным сбросом и возможностью загрузки значения. Активный сигнал сброса – “1”. Модуль счета выбирается согласно варианту студента по списку + 2. Задания выполняются на языке VHDL. Конечным результатом выполнения задания должна быть временная диаграмма, построенная в среде ModelSim SE, демонстрирующая работу счетчика. 39 4. Список литературы. 1. Уилкинсон Б. Основы проектирования цифровых схем. Издательский дом «Вильямс». 2004. 2. Угрюмов Е.П. Цифровая схемотехника. 2-е издание. Санкт-Петербург. БХВ-Петербург. 2004. 3. http://parallel.ru/FPGA/FPGA_history.html 4. http://www.compitech.ru/html.cgi/arhiv/00_04/stat_52.htm 5. Бибило П.Н. Основы языка VHDL/- СОЛОН-P. 2002 6. http://www.masters.donntu.edu.ua/2002/fvti/rytov/lib/evita/21.htm 40