Я хочу, чтобы данный туториал подходил для самых маленьких детей. (с) stalker29218 Поэтому, необходимо дать некоторую базу по цифровой электронике. Есть разные технологии цифровых микросхем, во многом они похожи. Я не буду описывать, как работает базовая логика. Практически одинаково во всех технологий, а кому интересно я рекомендую очень хороший справочник, который называется "Популярные цифровые микросхемы", за авторством В.Л.Шило из серии МРБ выпуск 1111.
Так вот, логику мы опустим. Мы будем рассматривать ключевой момент - хранение состояния, в народе триггеры. Построение триггера сильно зависит от технологии. Что такое триггер? Это элемент с двумя устойчивыми состоянии. В простейшем случае это кольцо из двух инверторов:
Однако, практической пользы от него нет - им не возможно управлять, не вызвав короткое замыкание одного из выходов. Поэтому, обычно используются многовходовые элементы с инверсией (без разницы И или ИЛИ):
Это простейший RS триггер. Он уже может быть полезен, например, для подавления дребезга ответственной кнопки. Однако, у него есть недостаток: если активировать оба входа управления возникает неопределенное состояние. Поэтому, к нему добавляется простейшая схема управления:
И триггер обретает сигнал строба. Это позволяет ввести нечувствительность RS триггера к изменению на входах R или S во время изменения сигнала. Замечу, что это не тактируемый тригер, а обычная прозрачная защелка, поэтому, во время активного сигнала управления неопределенное состояние все еще может возникнуть. Поэтому, сигналы R и S объединяют через инвертор и получается D триггер:
Это схема классической прозрачной защелки. Иногда прозрачность защелки вредна: если выходной сигнал завязан на вход, то схема при активации защелки станет осцеллировать, вызывая непредсказуемые состояния логики. Для развязывания выхода от входа нужен тактируемый триггер. Обычно, это цепочка ведущий-ведомый из двух защелок:
Теперь, ведомый получит сигнал от мастера тогда, когда мастер станет нечувствительным ко входу. И наоборот, ведомый будет не чувствителен к изменению состояния мастера когда мастер управляется извне. Это классический тактируемый триггер (Т триггер). Если объединить R и S входы через инвертор, как это сделано у D триггера, то получаем тактируемый D триггер. Если нам нужен тактируемый D триггер с ассинхронными входами сброса и установки, то нужно вводить дополнительные ведущие RS триггеры:
Вот так сложно дается базовый элемент синхронной схемы на технологии ТТЛ. Вот этот же примитив в схемном вводе Quartus'а:
Очень расточительно расходуется пространство кристалла: по нескольку транзисторов на каждый субэлемент примитива. Но все изменилось, когда пришла КМОП технология. Среди разных достоинств этой технологии есть одна ключевая, которую имеют только полевые транзисторы: большое сопротивление затвора и большой диапазон изменения сопротивления канала (от практически короткого замыкания, до практически полной изоляции). Поэтому, в некотором смысле каждый транзистор КМОП структуры можно рассматривать как управляемый тумблер:
Всего два разнополярных транзистора позволяют организовать Z состояние выхода (электронный ключ):
Причем, при определенных условиях питающего напряжения, это позволяет коммутировать даже аналоговый сигнал. Яркий пример - К561КП2 в Вега МП122 или К176КТ3. Даный ключ (на картинке блок "КК") позволяет очень просто построить триггер:
Действительно, нет ничего проще, чем просто разорвать кольцо из инверторов. Это схема полноценного тактируемого D триггера с асинхронными входами сброса или установки. Если они не нужны, то вся схема упрощается до 2х инверторов и 2 ключей на каждый RS триггер (всего 8 транзисторов на RS триггер). Сравните с ТТЛ вариантом.
Есть еще кое-что в технологии КМОП, что наследуется из особенностей полевых транзисторов. Ключевой недостаток полевого транзистора вытекает из его достоинства: из-за большого сопротивления затвора паразитная емкость последнего начинает иметь значение. Таким образом, если вдруг затвор полевого транзистора повиснет в воздухе, то его затвор будет сохранять заряд некоторое время, что будет эквивалентно подаче управляющего сигнала. Это очень похоже на ячейку DRAM. И этим же воспользовались инженеры, которые проектировали микросхемы КМОП на заре электроники.
Действительно, если допустить, что паразитной емкости затвора достаточно для хранения заряда в пределах периода тактовой частоты и недостаточно, чтобы исказить (затянуть фронт) форму сигнала при переключении, то транзистор с оторванным затвором можно рассматривать как элементарную ячейку DRAM, которую периодически следует регенерировать. А если еще допустить то, что нам не требуется, чтобы ток тек в обоих направлениях, то управляющий ключ упрощается до одного транзистора. Таким образом, мы получаем триггер-защелку всего из трех транзисторов (транзистор разрывающий затвор ключевого транзистора, сам ключевой транзистор и транзистор-нагрузка, если не требуется ОС):
Причем, добавление всего одного транзистора позволяет организовать мультиплексор: на картинке выше сигнал OAM8 подключает один источник к триггеру, а сигнал OAP к другому. Конечно, такие схемы не будут статичными и будут иметь нижний предел рабочей частоты (верхний предел есть у всех). Но простота реализации и стабильная тактовая частота оправдывают это.
- - - Добавлено - - -
Я думаю, многое теперь понятно. Теперь ключевая особенность ПЛИС. Особенность ПЛИС в том, что они могут менять эквивалентную логическую функцию в зависимости от "программы" пользователя. Это не копия дискретной схемы в прямом смысле, это функциональная симуляция. Конечно, можно создать ASIC на основе описания схемы посредством xHDL языка (для чего этот язык и создавался) и это будет либо транзисторная копия, либо функциональная, созданная из примитивов библиотеки CELL. Но это может быть применено только на стадии выпуска готовой схемы. На стадии разработки требуется многократное реконфигурирование. И только из-за этого приходиться мириться с некоторыми ограничениями любой ПЛИС, от CPLD до FPGA. Более подробно как сделаны ASICи на основе CELL можно подсмотреть у Org'а на PSXDev.
Реконфигурируемые ПЛИС выдвигают определенные требования к дизайну (так называется проект функциональной схемы, описываемой на языках xHDL либо схемным вводом). Особенность ПЛИСин в том, что они состояит из базовых блоков, в состав каждого входит один (или несколько) триггеров, логическая программируемая матрица (в старых CPLD и FGPA) или LUT (Look-Up Table в новых CPLD и FPGA) и несколько вспомогательных схем, вроде схемы выбора тактирования триггера или ускоренного переноса для организации сумматоров и счетчиков. LUT позволяет "запаковать" целый кусок логической комбинаторной схемы по построенной синтезатором таблице истинности, что положительно сказывается на "вместимости" микросхемы ПЛИС. Вот так выглядит ячейка у CPLD семейства MAX3000:
А вот так у FPGA семейства Cyclone IV:
Все ячейки связаны между собой магистралями. Это PIA (Programmable Interconnect Array) у CPLD и просто LAB Interconnect у FPGA. И вся соль в том, что именно эти магистрали и дают ту самую гибкость при построении эквивалентной схемы. Однако именно они и являются самым главным недостатком.
Во-первых, ее емкость конечна. У CPLD PIA общий для всех LAB, поэтому, даже простую схему, требующую большое количество соединений в CPLD бывает не уместить. У FPGA магистрали разбиты на категории: локальная, глобальная горизонтальная и глобальная вертикальная. Это дало больше свободы, однако ограничения всегда есть.
Во-вторых, "растекание" схемы по ячейкам. И если на входы одной ячейки подаются сигналы от других, находящихся на разном расстоянии, то сигналы могут прийти с разной задержкой. Она не большая, однако быстродействия ПЛИС хватает, чтобы среагировать на нее. И все это зависит как от синтезатора и компилятора, так и (наверное в большей степени) от фиттера (программа, которая планирует в какую ячейку какую часть схемы положить). Конечно, в каких-то пределах можно влиять на процесс, например можно указать границы района, куда следует расположить отдельный модуль (и фиттер поругается, если ему не хватит ресурсов этого региона) или допустить локальное дублирование кусков схем, если позволяет место.
В любом случае, при программировании ПЛИС следует стремиться строго к синхронному дизайну, и тогда многие грабли просто не появятся. По моим личным наблюдениям, комбинаторику следует синхронизировать не далее 2го уровня (вложенность логических функций), стараться не допускать появления защелок (latch'ей, Quartus сам предупредит об этом в логе). Почаще заглядывать в RTL Viewer, чтобы проконтролировать, правильно ли понял вас синтезатор. В общем-то, это все и так описано в соответствующих книгах.
- - - Добавлено - - -
И на последок напомню, что исходная схема у нас построена на прозрачных защелках, а в ПЛИС следует использовать синхронный дизайн. Наличие защелок в дизайне ПЛИС (кроме специально созданных) может привести к метастабильности, а это в свою очередь приведет к неработоспособности схемы. Конечно, после просмотра RTL можно прогнать модель в симуляторе (это либо встроенный в Q9.x.x для ограниченного набора ПЛИС, либо ModelSim для любого другого Quartus'а и семейства ПЛИС), но проще всего это проверка в железе. Тем более, там можно использовать логический анализатор (как дискретный, что предпочтительно, так и встроенный в ПЛИС SignalTap). О каждой особенности переноса схемы будет указано в процессе обсуждения каждого блока PPU позже.
Надеюсь, теперь многое станет понятней.

















Ответить с цитированием