|
Исследование методов синтеза устройств управления на программируемых пользователем вентильных матрицах
История развития программируемых логических интегральных схем (ПЛИС) начинается с появления в начале 70-х годов программируемых постоянных запоминающих устройств (ППЗУ - Programmable Read Only Memory - PROM). Первое время PROM использовались исключительно для хранения данных, позже их стали применять для реализации логических функций. Однако необходимость приведения логических функций к совершенной дизъюнктивной нормальной форме (СДНФ) не позволяло применять PROM для реализации функций больших размеров. Специально для реализации систем булевых функций (СБФ) большого числа переменных были разработаны и с 1971 года стали выпускаться промышленностью программируемые логические матрицы (ПЛМ - ProgrammableLogicArrays - PLA), которые получили широкое распространение в качестве универсальной элементной базы цифровых устройств. Совершенствование архитектуры PLA привело к появлению программируемых матриц логики (ПМЛ - ProgrammableArray Logics - PALs), которые до настоящего времени определяют архитектуру PLD. Дальнейшее совершенствование технологии производства интегральных схем в начале 90-ч годов привело к возможности реализации на одном кристалле нескольких PAL, объединяемых программируемыми соединениями. Подобные архитектуры получили название сложных ПЛУ (ComplexPLD - CPLD) Параллельно с PLD развивались интересующие нас архитектуры вентильных матриц (GateArray - GA) и матриц логических ячеек (LogicCellArray - LCA), в русскоязычной литературе получившие название базовых матричных кристаллов (БМК). Первые вентильные матрицы были полузаказными, то есть программировались во время изготовления, что сильно сдерживало их широкое использование. Однако в 1985 году фирма Xilinx выпустила программируемую пользователем вентильную матрицу (Field ProgrammableGateArray - FPGA). Это дало сильный толчок к широкому распространению вентильных матриц и конкуренции их с PLD. Место FPGA в современной классификации средств программируемой логики изображено на рисунке 1.1 В настоящее время число вентилей на кристалле достигло 2 миллиардов, число выводов - 2000, а быстродействие находится на уровне 0,75 наносекунд. Рисунок 1.1 Классификация ПЛИС
Типичная FPGA - это микросхема, которая состоит из массива абсолютно одинаковых ячеек с программируемыми соединениями. Пользователь может запрограммировать функции, которые будут выполняться каждой из логических ячеек, и соединения между ними. Такие PGA часто называются FPGA, поскольку они являются программируемыми в условиях эксплуатации. Основу структуры FPGA составляет матрица логических элементов (LogicElement - LE), между которыми располагается поле межсоединений: совокупность горизонтальных и вертикальных каналов. В FPGA линии каналов состоят из отдельных сегментов, соединяемых программируемыми матрицами переключений. По краям кристалла FPGA расположены блоки ввода-вывода (Input/OutputBlocks - IOBs). Логические блоки состоят из одного или нескольких относительно простых логических элементов, в основе которых лежит таблица перекодировки (ТП, Look-Up Table - LUT), программируемый мультиплексор, D-триггер, а также цепи управления. Таких простых элементов может быть достаточно много, например, у современных ПЛИС ёмкостью до 1 млн. вентилей число логических элементов достигает нескольких десятков тысяч. За счёт такого большого числа логических элементов они содержат значительное число триггеров, а также некоторые семейства ПЛИС имеют встроенные реконфигурируемые модули памяти (РМП, Embedded Array Block - EAB). Это делает FPGA весьма удобным средством реализации алгоритмов цифровой обработки сигналов, основными операциями в которых являются перемножение, умножение на константу, суммирование и задержка сигнала. В соответствии с внутренней
структурой все FPGA
разделяются на два основных класса:
Рассмотрим подробнее каждую из этих структур.
В FPGA данного типа логические элементы расположены в виде строк, между которыми расположены каналы трассировки. Типичная структура таких FPGA изображена на рисунке 1.2. Каналы трассировки состоят из непрерывных металлических проводников различной длины. Минимальная длина проводника соответствует двум соседним логическим элементам, максимальная - ширине кристалла. Логические элементы подсоединяются к линиям соседних каналов трассировки с помощью вертикальных проводников. Вертикальные проводники подсоединяются к линиям горизонтальных каналов с помощью программируемых перемычек. В качестве программируемых элементов в строковых FPGA используются одноразово пережигаемые перемычки (antifuse). Представители этого класса FPGA программируются один раз и не требуют дополнительной аппаратуры. Преимущество строковых FPGA в том, что их программируемые элементы значительно меньше, чем в матричных FPGA, поэтому они имеют лучшие характеристики при трассировке межсоединений. Размеры логических элементов строковых FPGA обычно меньше, чем матричных. Поэтому устройство, реализованное на строковой FPGA, требует больше конфигурируемых логических блоков и межсоединений, чем это необходимо в случае матричной FPGA. Но поскольку логические элементы и межсоединения строковых FPGA работают значительно быстрее, это не отражается на производительности проектируемого устройства. Типичными представителями такого класса FPGAявляются устройства фирмы Actel (ACT1, ACT2, ACT3)
В FPGA данного класса логические элементы организованы в виде матрицы. Между строками и столбцами матрицы логических элементов расположены каналы трассировки. Ячейки ввода-вывода располагаются по краям кристалла. Логические элементы выполняют функциональную обработку сигналов, ячейки ввода вывода обслуживают внешние выводы, каналы трассировки служат для подвода сигналов к логическим элементам от внешних выводов, обмена сигналов между элементами и передачи сформированных сигналов к внешним выводам. Каналы трассировки состоят из сегментированных проводников. В местах пересечения горизонтальных и вертикальных каналов трассировки расположены программируемые матрицы переключений, которые позволяют передавать сигналы между сегментами в любом направлении. В матричных FPGA в качестве настраиваемых элементов используются ячейки статического ОЗУ (SRAM). Межсоединения, основанные на SRAM, много больше, чем antifuse (применяемые в строковых FPGA). Поэтому матричные FPGA имеют меньшие возможности по трассировке межсоединений, чем строчные. Однако матричные FPGA, основанные на элементах памяти, допускают реконфигурацию, а строковые программируются только один раз. Кроме того, сегментированные межсоединения матричных FPGA могут образовывать сложные разветвленные цепи, благодаря чему каждому соединению может быть найдено несколько альтернативных путей; при этом эффективно используются металлизированные линии сегментов. Типичными представителями матричных FPGA являются устройства XC 3000, XC 4000 и новая серия Virtex фирмы Xilinx. Именно на основе этих серий FPGA ниже будут более детально рассмотрена внутренняя структура и принципы работы FPGA Рисунок 1.2 Обобщенная структура строковых FPGA Рисунок 1.3 Обобщенная структура матричных FPGA
Важным фактором, влияющим на использование программируемых устройств, являются задержки, их предсказуемость и общее быстродействие (производительность) проекта. В матричных FPGA определить задержку сигналов можно только после решения задач размещения и трассировки. Задержка сигнала будет зависеть от настройки логического элемента, количества сегментов в цепи и числа матриц переключения на пути сигнала. Кроме того, на величину задержки влияет коэффициент ветвления цепи, поскольку при этом изменяются емкостные характеристики цепей. Задача еще более усложняется, если сигнал зависит от других сигналов, сформированных в этом же устройстве. Часто в случае внесения даже небольших изменений в проект приходится заново решать задачи размещения и трассировки, что, безусловно, влияет на значение задержек сигналов. Поэтому для матричных FPGA задержки сигналов заранее предсказать нельзя, их можно вычислить только после решения задач размещения и трассировки. В строковых FPGA задержки также непредсказуемы и могут быть определены только после выполнения размещения и трассировки. Однако, поскольку сигналы не проходят через матрицы переключений и известны длины линий каналов трассировки, задача определения временных параметров значительно упрощается. По сравнению с CPLD, в сложных многокаскадных проектах преимущество будут иметь FPGA, поскольку для передачи сигналов между соседними логическими элементами в матричных FPGA используются быстрые прямые связи, а в строковых FPGA - короткие линии каналов межсоединений. Обычно считается, что в среднем
FPGA работают медленнее, чем
CPLD, однако в отдельных
случаях реализация проекта на FPGA
может быть более эффективна. В реальных устройствах на быстродействие также
влияет технология изготовления, плотность упаковки вентилей на кристалле, тип
корпуса и другие параметры.
Данный раздел содержит информацию
о внутреннем строении FPGA на примере микросхем серии Xilinx 3000 FPGA's, которые выпускаются ведущим производителем микросхем в
настоящее - фирмой Xilinx.
Микросхемы этой серии содержат до 8 млн. эквивалентных вентилей.
Микросхемы этой серии (например, Xilinx 3020) представляют собой внутренний массив, который состоит из 64 конфигурируемых логических блока (ConfiguredLogicBlocks - CLBs) и 64 интерфейсных блоков ввода-вывода, которые располагаются по периметру микросхемы. Соединения между ними программируются с помощью сохранения данных во внутренних конфигурационных ячейках памяти (рисунок 1.4) Каждый конфигурируемый логический блок состоит из комбинационных схемы двух D-триггеров. Блок может быть запрограммирован на выполнение разнообразных логических функций. Конфигурируемые ячейки памяти программируются после подачи питания в FPGA, реализованные логические функции и межсоединения сохраняются до отключения напряжения. Во время конфигурации ячеек памяти (рисунок 1.5) выбираются по очереди. Когда сигнал WRITE поступает на передающий транзистор, значение DATA сохраняется в ячейке. Каждая точка соединения в матрице имеет связанную ячейку памяти. Данные, сохраненные в ней, определяют наличие соединения Рисунок 1.4 Структурная схема матричной FPGA серии Xilinx 3000 Рисунок 1.5 Конфигурирующая ячейка памяти
На рисунке 1.6 представлен конфигурируемый логический блок. Он имеет пять логических входов (А, В, С, D, Е), вход данных (DI), синхровход (К), вход разрешения синхронизации (ЕС), непосредственный сброс (RD) и два выхода (X и Y). Трапециевид-ные блоки на схеме обозначают мультиплексоры, которые могут быть запрограмми-рованы на выбор одного из входов. Например, значения на выход X могут поступать либо с верхнего триггера QX, либо с выхода F блока "комбинационная функция" (Combinatorial Function). Таким же образом значения на выход Y могут поступать с нижнего триггера QY или с выхода О. Знак [м] обозначает конфигурирующую ячейку памяти, данные в ячейке определяют вход используемого мультиплексора. Блок комбинационных функций состоит из ячеек RAM и может быть запрограммирован на реал изацию любой функции пяти или двух- четырех переменных. Функции хранятся в виде таблицы истинности. Таким образом, число вентилей, необходимое для их реализации, не имеет значения. Рисунок 1.6 Конфигурируемый логический блок Xilinx серии 3000 Рисунок 1.7 Режимы комбинационных схем На рисунке 1.7 представлено три возможных операционных режима для функционального блока. Каждый трапециевидный блок обозначает мультиплексор, который программируется на выбор одного из входов. FG-режим генерирует две функции четырех переменных. Одна переменная А должна быть общей для обеих функций. Следующие две переменные могут быть выбраны из В, С, QX и QY. Последней переменной может быть D или Е. Например, можно реализовать функции F = АВ' + QXЕ и G = А'С + QYD. Если QX и QY не используются, то две функции четырех переменных должны иметь три общих переменных: А, В и С. Четвертая может быть D или Е. В режиме F генерируется одна функция пяти переменных: A. D, E и две перемен-ные выбираются из В, С, QX и QY. Можно реализовать функцию по возрастанию сложности от простого AND вентиля: F = G = ABCDE до функции четности: F = G = A Å B Å C Å D Å E имеющей 16 термов, если разложить ее на дизъюнкцию конъюнкций. Режим FGM использует мультиплексор с контрольным входом Е для выбора одной из двух функций четырех переменных. Каждая функция использует входы A, D плюс два из четырех: В, С, QX, QY. В режиме FGM можно реализовать некоторые функции шести и семи переменных. Например, в этом режиме можно реализовать следующую функцию семи переменных: F=G=E(AB'+QXD) + Е'(А'С+QYD). Вход D каждого триггера может быть запрограммирован на получение данных с F, G или DI входа. Оба имеют общий вход синхронизации. Мультиплексор MLJX связан со входом CLOCK (К) и может быть запрограммирован на выбор К или К'. Поэтому имеется возможность выбора синхронизации D-триггера передним или задним фрон-том синхросигнала. Синхроимпульс может быть или всегда разрешен, или управляться входом Enable Clock (EC). Мультиплексор MUX, связывающий D вход каждого триггера, используется для отключения синхронизации. Если ЕС = 0, сигнал с Q выхода поступает обратно на D вход. Таким образом, Q+ = Q, и триггер никогда не изменит состояния, даже при наличии синхроимпульса. Если ЕС = 1, D вход соединяется с F, G и DIN, а состояние триггера изменяется по соответствующему фронту синхросигнала. Соединение D-триггера и мультиплексора эквивалентно D-триггеру со входом разре-шения синхронизации ЕС, как показано на рисунке 1.7. Поскольку Q может изменять значение при ЕС = 1, следующее характеристическое уравнение описывает поведение триггера: Q+ = ЕС D+ECQ. Использование триггеров такого типа устраняет необходимость в стробировании синхровхода с помощью управляющего сигнала. Поскольку синхроимпульс может непосредственно поступать на вход каждого триггера, легко получить правильные операции синхронизации. Триггеры имеют вход асинхронного сброса RD. Каждый из них сбрасывается в 0, если сброс не запрещен при поступлении 1 на линию. Общий сброс очищает триггеры во всех ячейках микросхемы. Рисунок 1.8 Триггер с разрешением синхронизации
На рисунке 1.9 представлен реконфигурируемый вход-выходной блок (input-outputblock- 1OB). Контакт I/O связан с одной из ножек корпуса микросхемы, которая может быть использована в качестве входа или выхода. Чтобы использовать ячейку как тристабильный выход (З-state), управляющий сигнал должен быть установлен в OUTPUTBUFFER. Чтобы использовать ячейку как вход, тристабильный буфер должен быть отключен. Триггеры позволяют хранить входные и выходные значения в блоке ЮВ. При необходимости их можно заблокировать для передачи сигнала непосредственно между внешним контактом, и внутренней матрицей логических элементов. Две линии синхронизации СК1 и СК2 могут быть запрограммированы на соединение с любым из двух триггеров. Входной триггер может быть запрограммирован на работу как переключаемый по фронту D-триггер или как явный триггер-защелка. Даже если I/O контакт не используется, I/O триггеры тем не менее могут быть задействованы для хранения данных. Выходной OUT сигнал, идущий из логического массива, вначале проходит через вентиль исключающего ИЛИ, где он инвертируется или нет, в зависимости оттого, как запрограммирован OUT-INVERT бит. При необходимости выходной OUT сигнал может быть сохранен в триггере. Программирование OUTPUT-SELECT бита определяет: будет ли на выход подан непосредственно сигнал OUT или он пройдет вначале через триггер. Если З-STATE сигнал равен 1 и бит 3-STATEINVERT равен О (З-STATE сигнал равен 0 и З-STATEINVERT бит - 1), выходной буфер имеет на выходе значение высокого импеданса. Иначе выходной сигнал поступает на I/O контакт. Когда I/O контакт используется как вход, выходной буфер должен быть в состоянии высокого импеданса. Внешний сигнал, идущий с контакта I/O, проходит через буфер и затем поступает на D-триггер. Буфер входа подает сигнал DIRECTIN в логический массив. Иначе входной сигнал может быть вначале сохранен в D-триггере, из которого как сигнал REGISTEREDIN будет передан в логический массив Каждый IOВ имеет входные-выходные опции, которые выбираются конфигурацией ячеек памяти. Входная пороговая величина может быть запрограммирована на уровень сигналов TTL или CMOS. Бит SLEWRATE управляет скоростью изменения выходного сигнала. Когда последний управляет внешними устройствами, для уменьшения наведенных шумов, которые могут появляться при быстром изменении выходного сигнала, желательно снизить скорости нарастания выходного напряжения. Когда бит PASSIVEPULL-UP установлен, нагрузочный резистор соединяется с I/Opad. Внутренний нагрузочный регистр может быть использован для устранения плавающих входов Рисунок 1.9 Входной-выходной блок Xilinx серии 3000
Программируемыесоединениямеждуконфигурируемымилогическимиблокамиивходными-выходнымиблокамибываюттрехвидов: универсальные (general-purpose interconnect), прямыемежсоединения (direct interconnect), длинныелинии (long line). Рисунок 1.10 иллюстрирует систему универсальных межсоединений. Сигналы между CLB или CLB и ЮВ направляются по горизонтальным и вертикальным межсоединительным линиям и маршрутизируются с помощью матриц-переключателей. Прямые соединения выполняются между соседними блоками CLB, как показано на рисунке 1.11. Длинные линии обеспечивают соединения CLB, расположенные далеко друг от друга. Все межсоединения программируются сохранением бита во внутренних конфигурирующих ячейках памяти в LCA. Длинные линии обеспечивают высокий коэффициент разветвления по выходу, низкое распределение расфазировки импульсов (low-skew distribution), которые должны проходить относительно большие расстояния. На рисунке 1.12 показаны четыре вертикальные длинные линии между двумя соседними рядами CLB. Две из них могут быть использованы для синхронизации. Также изображены две горизонтальные линии. Длинные линии охватывают полностью длину или ширину межсоединительной области логических блоков Каждая логическая ячейка имеет два соседних тристабильных буфера, которые соединяются с горизонтальными длинными линиями. Проектировщики могут использовать эти длинные линии и буферы для реализации тристабильных шин. На рисунке 1.13,а показано, как тристабильные буферы применяются для мультиплексирования сигналов в горизонтальной длинной линии. Эти буферы имеют выходной разрешающий сигнал низкого уровня. Таким образом, когда А = 0, сигнал DA поступает на линию. Weak keeper circuit в конце линии запоминает последнее значение, поступившее на линию, поэтому оно никогда не теряется. Внимание должно быть направлено на устранение конфликтов шины, которые могут произойти, если значения 0 и 1 поступят на шину в одно и то же время. Тристабильные буферы могут быть также использованы для реализации функции монтажного И, как показано на рисунке 1.13,6. Когда один или больше входов D имеют 0, линия получает значение 0. Если все входы D имеют значение 1, все выходы буферов находятся в состоянии высокого импеданса и нагрузочный резистор выталкивает линию в состояние 1. Можно реализовать кварцевый генератор, используя внутренний быстродействующий инвертирующий буфер вместе с внешним кристаллом Y1, резистором и конденсаторами, как показано на рисунке 8.15. Внешние компоненты соединяются с двумя контактами ЮВ, а выходной генератор-с альтернативным буфером синхронизации (alternate clock buffer). Он управляет горизонтальными длинными линиями, которые в свою очередь могут управлять вертикальными длинными линиями и входами синхронизации К (clock) логических блоков. Если используется внешняя синхронизация, ее выход соединяется с общим буфером синхронизации (global clock buffer). Он управляет всей схемой, что обеспечивается высоким коэффициентом разветвления по выходу, синхронизирующим общий вход для всех ЮВ и логических блоков. Если требуется симметричная синхронизация, к выходу генератора может быть подключен триггер, делящий частоту на 2. Рассмотренная выше микросхема ХС3020 FPGA имеет 64 CLB (8 х 8), 64 пользовательских входа-выхода, 256 триггеров (128 в CLB и 128 в ЮВ), 16 горизонтальных длинных линий и 14779 конфигурирующих битов данных. Другие микросхемы семейства ХСЗООО имеют до 484 CLB (22 х 22), 176 пользовательских I/O, 1320 триггеров, 44 горизонтальных длинных линий и 94984 конфигурирующих битов данных. Рисунок 1.10. Универсальные межсоединения (general-purpose interconnect) Рисунок 1.10. Универсальные межсоединения (general-purpose interconnect) Рисунок 1.11 Прямые межсоединения между соседними блоками CLB Рисунок 1.12 Вертикальные и горизонтальные длинные линии Рисунок 1.13 Использование тристабильных буферов: а - реализация мультиплексора, б -реализация монтажного И Рисунок 1.14 Кварцевый генератор
XilinxFPGA серии 4000 сходны с устройствами серии 3000, но имеют большее число входов и выходов и многие другие дополнительные свойства.
Рисунок 1.15 представ-ляет упрощенную схему конфигурируемого логического блока ХС4000, имеющего девять логических входов (F1, F2, F3, F4, G1, G2, G3, G4 и Н1). Таким образом, можно сгенерировать две независимые функции четырех переменных: lG (G1,G2,G3,G4) и F(Fl,F2,F3,F4). В отличие от устройств серии 3000, где входы генерируемых функций 4 перемен-ных частично перекрываются, CLB серии 4000 может также генерировать функцию Н, которая определяется F, G и Н1. Установив F1 = G И, F2 = G2, F3 = G3 и F4 = G4, можно сгенерировать любую функцию 5 переменных по формуле Н = F(F1,F2,F3,F4) Н1' + G(F1,F2,F3,F4) H1. Также возможно реализовывать некоторые функции 6, 7, 8 и 9 переменных. CLB имеет два D-триггера с входом разрешения синхронизации ЕС, четыре выхода - два от триггеров и два от реализованных функций комбинационной логики. В отличие от CLB серии 3000, CLB серии 4000 не имеет внутренней обратной связи. Таким образом, когда она необходима, значения с выходов триггеров должны быть направлены назад к логическим входам с помощью внешней маршрутизации. CLB имеет S/R (set/reset - установка/сброс) вход, который может быть независимо сконфигурирован для соединения с SD или RD входом каждого триггера. Значит, один триггер может быть установлен в 1, а другой в 0 одним и тем же S/R сигналом. Синхронизирующий вход каждого триггера позволяет выполнять конфигурацию на срабатывание по переднему или заднему фронту К (clock) входа. Вход ЕС каждого триггера разрешает его переключение по сигналу со входа ЕС логического блока. D-вход каждого триггера может быть соединен с линиями DIN, F, G или Н. Логическая ячейка устройств серии 4000 имеет специальную схему переноса (dedicated carry logic), как показано на рисунке 1.16. Каждая ячейка содержит логичес-кую схему переноса 2-х битов, F и G функциональные преобразователи могут быть использованы для генерирования битов суммы. Таким образом, каждая ячейка может быть запрограммирована для одновременного вычисления суммы и переноса двух битов полного сумматора. Линии переноса между ячейками - фиксированные, а не программируемые, что обеспечивает быструю передачу переноса. Переносы могут передаваться вверх или вниз между ячейками и поступать на вход программируемого мультиплексора (метка М1 на рисунке 1.16), который выбирает направление передачи сигнала. Мультиплексоры М2, МЗ и М4 позволяют некоторым входам F и G генерато-ров функций получать значения с переносов вместо сигналов с обычных входов ячеек F и G. В добавок к сумматору схема переноса может быть запрограммирована на реализацию устройств вычитания, сложения/вычитания, увеличения/уменьшения (incrementer/decrementer), двоичного дополнения (2's complementer) и счетчиков. Если ячейка программируется на реализацию двух битов полного сумматора, логическая схема эквивалентна представленной на рисунке 1.17. В такой конфигурации А >i , и Bi поступают на входы F1 и F2. Сигналы A i +1 и В i +1 подаются на входы G2 и G4. Вход C i и выход C i +2 соединяются с линиями передачи фиксированного переноса. Рисунок 1.18 представляет соединения для 4-битного сумматора. Два средних CLB выполняют сложение 4 битов. Если перенос в последний значащий разряд необходим, С0 должен быть направлен через дополнительную ячейку, поскольку прямое соединение фиксиро-ванной линии переноса не разрешено. Если необходим признак переполнения и внешний перенос из самого младшего разряда, требуется четвертая ячейка. В этом примере С3 вместо С4 направляется в четвертую ячейку и входы в ячейки A 3 и В3 дублируются. С4 вычисляется с помощью F функционального генератора, что обеспечивает внешний перенос из ячейки. С4 также заново вычисляется, используя логическую схему переноса в ячейку. Переполнение вычисляется функциональным G-генератором как V =Сз+С4. Этот 4-битный сумматор может быть легко расширен до 8- ил и 16-битного добавлением 2 или 6 дополнительных ячеек. Такие модули сумматора есть в библиотеке Xilinx. >Когда ячейка программируется для реализации двух битов устройства сложения/ вычитания, сигнал Add/~sub должен быть соединен с F3 и G3. Когда Add/~sub=Q, входы В i , и lang=EN-US Bi +1 инвертируются внутри логической схемы переноса, а функциональные генерато-ры, таким образом, выполняют вычитание прибавлением двоичного дополнения. style='color:black'>Функциональные генераторы F и G могут быть запрограммированы для работы в качестве RAM памяти (рисунок 1.19). Каждая ячейка может быть сконфигурирована как 16-словная 2-битная RAM. Входы F и G функциональных генераторов (Fl = GI, F2 = G2, F3 = G3, и F4 = G4) обеспечивают 4-битную адресацию, С1 используется как линия разрешения записи WE, C2 и СЗ служат для ввода данных D1 и DO. Содержимое адресуемых ячеек памяти доступно по выходам F и G функциональных генераторов. Кроме того, ячейка может быть сконфигурирована как 32x1-битовая RAM. Тогда С2 используется как пятый адресный бит, а СЗ - как вход данных. Конфигурирующие биты WRITE G и WRITE F должны быть установлены на разрешение записи в F и G функциональные генераторы соответственно. Рисунок 1.15. Упрощенная блок-схема для CLB серии 4000 Рисунок 1.16. Дополнительная логическая схема переноса ХС4000 Рисунок 1.17. Схема концептуального представления 2 битов полного сумматора Рисунок 1.18. Соединения для 4-битового сумматора Рисунок 1.19. CLB как читающая/записывающая ячейка памяти
На рисунке 1.20 показан входной-выходной (I/O) блок серии 4000, который похож по возможностям на входной-выходной блок серии 3000. Метки М на диаграмме представляют конфигурирующие биты памяти. Как и ЮВ 3000, ЮВ 4000 может быть запрограммирован инвертировать входы, выходы, тристабильный контрольный буфер и вход синхронизации. В дополнение общая S/R (GLOBAL S/R) линия может быть ориентирована на установку или сброс каждого триггера. Входной-выходной блок 4000 имеет два pull-up и pull-down согласующих резистора, связанных с входным-выходным контактом (I/O pad). Входной-выходной блок 4000 также содержит допол-нительную логику boundary scan. ХС4003 FPGA имеет 100 CLB (10x10), около 3000 вентилей, 80 пользовательских I/O, 360 триггеров (200 в CLB и 160 в 1ОВ), 45636 конфигурирующих битов данных. Другие представители ХС4000 семейства имеют до 2304 CLB (48 х48), 384 пользова-тельских I/O, 5376 триггеров и более одного миллиона конфигурирующих битов данных. Рисунок 1.20. Входной-выходной блок серии Xilinx 4000 FPGA's
Дальнейшее развитие FPGAXC4000X привело к созданию новой серии микросхем Virtex, а также упрощенной версии Virtex- Spartan. Серия VirtexFPGA предоставляет высокоинтегрированные и многофункциональные микросхемы. Мощность и гибкость этих микросхем делает их альтернативой масочным матрицам логики. Серия Virtex насчитывает 9 типов микросхем, некоторые из них приведены в таблице 1.1. Их основные характеристики: высокая степень интеграции; плотность от 50К до 1Мб системных вентилей; частотные возможности до 200МГц; совместимость с 66МГц PCI. Микросхемы серии Virtex-11 содержат до 8 Мб системных вентилей. Общая схема чипа Virtex FPGA изображена на рисунке 1.21. Микросхема состоит из двух основных элементов: конфигурируемых логических блоков (configurable logic block - CLB) и входных/выходных блоков (input/output block-1OB).CLB обеспечивают функциональные элементы для конструирования устройств. IOB предоставляют интерфейс между контактами микросхемы и CLB. Связь между CLB выполняется с помощью общих матриц маршрутизации (general routing matrix - GRM). GRM представляют собой матрицы переключателей, расположенных на пересечениях вертикальных и горизонтальных каналов трассировки. Каждый CLB в свою очередь вмонтирован в VersaBlockT, позволяющий выполнять местную маршрутизацию для связи CLB с GRM. VersaRingT - входной-выходной интерфейс предоставляет дополнительные ресурсы для маршрутизации по периметру микросхемы, которые улучшают возможности маршрутизации входов/выходов и облегчают связь с внешними контактами. Virtex-архитектура включает также следующие элементы, доступ к которым можно осуществлять через матрицы маршрутизации (GRM): - дополнительные блоки памяти по 4096 битов в каждом; - синхронизацию DLL для компенсации задержки распространения синхросигна-ла и управления синхронизацией или длительностью синхроимпульса; - тристабильные буферы, связанные с каждым CLB, которые
управляют выделенными сегментируемыми горизонтальными ресурсами трассировки
Рисунок 1.21. Общая схема Virtex-архитектуры
Конфигурируемый логический блок (CLB) Основным элементом в Virtex CLB является логическая ячейка (logic cell - LC). Она состоит из генератора функции 4-х переменных, схемы переноса (carry logic) и логического элемента. Выход генератора функций может быть связан с любым из выходов CLB или входом D-триггера. Каждый Virtex CLB содержит четыре LC, организованных в виде двух одинаковых секторов, как это показано на рисунке 1.22. На рисунке 1.23 представлена более детальная схема одного сектора. В дополнение к четырем основным LC Virtex CLB содержит логику, объединя-ющую функциональные генераторы для реализации функций пяти или шести перемен-ных. Поэтому, когда оценивают число вентилей, предоставляемых данным устрой-ством, каждый CLB оценивается как 4,5 LC. Look-Up Table Virtex функциональный генератор организован как 4-входовой (look-up table) LUT. В дополнение к генерации функции каждый LUT может функционировать как 16х 1 -бит синхронное ОЗУ (RAM). Более того, два LUT из одного сектора могут быть объеди-нены для создания 16x2 ил и 32х 1 -бит синхронных ОЗУ, или 16х 1-бит двухканальных синхронных ОЗУ. Virtex LUT может также работать как 16-битовый сдвиговый регистр, который идеален для высокоскоростных или пакетных данных. Триггеры в секторе CLB могут быть сконфигурированы как D-триггеры с синхронизацией по фронту или по уровню. Значения на вход триггера подаются с выхода функционального генератора или непосредственно со входов сектора, в обход функциональных генераторов. Каждый триггер, в дополнение к сигналам синхронизации и разрешения синхрони-зации, имеет синхронный сброс SR и установку BY. SR устанавливает элемент памяти в начальное состояние, как оно описано для него в конфигурации. BY устанавливает элемент памяти в противоположное состояние. Допускается настройка этих сигналов для работы в асинхронном режиме. Все управляющие сигналы могут быть независимо проинвертированы и являют-ся общими для обоих триггеров сектора. Рисунок 1.22. Конфигурируемый логический блок микросхемы Virtex Рисунок 1.23. Подробная схема сектора Virtex FPGA Дополнительная логика (Additional Logic) Мультиплексор F5 в каждом секторе объединяет выходы функциональных генерато-ров. Таким образом, реализуется одна функция 5 переменных, мультиплексор 4 на 1 или некоторые частные случаи функций до 9 переменных. Аналогичным образом мультиплексор F6 объединяет выходы всех четырех функциональных генераторов в CLB, выбирая один из выходов мультиплексоров F5. Это позволяет реализовать любую функцию 6 переменных, мультиплексор 8 на 1 или некоторые функции до 19 переменных. Каждый CLB имеет четыре непосредственных сквозных пути, по одному на LC. Они предоставляют дополнительные входные линии для данных или маршрутизации дополнительной логики, позволяя не расходовать ресурсы схемы. Арифметическая логика (Arithmetic Logic) Специальная схема переноса выполняет быстрое вычисление переноса, давая воз-можность реализовывать высокоскоростные схемы переноса. Virtex CLB поддержи-вает две различные цепи переноса, по одной на каждый сектор. Высота цепи -два бита на CLB. Арифметическая логика содержит один элемент XOR, позволяя реализовывать один бит полного сумматора на схеме. К тому же выделенный И элемент позволяет осуществить эффективную реализацию умножения. Схема переноса может использо-ваться и для каскадирования функциональных генераторов при реализации функций большого числа переменных. Каждый Virtex CLB содержит два тристабильных драйвера (BUFTs), которые могут управлять шинами в микросхеме. Каждый Virtex BUFT имеет независимый 3-стабильный управляющий контакт и независимый входной контакт. Блоки ОЗУ (Block RAM) Virtex FPGA содержат несколько больших выделенных блоков ОЗУ BlockSelectRAM+, в дополнение к SeIectRAM+ LUTRAM, рассредоточенных по CLB и формирующих теневую ОЗУ структуру, реализованную в конфигурируемых логических блоках. Блоки памяти BlockSelectRAM-f организованы в столбцы. Все устройства Virtex содержат два таких столбца, распространяющихся на всю высоту чипа, по одному вдоль каждой из вертикальных сторон. Каждый блок памяти имеет высоту, равную 4 CLB. Соответственно Virtex-устройство высотой в 64 CLB содержит 16 блоков памяти в столбце и 32 блока памяти в микросхеме. В таблице 1.2 представлено количество блоков памяти Block SelectRAM+ в некоторых микросхемах Virtex. Каждая ячейка Block belectKAM+, как показано на рисунке 1.24, является полностью синхронизированным двухпортовым 4096-битным блоком ОЗУ с независи-мым управлением сигналами для каждого порта. Ширина данных может быть незави-симо сконфигурирована для каждого порта, что обеспечивается встроенным преобра-зователем ширины. В таблице 1.3 описана взаимосвязь между шириной шины и остальными параметрами Block SelectRAM-K Блоки ОЗУ в Virtex включают также дополнительнуютрассировку,обеспечивающую эффективный интерфейс между бло-ками CLB и другими модулями ОЗУ. Таблица 1.2. Количество Block SeIectRAM+ в микросхемах серии Virtex Таблица 1.3. Зависимость параметров ОЗУ BlockSelectRAM+ от ширины шины Рисунок 1.24. Двухпортовый Block SelectRam+ Входной-выходной блок На рисунке 1.25 изображен входной-выходной блок (lOB)Virtex, Он предоставляет возможность конфигурации входов и выходов, поддерживает большое количество входных и выходных стандартов (таблица 1.4). Эти высокоскоростные входы и выходы поддерживают PCI интерфейс до 66 МГц. Три элемента памяти в ЮВ могут функционировать как триггеры с синхрониза-цией по фронту или по уровню. Каждый блок имеет сигнал синхронизации, общий для всех триггеров, и независимые сигналы разрешения синхронизации для каждого триггера. Вдобавок к управляющим сигналам CLK и СЕ триггеры имеют общий сигнал сброса/установки SR. Для каждого триггера этот сигнал может быть незави-симо сконфигурирован как синхронный или асинхронный сброс или установка. Вход-ные и выходные буферы и все ЮВ управляющие сигналы имеют независимый контроль за направлением. Все контакты имеют защиту микросхемы от повреждений из-за скачков напря-жения. Предлагается две формы для защиты от высокого напряжения. Одна предос-тавляет согласование с 5В (compliance), другая нет. В первом случае подобно туннельному пробою выполняется соединение с землей, когда напряжение становится выше, приблизительно 6,5В. Когда нет необходимости в согласовании с 5В, к выходу подключается обыкновенный ограничительный диод, поддерживающий напряжение vccg- Тип защиты может быть выбран независимо для каждого контакта. Каждый контакт имеет повышающий (pull-up) и понижающий (pull-down) резис-торы и weak-keeper схему. До программирования микросхемы все ее выходы считаются не конфигурированными и принудительно устанавливаются в состояние высокого импеданса. Понижающие резисторы и weak-keeper схемы не активны, но на входы может быть подан высокий уровень напряжения. До конфигурации активизация повышающего резистора контакта управляется глобальной логикой. Если они не активны, напряжение на контактах плавает. Поэтому следует использовать внешние повышающие или понижающие резисторы для контак-тов, требующих наличия на них до конфигурации определенного логического уровня напряжения. Все Virtex ЮВ поддерживают ШЕЕ 1149.1 стандарт граничного сканиро-вания (boundary scan). Если блок Virtex IOB используется как входной, сигнал с внешнего контакта через буфер IBUF передается прямо или через триггер на внутреннюю логику. Необязательный программируемый элемент задержки на входе D-триггера позволяет компенсировать задержку на линии между контактами (pad-to-pad hold time). Величина задержки согласуется с задержкой внутренней синхронизации FPGA, и в этом случае считается, что упомянутый интервал (pad-to-pad hold time) равен 0. Выходной путь содержит тристабильный буфер, который управляет посту плени-ем сигнала на выход. Сигнал может подаваться непосредственно на внешний контакт или через ЮВ выходной триггер. Тристабильный выходной буфер может управляться непосредственно из внутренней логики микросхемы или через триггер, который позволяет синхронизировать сигнал запрещения и разрешения. Каждый контакт может быть запрограммирован на работу в режиме любого из поддерживаемых электрических стандартов. Некоторые из них используют опреде-ляемое пользователем пороговое напряжение vref. Допускается конфигурация входов необязательными повышающими и понижающими резисторами 50-150 Юм. Каждый выход может поставлять до 24 тА и принимать до 48 тА. Управление мощностью и скоростью нарастания выходного напряжения позволяет уменьшить переходные процессы на шине. Во многих стандартах выходное напряжение высокого уровня зависит от подаваемого внешне напряжения Vcco. Необязательная схема weak-keeper, подсоединяемая к каждому выходу, следит и мягко управляет максимальным (High) или минимальным (Low) напряжением выходного сигнала, сравнивая его со входным. Если контакт подсоединен к многоис-точниковому сигналу, схема будет сохранять последнее значение сигнала, когда выходы всех его источников находятся в состоянии высокого импеданса. Это позво-ляет избежать возникновения дребезга на шине. Схема weak-keeper используется во входных буферах (ЮВ), для наблюдения за входным уровнем и обеспечения соответствующего напряжения vref, если этого требует стандарт сигнала. Рисунок 1.25. Входной-выходной блок Virtex FPGA Таблица 1.4. Поддерживаемые входные-выходные стандарты Банки входов/выходов (I/O Bank) Как было показано выше, некоторые из входных-выходных стандартов требуют исполь-зования напряжений VCC Oи VREF , которые подаются извне и подсоединяются к контак-там, обслуживающим группы ЮВ блоков. Такие группы называются банками. Суще-ствуют ограничения на комбинацию входных-выходных стандартов в каждом банке. Восемь входных-выходных банков являются результатом деления каждой сто-роны FPGA на два банка, как это показано на рисунке 1.26. Каждый их них имеет несколько V CCO style=' контактов. Все они должны быть подключены к одному и тому же источнику напряжения, которое определяется используемым выходным стандартом. Внутри одного банка разные стандарты могут быть использованы, если они имеют одинаковое Vcco напряжение. В таблице 1.5 описана возможность совмеще-ния различных стандартов. GTL и GTL+ могут применяться с любым из трех напряжений, поскольку их выходы с открытым стоком (open-drain outputs) не зависят от V CCO. Некоторые входные стандарты требуют определенного пользователем порогово-го напряжения VREF. В этом случае отдельные пользовательские входные/выходные контакты автоматически конфигурируются как входы для V REF напряжения. Для этого может быть использован, приблизительно каждый шестой контакт в банке. Все V REF контакты имеют внутреннее соединение в пределах одного банка, следовательно, в одном банке может быть использовано только одно V REF напряжение. Программируемые матрицы трассировки (PRM) Задержка самого длинного пути определяет скорость любого проекта. Оптимизация, которая минимизирует задержки длинных путей, позволит создать устройство с лучшими системными возможностями. Она также сократит время компиляции проек-та, поскольку архитектура становится дружелюбной к программному обеспечению, что соответственно уменьшит и общую продолжительность циклов проектирования. Местная трассировка (Local Routing)
VersaBlock обеспечивает локальные ресурсы
трассировки и, как показано на рисунке 1.27, предоставляет следующие типы
связи: Таблица 1.5. Совместимость выходных стандартов Рисунок 1.26. Virtex I/O банки Рисунок 1.27. Virtex локальная маршрутизация Трассировка общего назначения (General Purpose Routing) Большинство Virtex-сигналов направляются через трассировку общего назначения, соответственно, большинство соединений ассоциируются с этим уровнем иерархии трассировки. Ресурсы трассировки общего назначения располагаются в горизонтальных и вертикальных каналах, связанных со строками и столбцами CLB. Эти ресурсы перечислены ниже: - Соседней к каждому CLB является матрица общей трассировки (General Routing Matrix (GRM)). GRM -это матрица переключателей, соединяющая горизонталь-ные и вертикальные ресурсы и предоставляющая для CLB доступ к ресурсам трассировки общего назначения. - 24 линии трассировки единичной длины передают сигналы к соседним GRM в каждом из 4 направлений. - 72 буферизированных Hex lines передают сигналы в каждом из 4 направлений. Организованные в шахматном порядке Hex lines могут управляться только в их конечных точках. Сигналы с них доступны либо в конечных, либо в средних точках (три блока от источника). Каждая третья линия - двунаправленная, остальные - однонаправленные. 12 длинных линий (Longlines) являются буферизированными, двунапрвленными, передающими сигнал через устройство быстро и эффективно. Они имеют длину всего чипа, в высоту или ширину. Входная-выходная трассировка (I/O Routing) Устройства Virtex имеют дополнительные ресурсы трассировки на его границах, формирующие интерфейс между матрицей CLB и ЮВ блоками. Такая дополнительная трассировка, называемая VersaRing, облегчает pin-свопинг и pin-соединение, так что измененный проект может быть адаптирован к существующей РСВ (Printed Circuit Board - печатная плата) планировке. Это позволяет сократить время выхода на рынок, поскольку РСВ и другие компоненты системы могут уже выпускаться, в то время как проект находится еще на стадии разработки. Выделенная трассировка (Dedicated Routing) Некоторые виды сигналов требуют выделенных ресурсов трассировки. В Virtex-архитектуре такие ресурсы введены для двух классов сигналов: Горизонтальные ресурсы трассировки представляют собой внутренние тристабильные шины. Каждому ряду CLB предоставляются четыре шинные линии, позволяя создавать сложные шины, как это показано на рисунке 1.28. Две дополнительные линии на CLB передают сигналы переноса вертикально между соседними CLB. Глобальная трассировка (Global Routing) Глобальные ресурсы трассировки распределяют синхросигналы и другие сигналы, имеющие высокое разветвление по устройству. Устройства Virtex включают два типа глобальных ресурсов трассировки: первичные и вторичные. К первичным глобальным ресурсам маршрутизации относят четыре выделен-ные глобальные линии с выделенными входными контактами, которые спроектирова-ны для распространения с минимальной расфазировкой высокоразветвленных синхро-сигналов. Каждая линия глобальной синхронизации может управлять всеми синхрон-ходами блоков CLB, ЮВ и RAM. Первичные глобальные линии управляются только глобальными буферами. Существует четыре глобальных буфера, по одному на каждую линию. Вторичные глобальные ресурсы трассировки состоят из 24 магистральных линий (backbone lines), 12 вдоль верха микросхемы и 12 внизу.От этих линий могут быть распространены до 12 отдельных сигналов в столбце, через 12 длинных линий. Вторичные ресурсы являются более гибкими, чем первичные, и их использование не ограничивается только сигналами синхронизации. Распространение синхросигналов (Clock Distribution) Virtex обеспечивает высокоскоростное, с низкой задержкой, распространение синхро-сигналов через первичные глобальные ресурсы маршрутизации, описанные выше. Типичное распространение сигналов представлено на рисунке 1.29. Имеются 4 глобальных буфера: два вверху и два внизу, по центру устройства. Они управляют 4 первичными глобальными линиями, которые, в свою очередь, управляют любым синхровходом. Существуют четыре выделенных синхроконтакта, по одному на каждый глобальный буфер. Вход глобального буфера выбирается только через эти контакты или через сигналы трассировки общего назначения. Рисунок 1.28. Подключение BUFT к выделенным горизонтальным линиям Рисунок 1.29. Схема распределения глобальной синхронизации
В настоящее время создано большое количество CAD-систем для проектирования устройств на FPGA. Обычно такое проектирование включает шаги: Разработка модели устройства с применением языков описания аппаратуры, таких как VHDL и Verilog. Схему устройства можно также нарисовать, используя соответствующий схемный редактор. Преобразование HDL-кода или схемы с помощью программ синтеза в netlist - описание блоков проекта и соединений между ними. Чаще всего такое описание записывается в формате EDIF. программ имплементации для выполнения операции mapped. При этом вентили, образующие проект, разбиваются на группы, которые подходят определенным CLB. Размещение вентилей CLB и создание соединений между ними выполняется на этапе place & route. имплементации программа извлекает состояния ячеек памяти из матрицы маршрутизации (routing matrice) и генерирует битовый файл - bilstream, где единицы и нули определяют открытые или закрытые переключатели. загружается в чип FPGA. Когда конечная система построена, конфигурация битов для программирования FPGA обычно сохраняется в EPROM и автоматически загружается в FPGA при включении питания. EPROM соединяется с FPGA, как показано на рисунке 1.30. Сразу после подачи напряжения данные в FPGA сбрасываются. Затем считывается конфи-гурация из EPROM. Последовательность адресов на входы EPROM поступают с FPGA. Данные из EPROM сохраняются во внутренних конфигурируемых ячейках памяти FPGA. Хотя некоторые логические функции 6 переменных могут быть реализованы на одной или двух логических ячейках, в общем случае функция 6 переменных требует три ячейки. Общий метод реализации любой такой функции сначала использует ее разложение, как показано ниже: Z(a,b,c,d,e,f) = а lang=EN-US 'Z(0,b, с lang=EN-US ,d,e,f} + aZ(l,b, с lang=EN-US ,d,e,f} = a'Z0+aZ1. Это пример теоремы разложения Шеннона. Можно проверить, что уравнение верно, установив а в 0, а затем в 1. Если оно верно для а=0 и для а= 1, то оно всегда верно. Уравнение приводит к схеме, в которой задействованы две ячейки для реализации Z0 и Z1 (рисунок 1.31, а). Половина третьей ячейки используется для реализации функции трех переменных, Z = a'Z0 + aZ1. Например, рассмотрим следующую функцию:
a'b'c'def + b'cde'f Установка а=0 дает Z0 = 0 bcd'ef+ 1 b'c'def + b'cde'f= b'c'def + b'cde'f, а установке a = 1 соответствует Z1= 1'bcd'ef + 0b'c'def+ b'cde'f = bcd'ef+ b'cde'f. Поскольку Z0 и Z1 являются функциями 5 переменных, каждая из них может быть реализована на одной ячейке. Рисунок 1.30. Подключение EPROM для LCA инициализации Рисунок 1.31. Реализация функций 6 и 7 переменных: а - общая функция 6 переменных, б - общая функция 7 переменных
При создании проектов для PGA следует помнить, что каждая логическая ячейка содержит два триггера. Это значит, что минимизация количества используемых триггеров не имеет значения. Вместо этого нужно попытаться сократить общее число используемых логических ячеек и межсоединений между ними. Для того чтобы проектировать более быстрые схемы, следует уменьшить число ячеек, необходимых для реализации каждого уравнения. Применение унарного распределения состояний часто помогает этому. Унарное распределение использует один триггер для каждого состояния, таким образом, автомат с N состояниями требует N триггеров. Только один триггер устанав-ливается в 1 для каждого состояния. Например, система с четырьмя состояниями (ТО, T1, T2 и ТЗ) может использовать четыре триггера (QO, Q1, Q2 и Q3) со следующим распределением состояний: Остальные 12 комбинаций не применяются. Можно записать уравнения состояний и выходов, рассматривая граф состояний. Рассмотрим неполный граф, представленный на рисунке 1.32. Уравнение следующего состояния для триггера Q3 может быть записано так: Q3+ = X1 QO Q1' Q2' Q3' + X2 QO' Q1 Q2' Q3' + X3 QO' Q1' Q2 Q3' + X4 QO' Q1' Q2' Q3. Тем не менее, то, что QO = 1, означает Q1=Q2=Q3=0, терм Q1'Q2'Q3' - избыточ-ный, его можно исключить. Подобным образом все переменные автомата с отрица-нием могут быть исключены из других термов. Таким образом, уравнение следующе-го состояния сократится до Q3+ = X1 QO + X2 Q1 + X3 Q2 + X4 Q3. Теперь каждый терм содержит точно одну переменную состояния. Точно так же каждый терм уравнения выходов содержит точно одну переменную состояния. Другой способ решения проблемы установки без изменения унарного кодирова-ния есть включение дополнительного терма в уравнение для триггера, который должен быть равен 1 для начального состояния. Если система сбрасывается в состояние 0000 после включения питания, можно добавить терм Q0' Q1 Q2' Q3' в уравнение для Q0+. Затем, после первого импульса синхронизации, состояние изменится с 0000 на 1000 (ТО), которое является корректным начальным состоянием автомата. В общем случае для любого способа кодирования следует попытаться найти решение проекта, требующее меньшего числа ячеек. Иначе, если скорость операций важна, нужно выбрать вариант проекта, чья логическая схема быстрее. При исполь-зовании прямого присвоения требуется более одного уравнения следующего состоя-ния. В общем случае уравнения состояний и выходов, взятые вместе, содержат меньше переменных. Для реализации уравнения с меньшим числом переменных обычно используется небольшое число логических ячеек. Уравнения с пятью и меньшим числом переменных требуют всего одну логическую ячейку. Рисунок 1.32. Неполный граф состояний
Список литературы
1. Соловьев В.В. Проектирование цифровых схем на основе ПЛИС. - М.:Горячая линия-Телеком, 2001. 636с. ил. |
|||||||||||
© solos, январь - апрель 2005 |