8.6. Счётчики, регистры и другие последовательностные ИМС
Готовые регистры, защёлки, счётчики и регистры сдвига, регистровые ПМЛ и языки их программирования (PALASM, ABEL, CUPL), автоматы на ПЛИС, логические выбросы и большие последовательностные БИС: FIFO, умножители частоты, микроконтроллеры.
Представьте несколько обычных задач. Нужно поймать байт, который микроконтроллер на мгновение выставил на шину, и держать его на светодиодах. Нужно сосчитать импульсы датчика расхода воды и раз в секунду показать результат. Нужно вывести шестнадцать светодиодов, имея у платы Arduino всего три свободных вывода. Во всех трёх случаях работают триггерыЭлемент памяти на один бит с двумя устойчивыми состояниями (бистабильный мультивибратор)., но собирать их по одному никто не станет: такие узлы давно выпускаются целиком, в одном корпусе, со всеми удобствами — общим тактом, сбросом, выходами на три состояния.
Ниже мы пройдём по этим готовым функциям от простых к сложным. Сначала — то, что просто хранит слово, затем — то, что считает, потом — то, что сдвигает. Дальше начинается программируемая логика с триггерами внутри: в ней можно «нарисовать» почти любой небольшой автомат. В конце — несколько больших микросхем, которые делают целую работу сами.
8.6.1Защёлки и регистры: как сделать снимок шины
- Регистр — D-триггеры с общим тактом (и общим сбросом): 8 разрядов в 20-выводном корпусе ('574, '273).
- Прозрачная защёлкаТактируемый триггер, выход которого повторяет вход всё время, пока такт активен; при неактивном такте хранит последнее значение. ('573) повторяет вход, пока открыта; регистр ('574) видит вход только в момент фронта.
- При выборе смотрите на разрешение, сброс, третье состояние и «проточную«Проточная» цоколёвка — все входы на одной стороне корпуса, все выходы на противоположной: шина проходит через микросхему без пересечений на плате.» цоколёвку.
Начнём с вопроса, на котором легко ошибиться. Есть две микросхемы с почти одинаковыми названиями, одинаковым числом выводов и одинаковым назначением — '573 и '574. Обе запоминают восьмиразрядное слово. Подадим на них одни и те же сигналы и посмотрим, что они запомнят.
Результаты различаются, потому что внутри стоят принципиально разные запоминающие элементы.
- Прозрачная защёлка ('573) похожа на окно с ставнем. Пока ставень открыт (вход разрешения активен), выход просто повторяет вход — любое изменение сразу проходит насквозь. В момент, когда ставень закрывается, выход застывает на последнем значении и дальше не реагирует на вход.
- Регистр D-типа ('574) похож на фотоаппарат. Он «щёлкает» один раз — в момент активного фронта такта — и хранит этот снимок до следующего щелчка. Что происходит на входе между фронтами, его не касается.
Английское слово latch («защёлка», «фиксатор») раньше применяли к любым регистрам, поэтому в старой литературе термин двусмыслен. Сегодня различают именно так: защёлка «прозрачна», пока открыта; регистр срабатывает по фронту.
| Прозрачная защёлка ('573) | Регистр D-типа ('574) | |
|---|---|---|
| Когда вход «виден» | всё время, пока разрешение активно | только в момент активного фронта такта |
| Что хранит | значение в момент закрывания | значение в момент фронта |
| Изменение D при открытом входе | сразу проходит на выход | ни на что не влияет |
| Типичное применение | удержать слово с шины, пока оно нужно | синхронные схемы, автоматы, конвейеры |
Микроконтроллер выставил на шину 1 и поднял строб (он подключён и к разрешению защёлки '573, и к тактовому входу регистра '574, запись по положительному фронту). Пока строб высокий, программа успела сменить данные на 0, и только после этого строб опустился. Что хранят микросхемы?
Решение
Регистр сделал «снимок» на подъёме строба, когда на шине была 1, — и хранит 1. Защёлка всё время, пока строб высокий, повторяла шину и закрылась, когда там уже был 0. Если программа не уверена в порядке своих действий, лучше регистр: ему важен только момент фронта.
Почему регистр, а не россыпь триггеров. Восемь разрядов можно набрать из четырёх сдвоенных D-триггеров '74. Но у каждого триггера свои такт, асинхронные установка и сброс и оба выхода, а регистру всё это не нужно: разряды всегда тактируются одновременно, раздельные установка и сброс не требуются, инверсные выходы почти никогда не используются. Объединив тактовые (и сбросовые) цепи, восемь триггеров умещают в стандартный 20-выводной корпус:
- '574 — восемь D-триггеров с записью по положительному фронту и выходами на три состояния (общее разрешение выходов OE);
- '273 — те же восемь разрядов, но вместо третьего состоянияТретье (высокоимпедансное) состояние — выход отключён от линии: оба выходных транзистора закрыты. Позволяет нескольким выходам по очереди работать на общую шину. — общий вход сброса;
- '175 — четыре разряда, у каждого прямой и инверсный выходы (рисунок ниже).
Что здесь что (5)
- Входы данных D1–D4. слово, которое запишется по фронту такта
- Такт CLK. один на все четыре разряда: запись по положительному фронту
- Общий сброс R. сразу (асинхронно) обнуляет все разряды; активный уровень — низкий
- Прямые выходы Q. держат записанное слово до следующего фронта
- Инверсные выходы Q. особенность '175: у каждого разряда есть и инверсия
Для блока индикации нужно хранить шесть битов. Вариант А — шесть отдельных D-триггеров, у каждого выведены вход D, такт, асинхронные установка и сброс, прямой и инверсный выходы (плюс два вывода питания на всё устройство). Вариант Б — шестиразрядный регистр '174: шесть входов, шесть выходов, общий такт, общий сброс и питание. Сколько выводов в каждом варианте?
Решение
У отдельного триггера шесть сигнальных выводов (D, C, S, R, Q, Q): . У '174: — ровно стандартный 16-выводной корпус. Если собирать вариант А из сдвоенных '74 по 14 выводов, понадобятся три корпуса — 42 вывода и втрое больше места на плате.
Родственники. Регистр — самый маленький представитель большого семейства «хранилищ»:
- ЗУПВЗУПВ (RAM) — запоминающее устройство с произвольной выборкой: большой массив регистров, в любой из которых можно записать слово или прочитать его по адресу. (RAM) — по сути, огромный массив регистров: в любой из них можно записать слово или прочитать его, но не одновременно. Ёмкость — от нескольких байтов до мегабайтов и больше; главное применение — память микропроцессорных систем;
- адресуемая защёлкаАдресуемая защёлка ('259) — многоразрядная защёлка, в которой можно изменить один бит по его адресу, не трогая остальные. (например, '259) — многоразрядная защёлка, в которой можно поменять один бит по его адресу, не трогая остальные; удобно, когда восемь реле управляются по одному;
- регистры внутри больших микросхем, например в цифро-аналоговом преобразователе. Данные на шине микропроцессора живут лишь около фронта строба, а преобразованию нужно время — внутренний регистр держит слово, пока ЦАПЦАП — цифроаналоговый преобразователь: превращает двоичный код в пропорциональный ток или напряжение (раздел 9.3). его превращает в напряжение.
Сводка ходовых регистров и защёлок — в справочных таблицах в конце главы (раздел 8.10).
8.6.2Счётчики: какой выбрать и где подвох
- Синхронный счётчик тактирует все разряды разом; асинхронный (со сквозным переносомСквозной перенос (ripple) — каждый следующий триггер счётчика тактируется выходом предыдущего; задержки разрядов складываются, на выходах мелькают ложные числа.) — цепочкой, поэтому медленнее и на переходах выдаёт ложные числа (7 → 6 → 4 → 0 → 8).
- Загрузка и сброс бывают синхронными ('160–'163) и асинхронными ('190–'193) — это важно при самоперезагрузке.
- По умолчанию берите синхронные '160–'163; 8-разрядные — '590, '592.
Если в схеме просто нужен счётчик и ничего особенного от него не требуется, начинайте с семейства 4-разрядных синхронных счётчиков '160–'163; восьмиразрядные синхронные — '590 и '592. Как устроен счётчик из триггеров, мы разобрали в разделе 8.4; здесь — о том, по каким признакам различаются готовые микросхемы и почему «по умолчанию» именно синхронные.
Синхронный или асинхронный — главный вопрос
В синхронном счётчике все триггеры получают один и тот же такт и переключаются одновременно. В асинхронном (со сквозным переносом, ripple) такт получает только младший разряд, а каждый следующий тактируется выходом предыдущего — как костяшки домино. Пока «волна» бежит по цепочке, младшие разряды уже новые, а старшие ещё старые, и на выходах на мгновение появляются числа, которых в счёте нет. Переход 7 (0111) → 8 (1000) проходит через 6, 4 и 0:
Вторая беда асинхронного счётчика — скорость: задержки разрядов складываются, и в худшем случае (0111…1 → 1000…0) новое число устанавливается только после того, как перенос пройдёт все разряды. Зато асинхронные счётчики проще, экономичнее и бывают очень длинными (4020, 4040). Их обычно делают со входом, работающим по спаду: тогда выход старшего разряда одного корпуса можно прямо подать на такт следующего, и перенос в следующую декаду возникает в момент перехода предыдущей из 9 (или 15) в 0. Синхронные счётчики чаще тактируются фронтом.
| Синхронный | Асинхронный (сквозной перенос) | |
|---|---|---|
| Тактирование разрядов | все триггеры — одним тактом | каждый — выходом предыдущего |
| Ложные числа на переходах | нет | есть: 7 → 6 → 4 → 0 → 8 |
| Время установленияВремя установления — время, после которого выход входит в заданную окрестность конечного значения (±1 %, ±0,1 %) и больше её не покидает. | одна задержка триггера | сумма задержек: |
| Активный перепад | обычно фронт | обычно спад (удобно каскадировать) |
| Примеры | '160–'163, '590, '592 | '390, '393, 4020, 4040 |
Асинхронный 4-разрядный счётчик переходит из 3 (0011) в 4 (0100). Какие ложные числа на мгновение появятся на выходах (в порядке появления)?
Решение
Первым переключается Q0 (1 → 0): 0010 = 2. Его спад тактирует Q1 (1 → 0): 0000 = 0. Спад Q1 тактирует Q2 (0 → 1): 0100 = 4 — конечное состояние. Q3 не участвует. Итак, 2 и 0; дешифраторПо -разрядному коду возбуждает один из выходов (у '138 — выбранный выход НИЗКИЙ). нуля на таком счётчике сработал бы при переходе 3 → 4.
Регистратор считает импульсы 14-разрядным асинхронным счётчиком 4020 (в исполнении HC задержка каждого разряда до 25 нс). Чтобы прочитать число без мельканий, его переписывают в D-регистр по следующему фронту такта; время установки регистра 12 нс. Какова наибольшая частота такта, при которой регистр гарантированно запишет установившееся число?
Решение
В худшем случае перенос проходит все 14 разрядов: нс после фронта. Плюс время установки:
Пример асинхронного счётчика с «характером» — сдвоенный двоично-десятичный '390. Каждая его половина — это два независимых делителя, на 2 и на 5, с отдельными тактовыми входами; соединяя их в разном порядке, получают разные формы сигнала.
Что здесь что (5)
- Вход C_A. такт делителя на 2 (срабатывает по спаду)
- Вход C_B. такт делителя на 5 — отдельный, поэтому делители можно соединять в любом порядке
- СБРОС. общий асинхронный сброс обоих делителей
- Выход Q_A. выход делителя на 2
- Выходы Q_B…Q_D. выходы делителя на 5; Q_D — старший
Половина '390 тактируется частотой 1 МГц. В соединении «8-4-2-1» такт подают на C_A, а Q_A — на C_B (счёт 0…9 в двоично-десятичном кодеBCD: каждая десятичная цифра кодируется отдельно четырьмя битами; .). Какая частота на выходе Q_A и какую долю периода выход Q_D находится в единице? Затем делители соединили наоборот: такт на C_B, выход Q_D — на C_A, выходом служит Q_A. Каков теперь коэффициент заполнения выходного сигнала?
Решение
В первом соединении Q_A — выход делителя на 2: 500 кГц. Q_D = 1 только в состояниях 8 и 9, т. е. 2 такта из 10 — 20 %. Во втором соединении делитель на 5 выдаёт один спад на 5 тактов, а триггер-делитель на 2 после него меняет состояние каждые 5 входных тактов: Q_A — симметричный меандр 100 кГц, 50 %. Когда из десятичного делителя нужен «ровный» сигнал (например, для тактирования следующего каскада с требованием к скважностиСкважность — отношение периода импульсов к их длительности ; обратна коэффициенту заполнения.), берут второе соединение.
Реверс, загрузка, сброс
Реверсивные счётчикиРеверсивный счётчик — считает и вверх, и вниз: направление задаёт вход U/D ('191) или раздельные тактовые входы ('193). умеют считать в обе стороны (энкодер ручки громкости, счётчик людей у турникета). Направление задают одним из двух способов: отдельным входом «вверх/вниз» (U/D) при общем такте — так у '191, или двумя раздельными тактовыми входами для счёта вверх и вниз — так у '193. Восьмиразрядные реверсивные — '569 и '579.
У большинства счётчиков есть информационные входы для предварительной (параллельной) загрузки числа — «параллельной», потому что все разряды заносятся одновременно. Без неё не сделать счётчик по модулюСчётчик по модулю n — делит входную частоту на целое n, заданное входным словом (обычно предзагрузкой и перезагрузкой при переполнении). n. Важно, когда число заносится:
- синхронная загрузка ('160–'163) — по очередному фронту такта, если на входе ЗАГРУЗКА разрешающий уровень;
- асинхронная загрузка ('190–'193) — сразу, как только ЗАГРУЗКА активна, не дожидаясь такта.
Сброс в нуль — частный случай загрузки. Чаще он асинхронный, но у '162 и '163 — синхронный.
| Синхронная загрузка/сброс | Асинхронная загрузка/сброс | |
|---|---|---|
| Когда срабатывает | по очередному фронту такта | сразу, как только вход активен |
| Самоперезагрузка по своему выходу | чисто: состояние держится целый такт | самоуничтожающийся короткий импульс |
| Примеры | '160–'163 (загрузка), '162, '163 (сброс) | '190–'193 |
Удобства на выходе
Выходные защёлки. Частотомер считает импульсы целую секунду; если показывать прямо выходы счётчика, на индикаторе будут бежать цифры, а в начале каждого цикла — мигать нуль. Счётчик со встроенными защёлками показывает результат прошлого цикла, пока идёт новый, и обновляет его раз за цикл. Такие защёлки всегда прозрачные: если держать их открытыми, счётчик ведёт себя так, будто их нет. (Заметим, что и любой счётчик с параллельными входами может работать как защёлка — но тогда он не может одновременно считать и хранить.)
Выходы на три состояния нужны, когда несколько счётчиков по очереди выдают свои цифры на одну шину — для индикации или передачи. '779 — 8-разрядный синхронный двоичный счётчик, у которого выходы на три состояния служат ещё и входами загрузки; благодаря совмещённым выводам он помещается в 16-выводной корпус ('593 — то же в 20-выводном).
Счётчик вместе с индикацией. Есть микросхемы, где в одном корпусе счётчик, регистр, дешифратор 7-сегментного кода и формирователь для индикатора (4-разрядные 74C925–74C928), и даже счётчик вместе с самим индикатором (TIL306/307). Особенно удачна БИС Intersil 7216 — готовый 8-декадный универсальный счётчик-частотомер на 10 МГц, которому почти не нужны внешние детали.
8.6.3Регистры сдвига: из параллельного в последовательный и обратно
- Регистр сдвигаРегистр сдвига — цепочка D-триггеров с общим тактом (выход каждого — на вход следующего): по каждому фронту слово сдвигается на один разряд. — цепочка D-триггеров с общим тактом: по каждому фронту слово сдвигается на разряд, гонок нет.
- Применения: параллельный код ↔ последовательный и память, читаемая в порядке записи.
- ОЗУ + счётчик адресов = длинный реверсивный регистр сдвига; период — сумма минимальных фаз такта.
Вернёмся к задаче из начала раздела: шестнадцать светодиодов и три свободных вывода. Решение — два '595, соединённых цепочкой: микроконтроллер «проталкивает» 16 битов по одному проводу данных, отмечая каждый бит тактовым импульсом, а потом одним импульсом на третьем проводе переписывает собранное слово на выходы. Внутри '595 — регистр сдвига: цепочка D-триггеров, где выход каждого подан на вход следующего, а такт у всех общий.
Что здесь что (6)
- Последовательный вход. новый бит входит в первый триггер по каждому фронту
- Разряд 0. D-триггер: записывает то, что было на входе перед фронтом
- Связь Q → D. выход каждого триггера — на вход следующего; задержка триггера гарантирует, что сосед «увидит» старое значение
- Общий такт. все разряды тактируются одновременно — это синхронная схема
- Последовательный выход. бит выходит из последнего разряда через n тактов
- Параллельные выходы. все n бит доступны сразу — так делают преобразователь последовательного кода в параллельный
По каждому фронту вся комбинация нулей и единиц переезжает на разряд дальше, а в первый триггер входит новый бит. Может показаться, что тут неизбежна гонка: все триггеры тактируются одновременно, и каждый тут же меняет вход соседа. Но триггер записывает то, что было на входе непосредственно перед фронтом, а выход меняет лишь спустя свою задержку. Сосед успевает «увидеть» старое значение — поэтому регистры сдвига спокойно соединяют каскадно, хоть десятками.
Зачем это нужно? Во-первых, чтобы превращать параллельный код (n битов одновременно по n проводам) в последовательный (биты друг за другом по одному проводу) и обратно — так работают SPI, UART, светодиодные ленты, расширители портов. Во-вторых, как память, если данные всегда читаются в том же порядке, в каком записаны (линия задержки, буферБуфер — повторитель с : огромное входное и малое выходное сопротивление, развязывает источник и нагрузку. строки изображения).
Какие бывают
- Длина. Стандартны 4- и 8-разрядные; есть на 64 бита и больше и даже переменной длины: у 4557 длина от 1 до 64 битов задаётся 6-разрядным управляющим словом.
- Сколько в корпусе. Обычно один регистр, но бывают сдвоенные, счетверённые и даже шесть в корпусе.
- Направление. Большинство сдвигает только в одну сторону («вправо»); реверсивные ('194, '323) имеют вход направления (рисунок ниже). С '95 будьте осторожны: «влево» он сдвигает лишь в том случае, если каждый выход заранее соединить со входом предыдущего разряда и пользоваться параллельной загрузкойПараллельная (предварительная) загрузка — все разряды счётчика или регистра заносятся одновременно с информационных входов; бывает синхронной (по фронту) и асинхронной (сразу). — это не настоящий реверс.
- Входы и выходы. Короткие регистры обычно имеют параллельные вход и выход (PI/PO), как 4-разрядный '395 с выходами на три состояния. Длинным хватает только последовательных: вход в первый триггер и выход из последнего, иногда с несколькими промежуточными отводами. Уместить параллельные вход и выход восьми разрядов в маленький корпус можно, только совместив выводы: '299 — 8-разрядный PI/PO в 20-выводном корпусе. У некоторых регистров есть защёлки на входе или выходе ('595, '597), чтобы сдвиг шёл, пока предыдущее слово загружается или выгружается.
- Загрузка и сброс, как у счётчиков, синхронные или асинхронные: '323 — это '299 с синхронным сбросом. Сводка — в таблицах раздела 8.10; не все типы есть во всех семействах.
Универсальный 4-разрядный '194 умеет всё сразу: хранить, сдвигать в обе стороны и загружать параллельно. Режим выбирают два входа S1, S0.
Что здесь что (7)
- DSR. последовательный вход при сдвиге вправо: бит входит в
- A–D. параллельные входы — загружаются при S1S0 = 11
- DSL. последовательный вход при сдвиге влево: бит входит в
- S0, S1. режим: хранение, вправо, влево, загрузка (таблица ниже)
- CLK. всё происходит по положительному фронту такта
- R. асинхронный сброс всех разрядов
- Q_A…Q_D. параллельные выходы; — старший разряд в наших упражнениях
| S1 | S0 | Действие по фронту CLK |
|---|---|---|
| 0 | 0 | хранение (запрет) |
| 0 | 1 | сдвиг вправо: DSR, , … |
| 1 | 0 | сдвиг влево: DSL, , … |
| 1 | 1 | параллельная загрузка A–D |
В '194 (порядок , — старший) параллельно загрузили 0110. Затем при DSL = 1 сделали два сдвига влево и при DSR = 0 — один сдвиг вправо. Какое десятичное число окажется в регистре?
Решение
Сдвиг влево: DSL, остальные разряды едут к , бывший уходит. 0110 → 1101 → 1011. Сдвиг вправо: DSR = 0, бывший уходит: 1011 → 0101 = 5.
Длинный регистр сдвига из ОЗУ: цифровое эхо
Гитарный эффект «эхо» — это задержка звука на десятки миллисекунд. При частоте отсчётов 48 кГц задержка на 21 мс — это примерно тысяча отсчётов по 8 бит, т. е. регистр сдвига на тысячу байтов. Такой регистр не купить, но его легко сделать из обычного ОЗУ и счётчика адресов: память с произвольной выборкой всегда можно заставить работать как регистр сдвига (наоборот — нельзя), если перебирать адреса по порядку.
Что здесь что (7)
- АЦП. каждый такт выдаёт новый 8-битовый отсчёт
- Входной регистр. по фронту такта забирает новый отсчёт
- ОЗУ 1K × 8. каждая ячейка — одна «позиция» длинного регистра
- Счётчик адреса. 10 разрядов: перебирает 1024 адреса по кругу; если сделать его реверсивным, можно «сдвигать» в обе стороны
- Инвертор. запись (WE = 0) идёт в высокой фазе такта, смена адреса — в низкой
- Выходной регистр. по фронту забирает старое содержимое ячейки до того, как в неё запишут новое
- ЦАП. выдаёт задержанный звук
Секрет — в порядке событий внутри одного такта: сначала прочитать ячейку, потом записать в неё же. Пока адрес k стоит неподвижно в низкой фазе такта, ОЗУ не пишет, и на его выходе — то, что было записано в ячейку k при прошлом посещении. Фронт такта переписывает это старое содержимое в выходной регистр и одновременно новый отсчёт — во входной. В высокой фазе (WE = 0) новый отсчёт ложится в ячейку k, и лишь после окончания записи счётчик переходит к k + 1. Счётчик возвращается к адресу k через 1024 такта — значит, каждый отсчёт выходит ровно через 1024 такта после входа, как из регистра сдвига длиной 1024 (по каждой из восьми линий данных).
Как быстро это может работать. Распишем, что должно успеть произойти в каждой фазе такта. Возьмём максимальные задержки обычной КМОПКМОП — комплементарные МОП-транзисторы: n- и p-канальные приборы на одном кристалле. Основа почти всей цифровой логики и аналоговых ключей.-логики и медленного ОЗУ: регистр «такт → выход» 12 нс, инвертор 7 нс, установка данных ОЗУ перед концом записи 10 нс, счётчик «такт → адрес» 15 нс, время выборки ОЗУ 25 нс, установка выходного регистра 5 нс.
- Высокая фаза: нсвходной регистр выдаёт новый отсчёт через 12 нс после фронта, и он должен опередить конец записи на время установки ОЗУ (10 нс); конец записи задержан инвертором на 7 нс — это играет нам на руку
- Низкая фаза: нсинвертор, затем счётчик меняет адрес, ОЗУ выдаёт данные нового адреса, и они должны опередить следующий фронт на время установки выходного регистра
- Период: сумма фазесли скважность такта можно выбрать свободно
Для звука (48 кГц) запас огромный. Но и в быстрых применениях ОЗУ не сильно проигрывает: на быстрых сериях та же схема сдвигает с частотой около 30 МГц — примерно как интегральные регистры сдвига серии HC, — а длина регистра ограничена только объёмом памяти.
Ту же линию задержки собрали на быстрых микросхемах. Максимальные задержки: инвертор 3 нс, регистр «такт → выход» 5 нс, установка данных ОЗУ перед концом записи 4 нс, счётчик «такт → адрес» 7 нс, выборка ОЗУ 10 нс, установка выходного регистра 2 нс. Найдите наибольшую частоту сдвига при выгодной (несимметричной) скважности такта и при меандре.
Решение
Высокая фаза: нс. Низкая фаза: нс. При свободной скважности нс, МГц. У меандра обе фазы по 22 нс: нс, МГц — почти в полтора раза медленнее.
Объясните, почему линия задержки на ОЗУ даёт задержку ровно 1024 такта, хотя в каждом такте запись и чтение идут в одну и ту же ячейку. Что услышит слушатель, если счётчик адреса сделать реверсивным и в какой-то момент переключить его со счёта вверх на счёт вниз?
Решение
Внутри такта чтение предшествует записи. Всю низкую фазу адрес k неподвижен, запись запрещена (WE = 1), и выход ОЗУ показывает то, что лежит в ячейке k. Фронт такта переписывает это старое содержимое в выходной регистр, а новый отсчёт — во входной; только потом, в высокой фазе, новый отсчёт записывается в ячейку k. Запись заканчивается раньше, чем меняется адрес. Ячейка k — это одна «позиция» регистра: записанный в неё отсчёт будет прочитан при следующем посещении адреса k, а счётчик возвращается к нему через такта. Это и есть регистр сдвига длиной 1024 по каждой из восьми линий данных.
Если счётчик пойдёт назад, он будет посещать k − 1, k − 2, … — ячейки, записанные только что. Отсчёт, записанный такт назад, выйдет через 2 такта, записанный два такта назад — через 4 и т. д.: данные пойдут в обратном порядке. Слушатель услышит последние ≈ 21 мс звука, проигранные задом наперёд, — эффект «реверс», который действительно делают так в цифровых педалях. Поэтому такую схему и называют реверсивным регистром сдвига.
8.6.4Регистровые ПМЛ: автомат в одном корпусе
- Регистровая ПМЛПрограммируемая матричная логика (PAL): программируемая матрица И, фиксированная матрица ИЛИ. Например, 16L8 — до 16 входов, 8 выходов. (16R8) = матрица И + фиксированное ИЛИ + D-регистры с общим тактом и обратной связью в матрицу: любой небольшой автомат в одном корпусе.
- PALASMPALASM (PAL Assembler) — первый транслятор логических уравнений в карту перемычек ПМЛ; минимизацию делает сам разработчик. переводит уравнения в карту перемычек; ABEL и CUPL ещё и минимизируют, понимают таблицы и автоматы.
- Не больше 7–8 произведений на выход; переходы в себя задавайте явно, иначе автомат уйдёт в 000.
- Сумма произведений даёт статические выбросыСтатический выброс — короткий импульс на выходе, который должен был оставаться неизменным (например, 1 → 0 → 1 при смене одного входа).; лечат избыточным термом-консенсусом ( для мультиплексораМультиплексор — набор ключей с дешифратором: по двоичному адресу соединяет с выходом один из нескольких входов.).
В разделе 8.3 программируемая матрица логики (ПМЛ) была чисто комбинационнойКомбинационная схема: выход в каждый момент определяется только текущими входами — памяти нет. Строится из одних вентилей.: программируемые И, фиксированное ИЛИ, и всё. Добавим на каждый выход D-триггер с общим тактом, а выходы триггеров заведём обратно в матрицу И — получится регистровая ПМЛ. Типичный представитель — 16R8: восемь регистров с выходами на три состояния; их прямые и инверсные выходы входят в матрицу наравне с обычными входными выводами. Есть и промежуточные варианты с меньшим числом регистров (16R6, 16R4).
Что здесь что (5)
- Программируемая матрица И. × — сохранённая перемычка: в произведение входит этот сигнал (прямой или инверсный)
- Фиксированное ИЛИ. сумма произведений — единственная форма логики в ПМЛ
- D-триггер. все 8 регистров тактируются общим тактом
- Буфер с третьим состоянием. общий вход OE отключает выходы
- Обратная связь. выход регистра снова входит в матрицу И — так получается автомат: следующее состояние зависит от текущего
Сравните это с общей схемой синхронного автомата из раздела 8.4: регистр хранит текущее состояние, комбинационная логика по состоянию и входам вычисляет следующее. Регистровая ПМЛ — ровно такой автомат «общего назначения», только с ограниченным числом регистров и вентилей. В этих пределах из неё можно сделать что угодно: регистр сдвига, счётчик, то и другое сразу, детектор последовательности. На практике ПМЛ чаще всего заменяет кусок большой схемы, который иначе пришлось бы набирать из россыпи вентилей и триггеров.
Простой проект — вручную
Небольшую логику можно перенести в ПМЛ и без компьютера: нарисовать схему, выписать уравнения и превратить их в карту перемычек для программатора. Пусть нужен четырёхвходовый мультиплексор, выход которого защёлкивается по такту. В ПМЛ доступна только сумма произведений, поэтому комбинационную часть (то, что приходит на D-вход) сразу пишем в этой форме:
Каждое произведение — один информационный вход и две адресные переменные; четыре произведения складываются, и результат защёлкивается триггером. Мы не стали сначала декодировать адрес на двухвходовых вентилях, как сделали бы на россыпи: в ПМЛ это лишний проход через матрицу, а трёхвходовые И получаются «бесплатно» и быстрее. (У этой схемы есть подвох — о нём в конце пункта, в «Выбросах».)
Что здесь что (4)
- Произведение . каждое И — один терм суммы: входной сигнал и две адресные переменные
- ИЛИ на 4 входа. сумма четырёх произведений
- D-триггер. фиксирует результат по фронту такта
- Такт. общий такт регистровой ПМЛ
От уравнений к перемычкам: PALASM, ABEL, CUPL
Ручной метод быстро упирается в масштаб. В ПМЛ 16L8 2048 перемычек; серьёзный проект требует пережечь сотни из них, и составить такую карту без единой ошибки способен лишь на редкость педантичный человек. Поэтому ещё фирма Monolithic Memories, придумавшая ПМЛ, выпустила транслятор PALASM (PAL Assembler). Он принимает логические уравнения вроде написанного выше и выдаёт карту перемычек, но не минимизирует их — эту часть работы делаете вы. Зато PALASM позволяет задать тестовые векторыТестовые векторы — наборы «входы → ожидаемые выходы» для проверки уравнений до программирования и готового кристалла после. — наборы входов и ожидаемых выходов — и проверить уравнения ещё до программирования кристалла.
Результат записывается в стандартном формате JEDECJEDEC — стандартный текстовый формат карты перемычек, который загружают в программатор. и передаётся программатору по последовательному порту. PALASM был доступен даже в исходных текстах на Фортране, а многие программаторы со встроенным микропроцессором (Data I/O, Digilec, Stag, Structured Design) имели его «внутри»: подключил терминал — и работай.
Следующий шаг — языки высокого уровня ABELABEL (Data I/O) — язык высокого уровня для программирования ПМЛ и ПЛМ, аналог CUPL. (Data I/O) и CUPLCUPL (Logical Devices) — язык описания программируемой логики: уравнения, таблицы истинности, автоматы; сам минимизирует и выдаёт файл JEDEC. (Logical Devices). С ними программирование ПМЛ и ПЛМПрограммируемая логическая матрица (PLA): программируются и матрица И, и матрица ИЛИ. становится лёгкой работой:
- логику можно задавать булевыми уравнениями, таблицами истинностиПеречень значений выхода для всех комбинаций входов логической схемы., а для последовательностныхПоследовательностная схема: выход зависит и от входов, и от предыдущего состояния — в ней есть память (триггеры). схем — прямо состояниями и правилами переходов;
- как в нормальном языке программирования, есть группы сигналов (например, адресная шина), выражения и
промежуточные переменные; вместо перечисления диапазона адресов пишут что-нибудь вроде
ADDR:[10..FF]; - компилятор сам переводит таблицы в уравнения и минимизирует их до формы, подходящей для выбранного прибора (для ПМЛ — сумма произведений);
- тестовые векторы передаются и программатору — он проверяет уже прошитый кристалл;
- генерируется документация на запрограммированную микросхему; без неё «самодельные кристаллы» в приборе потом не отладить.
| Вручную | PALASM | ABEL, CUPL | |
|---|---|---|---|
| Вход | схема на бумаге | логические уравнения | уравнения, таблицы истинности, автоматы |
| Минимизация | сами | сами | автоматически |
| Тестовые векторы | — | есть | есть, и для программатора |
| Результат | карта перемычек | файл JEDEC | файл JEDEC и документация |
Пример 1 (комбинационная логика): шестнадцатеричный дешифратор индикатора
Стандартный дешифратор 7-сегментного кода вроде 4511 умеет только цифры 0–9, а на кодах 10–15 гасит индикатор. Для отладочного табло, которое показывает байты в шестнадцатеричном виде, нужны ещё буквы A, b, C, d, E, F. Готовой микросхемы «на каждом складе» нет — сделаем её из ПМЛ 16L8: четыре входа кода, семь выходов-сегментов.
На CUPL такой дешифратор описывается почти дословно таблицей: «код → какие сегменты горят». Не нужно ни промежуточных переменных, ни уравнений — компилятор выведет их сам.
/* Дешифратор: 4-битовый код → 7-сегментный шестнадцатеричный знак */
/* Прибор: ПМЛ 16L8 (матрица И-ИЛИ-НЕ), индикатор с общим катодом */
/* ** Входы ** */
PIN [2..5] = [D3..0]; /* код знака 0…F */
/* ** Выходы: сегмент горит при 1 ** */
PIN [19..13] = [a, b, c, d, e, f, g];
FIELD code = [D3..0];
FIELD seg = [a, b, c, d, e, f, g];
TABLE code => seg { /* порядок битов: a b c d e f g */
'h'0 => 'b'1111110; 'h'1 => 'b'0110000; 'h'2 => 'b'1101101; 'h'3 => 'b'1111001;
'h'4 => 'b'0110011; 'h'5 => 'b'1011011; 'h'6 => 'b'1011111; 'h'7 => 'b'1110000;
'h'8 => 'b'1111111; 'h'9 => 'b'1111011; 'h'A => 'b'1110111; 'h'B => 'b'0011111;
'h'C => 'b'1001110; 'h'D => 'b'0111101; 'h'E => 'b'1001111; 'h'F => 'b'1000111;
}Описание дешифратора на CUPL (синтаксис: FIELD — группа сигналов, TABLE — таблица истинности, 'h' — шестнадцатеричное и 'b' — двоичное число).
Теперь посчитаем, влезет ли это в кристалл. Каждый сегмент — функция четырёх переменных; без минимизации его сумма содержит по одному произведению (минтермуПроизведение всех входных переменных (прямых или инверсных), равное 1 ровно на одном наборе входов; соответствует одной клетке карты Карно и одному выходу дешифратора.) на каждый знак, где сегмент горит: у сегмента a это 12 знаков из 16, у g — тоже 12. А 16L8, как и все комбинационные ПМЛ, допускает не больше 7 произведений на одну сумму.
Есть два честных выхода. Первый — минимизация (склеивание по карте Карно или законам булевой алгебрыБулева алгебра — логика переменных со значениями 1 и 0: операции И, ИЛИ, НЕ.): у сегмента a двенадцать минтермов сжимаются до шести произведений, у e — десять до четырёх. Второй — заметить, что выход 16L8 сам по себе инверсный (матрица И-ИЛИ-НЕ), и описать нули сегмента, а не единицы. Сегмент a не горит всего в четырёх знаках (1, 4, b, d), поэтому сумма по нулям содержит четыре минтерма и помещается даже без минимизации. Какой путь годится, зависит от индикатора: с общим катодом сегмент зажигается единицей, и инверсный выход ПМЛ как раз должен давать НЕ (сумма нулей); с общим анодом сегмент зажигается нулём — тогда нужна сумма по единицам.
Был и третий, плохой путь — провести выход через второй вентиль ИЛИ (обратной связью, ещё одним проходом через матрицу). Он работает, но удваивает задержку; для табло это не страшно, но решение некрасивое.
/* Сумма по единицам (так нужно для общего анода: выход 16L8 = НЕ сумма) */ a = D2 & D1 # !D3 & D1 # D3 & !D0 # !D2 & !D0 # !D3 & D2 & D0 # D3 & !D2 & !D1 ; /* 12 минтермов → 6 */ e = D3 & D1 # D3 & D2 # D1 & !D0 # !D2 & !D0 ; /* 10 → 4 */ /* Сумма по нулям (общий катод: выход 16L8 = НЕ сумма нулей = сегмент) */ !a = !D3 & !D2 & !D1 & D0 # !D3 & D2 & !D1 & !D0 # D3 & !D2 & D1 & D0 # D3 & D2 & !D1 & D0 ; /* 4 минтерма: 1, 4, b, d */ !c = D3 & D2 & D1 # D3 & D2 & !D0 # !D3 & !D2 & D1 & !D0 ; /* 4 → 3 */
Результат минимизации для двух сегментов (наш расчёт): сверху — суммы по единицам, снизу — по нулям. Все суммы укладываются в 7 произведений.
Шестнадцатеричный дешифратор нужно сделать на 16L8 для индикатора с общим катодом, т. е. программировать суммы по нулям сегментов. Сколько минтермов содержит такая сумма для сегмента b (без минимизации)? А для индикатора с общим анодом: сколько минтермов у суммы по единицам сегмента a до минимизации и сколько произведений после неё?
Решение
Сегмент b горит в знаках 0, 1, 2, 3, 4, 7, 8, 9, A, d — десять знаков, не горит в шести (5, 6, b, C, E, F): сумма по нулям — 6 минтермов, помещается в 16L8 без минимизации. Сегмент a горит в двенадцати знаках (всех, кроме 1, 4, b, d): 12 минтермов — больше предела 7. После минимизации — 6 произведений, помещается. Для общего катода самая длинная сумма по нулям — 6 минтермов (у b и e), так что весь дешифратор входит в кристалл вообще без минимизации.
Пример 2 (последовательностная схема): автомат продажи напитка
Любой синхронный автомат — это набор состояний и правила перехода между ними по каждому фронту такта; правило зависит от текущего состояния и от входов перед фронтом. Такой автомат помещается в регистровую программируемую логику, если:
- а) разрядов регистра хватает, чтобы закодировать все состояния (4 бита — до 16 состояний);
- б) хватает входов и произведений для правил перехода.
Классическая учебная задача — автомат, который выдаёт бутылку, когда опущено не меньше 25 центов. Монетоприёмник сам «глотает» и опознаёт монету и на один такт выставляет двухбитовый код (C1, C0): 01 — 5 центов, 10 — 10 центов, 11 — 25 центов, 00 — монеты нет. Автомат копит сумму и, как только её хватает, на один такт выдаёт сигнал «бутылка». Начнём не с картинки, а с таблицы переходов — по ней автомат проще проверять.
| Состояние (код) | нет монеты | 5 ц | 10 ц | 25 ц |
|---|---|---|---|---|
| S0 (000) | S0 | S5 | S10 | ENOUGH |
| S5 (001) | S5 | S10 | S15 | ENOUGH |
| S10 (010) | S10 | S15 | S20 | ENOUGH |
| S15 (011) | S15 | S20 | ENOUGH | ENOUGH |
| S20 (100) | S20 | ENOUGH | ENOUGH | ENOUGH |
| ENOUGH (101) | S0 | S0 | S0 | S0 |
Что здесь что (5)
- S0 — 0 центов. начальное состояние; сюда ведёт reset
- S5. накоплено 5 центов
- S20. из 20 центов любая монета даёт «достаточно»
- ENOUGH (≥25). выход «бутылка»; по следующему такту — безусловно в S0
- Петля «нет». переход в себя без монеты — его надо задать явно, иначе ПМЛ уйдёт в 000
Описание на CUPL повторяет таблицу почти построчно. Сначала — назначение выводов; добавлен вход reset, переводящий автомат в S0. Затем состояниям присваиваются двоичные коды (здесь — просто накопленная сумма: 0, 5, …), и для каждого состояния перечисляются переходы. Там же указываются выходы, которые нужно формировать в состояниях или на переходах.
«Бутылку» мы сделали отдельным регистровым выходом: тогда её не надо получать дешифрацией состояний, и она не дрожит при переходах. Строго говоря, наружу нужен только этот выход, а биты состояния Q0–Q2 могли бы жить во внутренних регистрах — у некоторых программируемых приборов такие есть в дополнение к выходным.
/* Автомат продажи: бутылка за 25 центов (регистровая ПМЛ 16R6) */
/* ** Входы ** */
PIN 1 = clk; PIN 2 = c0; PIN 3 = c1; PIN 4 = reset;
/* ** Регистровые выходы ** */
PIN 14 = Q0; PIN 15 = Q1; PIN 16 = Q2; /* код состояния */
PIN 17 = !bottle; /* «выдать», активный 0 */
/* Коды состояний = накопленная сумма */
$define S0 'b'000 $define S5 'b'001 $define S10 'b'010
$define S15 'b'011 $define S20 'b'100 $define ENOUGH 'b'101
/* Что пришло от монетоприёмника (и нет сброса) */
nocoin = !c1 & !c0 & !reset; nickel = !c1 & c0 & !reset;
dime = c1 & !c0 & !reset; quarter = c1 & c0 & !reset;
field statebit = [Q2..0];
sequence statebit {
present S0 if nocoin next S0; if nickel next S5;
if dime next S10; if quarter next ENOUGH out bottle;
present S5 if nocoin next S5; if nickel next S10;
if dime next S15; if quarter next ENOUGH out bottle;
present S10 if nocoin next S10; if nickel next S15;
if dime next S20; if quarter next ENOUGH out bottle;
present S15 if nocoin next S15; if nickel next S20;
if dime next ENOUGH out bottle; if quarter next ENOUGH out bottle;
present S20 if nocoin next S20;
if nickel next ENOUGH out bottle; if dime next ENOUGH out bottle;
if quarter next ENOUGH out bottle;
present ENOUGH next S0;
}Автомат продажи на языке CUPL (в нашей записи): present — текущее состояние, if … next … — переход, out — выход на переходе.
if nocoin next …. Если ни одно условие не
выполнено, D-входы регистров просто не получают единиц, и автомат безусловно сбрасывается в 000. Причина в устройстве:
все условия собираются в суммы произведений на D-входах, и «ничего не выполнено» означает «все нули».На том же механизме держится и вход reset: он входит во все промежуточные переменные nocoin, nickel, dime, quarter. При reset = 1 ни одна из них не истинна — все D-входы обнуляются, и автомат оказывается в S0.
Уравнения, которые выдаёт компилятор, на исходное описание совсем не похожи: и состояния, и монеты закодированы двоичными числами, а логика оперирует отдельными битами. Выбери мы другие коды состояний (у нас — возрастающий двоичный 0–5), уравнения изменились бы до неузнаваемости.
Q0.d = !Q2 & c0 & c1 & !reset
# !Q2 & Q0 & !c0 & !reset
# !Q1 & !Q0 & c0 & !reset
# !Q2 & !Q0 & c0 & !reset
# Q2 & !Q1 & !Q0 & c1 & !reset ;
Q1.d = !Q2 & Q1 & !Q0 & !c1 & !reset
# !Q2 & Q1 & !c0 & !c1 & !reset
# !Q2 & !Q1 & c1 & !c0 & !reset
# !Q2 & !Q1 & Q0 & c0 & !c1 & !reset ;
Q2.d = !Q2 & Q1 & c1 & !reset
# !Q2 & c0 & c1 & !reset
# Q2 & !Q1 & !Q0 & !reset
# !Q2 & Q1 & Q0 & c0 & !reset ;
bottle.d = !Q2 & c0 & c1 & !reset
# !Q2 & Q1 & Q0 & c1 & !reset
# Q2 & !Q1 & !Q0 & c0 & !reset
# Q2 & !Q1 & !Q0 & c1 & !reset ;Уравнения D-входов автомата продажи после минимизации (наш расчёт; неиспользуемые коды 110 и 111 ведут в S0).
Проверьте уравнения D-входов на пяти переходах: из S0 монетой 10 центов, из S15 монетой 10 центов, из S20 монетой 5 центов, из S10 без монеты и из неиспользуемого кода 111 при монете 25 центов. Для каждого перехода найдите, какие произведения равны 1, и запишите и bottle после фронта.
Решение
Везде reset = 0.
S0 (000), 10 ц (c1 c0 = 10). Q0.d: все термы требуют либо c0 = 1, либо Q0 = 1, либо Q2 = 1 → 0. Q1.d: терм = 1 → 1. Q2.d: нужны Q1, c0 или Q2 → 0. bottle: нужны c0 или Q1Q0 или Q2 → 0. Итог 010 = S10. Верно.
S15 (011), 10 ц. Q0.d: = 1 → 1. Q1.d: первые два терма требуют , третий и четвёртый — → 0. Q2.d: = 1 → 1. bottle: = 1. Итог 101 = ENOUGH, бутылка выдана. Верно.
S20 (100), 5 ц (01). Q0.d: = 1 → 1. Q1.d: все термы требуют → 0. Q2.d: = 1 → 1. bottle: = 1. Итог 101 = ENOUGH с бутылкой. Верно.
S10 (010), монеты нет. Q1.d: и = 1 → 1. Q0.d, Q2.d, bottle: каждый терм требует хотя бы одной монеты или Q2 = 1 → 0. Остаётся 010 = S10. Верно: переход в себя задан явно.
111, 25 ц. Каждый терм Q0.d, Q1.d, Q2.d и bottle содержит либо , либо — при Q2 = Q1 = Q0 = 1 все они равны 0. Итог 000 = S0, бутылки нет: «потерянный» автомат сам возвращается в начало, а не выдаёт бесплатный напиток.
Автомат посложнее: напиток стоит 40 центов, принимаются монеты 10 и 25 центов, а сдача выдаётся монетами по 5 центов — по одной за такт. Автомат копит сумму, затем в одном состоянии выдаёт напиток, «помня», сколько сдачи должен, и далее по такту на каждую монету сдачи. Сколько всего состояний нужно и сколько разрядов регистра для их кодирования?
Решение
Накопление. Достижимые суммы меньше 40: 0, 10, 20, 25, 30, 35 — шесть состояний (15 и 5 недостижимы: монет по 5 нет). Из каждого «нет монеты» — переход в себя.
Выдача. Наибольшая сумма перед последней монетой — 35, наибольшая монета — 25: итог до 60, переплата 0, 5, 10, 15 или 20 центов, т. е. сдача монеты. Состояние выдачи должно помнить c, поэтому их пять: (в каждом — выход «напиток»). Из суммы s монетой m — в с , если , иначе в состояние .
Сдача. ; при ; состояние выдаёт одну монету и переходит в , . Состояний — четыре.
Итого состояний — 4 разряда (16 кодов, один лишний — его ведите в начальное состояние). Напиток выдаётся при любой сумме ≥ 40, потому что все такие переходы ведут в одно из ; монеты, опущенные во время сдачи, в этой версии теряются — в настоящем автомате монетоприёмник на это время блокируют.
Нарисуйте диаграмму состоянийГраф: кружки — состояния автомата, стрелки — переходы по такту с условиями на входах. детектора последовательности: на вход поступает поток битов (по одному биту на такт), выход должен быть равен 1 в течение такта после того, как последние четыре бита образовали 1011. Последовательности могут перекрываться: в потоке 1011011 детектор должен сработать дважды. Сколько разрядов регистра понадобится?
Решение
Состояние — «сколько последних битов совпадает с началом образца». S0 — ничего, S1 — «1», S2 — «10», S3 — «101», S4 — «1011» (выход = 1, автомат Мура).
- S0: 1 → S1, 0 → S0.
- S1 («1»): 0 → S2, 1 → S1 (последняя 1 — снова начало образца).
- S2 («10»): 1 → S3, 0 → S0 («100» не продолжает образец ни с какого места).
- S3 («101»): 1 → S4, 0 → S2 (из «1010» хвост «10» — начало образца).
- S4 («1011»): 1 → S1 (хвост «1»), 0 → S2 (хвост «10»). Именно эти переходы обеспечивают перекрытие: в 1011011 после первого срабатывания автомат из S4 по 0 идёт в S2, затем по 1 и 1 — в S3 и S4, второе срабатывание.
Правило выбора «отката» при ошибке: переходим в состояние, равное длине самого длинного хвоста принятых битов, совпадающего с началом образца (так строится автомат в алгоритме Кнута — Морриса — Пратта). Пять состояний — 3 разряда; три неиспользуемых кода направьте в S0. В ПМЛ это четыре коротких уравнения; на CUPL — как в примере с автоматом продажи, с явными переходами в себя там, где они есть.
Где программируемая логика выигрывает
- Автоматы. Как в примерах выше: ПЛИС естественно вписывается в любой синхронный автомат, и нет смысла городить ряд D-триггеров с россыпью логики, когда один недорогой корпус делает то же самое.
- «Клей». В любой большой схеме найдутся клубки вентилей, инверторов и триггеров между крупными узлами; их пренебрежительно называют связующей логикой («клеем», glue logic). ПЛИС обычно сокращает число корпусов в 4 раза и больше, а схема становится понятнее. Вентилей в ПЛИС много, поэтому всю логику можно поставить перед регистрами — тогда выходы строго синхронны, — вместо того чтобы комбинировать выходы регистров вентилями, после чего выходы меняются не одновременно (рисунок ниже).
- Гибкость. Окончательная логика прибора часто неясна, а «поиграть» с макетом нужно уже сейчас. ПЛИС перепрограммируется без перемонтажа — схема становится похожа на программу.
- Варианты прибора. На одной и той же плате можно выпускать несколько версий изделия, по-разному прошив ПЛИС: например, компьютер с памятью 256К или 1М, где меняется только одна микросхема.
- Разработка и склад. Проект делается быстрее (если вы хорошо ориентируетесь в теме), а на складе держат несколько типов ПЛИС вместо дюжин типов микросхем средней интеграции. Две GALGAL (generic array logic, Lattice) — электрически стираемая КМОП-ПМЛ с макроячейками; GAL16V8 имитирует любую 20-выводную ПМЛ. (generic array logic) с программируемой архитектурой заменяют целую линейку ПМЛ: 20-выводная GAL16V8 и 24-выводная GAL20V8 имитируют каждая по 21 стандартной ПМЛ, и даже «гибриды» вроде нечётного числа регистров.
- Выводы, которые бывают и входами. Выходы на три состояния заведены внутри кристалла в матрицу И, поэтому их можно использовать как входы. У 16L8 в матрицу входят 16 сигналов (каждый в прямом и инверсном виде): 10 — с входных выводов и 6 — обратные связи с выходов на три состояния. Эти 6 выводов можно сделать постоянными входами (навсегда запретив выход: терм управления третьим состоянием = 0) или двунаправленнымиДвунаправленный ключ пропускает сигнал в обе стороны — как механический выключатель: исток и сток ПТ взаимозаменяемы., управляя третьим состоянием логической переменной.
Где поставить логику: а — в ПЛИС всё вычисляется до регистров, и выходы меняются строго вместе; б — на россыпи вентили часто стоят после регистров, и выходы «расползаются» по задержкам.
Потомки ПМЛ: GAL, СПЛИС, вентильные матрицы
Самая гибкая программируемая логика — стираемые КМОП-потомки ПМЛ фирм Lattice, VTI, Altera и других. GAL фирмы Lattice стирается электрически, так что один и тот же кристалл можно прошивать много раз. Главное же новшество — программируются сами выходные структуры, макроячейкиМакроячейка — программируемая выходная структура GAL/СПЛИС: регистр или обход, полярность, третье состояние и источник обратной связи задаются при программировании.. Каждый выход может быть регистровым или комбинационным, прямым или инверсным; программируются управление третьим состоянием и источник обратной связи (до буфера, после него, с соседнего вывода). Поэтому одна GAL16V8 подменяет любую обычную 20-выводную ПМЛ, а GAL20V8 — любую 24-выводную, и перечень комплектующих остаётся коротким.
Что здесь что (6)
- ИЛИ термов. сумма произведений из матрицы И
- Исключающее ИЛИ. программируемая полярность: второй вход 0 — прямой выход, 1 — инверсный
- D-триггер. регистровый вариант выхода
- MUX «комб./рег.». выбирает: выход с регистра или в обход него
- Управление третьим состоянием. выход можно включить, выключить или сделать двунаправленным
- MUX обратной связи. что вернуть в матрицу И: регистр, вывод или соседнюю ячейку
Altera пошла другим путём: её КМОП-логика стирается ультрафиолетом, как СППЗУ, через окно из кварцевого стекла над кристаллом, — это СПЛИССПЛИС — стираемая ультрафиолетом КМОП-ПЛИС (Altera EP320 и др.): кварцевое окно над кристаллом, как у СППЗУ. (стираемые ПЛИС). Самая маленькая, EP320, тоже имеет выходные макроячейки и имитирует все 20-выводные ПМЛ, как GAL16V8, но в отличие от биполярных ПМЛ потребляет совсем немного. Есть и более крупные СПЛИС, программируемые микросеквенсоры и т. п.; стираемую КМОП-логику с макроячейками делают также Cypress и VTI.
Совсем иначе устроены вентильные матрицы Xilinx: огромное число конфигурируемых логических блоков, а схема их соединений хранится во внутреннем (энергозависимом) ОЗУ кристалла. После включения питания конфигурация загружается из внешнего ПЗУПостоянное запоминающее устройство: для каждого адреса хранит слово (обычно 8 бит); реализует любую таблицу истинности, если хватает адресных входов. или от микропроцессора — по сути, кристалл каждый раз заново «прошивается».
| ПМЛ / GAL | СПЛИС (Altera) | Вентильные матрицы Xilinx | |
|---|---|---|---|
| Стирание | биполярные — нет; GAL — электрически | ультрафиолетом (кварцевое окно) | конфигурация в ОЗУ — грузится при включении |
| Структура | матрица И-ИЛИ + макроячейки | макроячейки, микросеквенсоры | много конфигурируемых логических блоков |
| Пример | GAL16V8, GAL20V8 | EP320 | — |
Скорость и потребление
Первые биполярные ПМЛ (Monolithic Memories, затем National и AMD) много потребляли при скромной скорости, а самые быстрые требовали уйму мощности. КМОП-приборы гораздо лучше по обоим параметрам:
| Прибор | Технология | Задержка | Ток потребления |
|---|---|---|---|
| 16L8 / 16R8 (первые) | биполярная | 40 нс | ≈ 200 мА |
| ПМЛ «половинной мощности» | биполярная | 35 нс | 90 мА |
| 16R8D / 16P8-7 (AMD) | биполярная | 10 / 7,5 нс | до 180 мА |
| GAL20V8-15Q («¼ мощности») | КМОП | 15 нс | 45 мА |
| EP320-1 (Altera) | КМОП | 25 нс | 5 мА |
Для приборов на батареях ещё важнее, что кристаллы Altera (и ПМЛ серии Z фирмы AMD) умеют уходить в резервный режим с практически нулевым потреблением. Направление развития очевидно: быстрее и экономнее, и репутация программируемой логики как «пожирателя ватт» уходит в прошлое.
Автомат управления шаговым двигателем собран на регистровой ПЛИС: задержка «такт → выход регистра» 8 нс, прохождение обратной связи через матрицу И-ИЛИ до D-входа 10 нс, время установки регистра 7 нс. Какова наибольшая частота такта? В старой версии прибора стояли шесть биполярных ПМЛ по 180 мА; какая мощность от источника 5 В уходила на них и какая уйдёт на шесть КМОП-GAL по 45 мА?
Решение
Следующее состояние вычисляется из текущего: выход регистра → матрица → D-вход к следующему фронту. нс, МГц.
Мощность: Вт против Вт — вчетверо меньше (отсюда и название «¼ мощности»). Для сравнения, шесть EP320 по 5 мА взяли бы всего 0,15 Вт.
Выбросы: подвох суммы произведений
Вернёмся к мультиплексору. Возьмём самый простой, на два входа: . Пусть оба информационных входа A и B равны 1. Тогда выход должен быть 1 при любом S — и логически он им и остаётся. Но физически получается из S через инвертор и запаздывает на его задержку. Когда S падает из 1 в 0, произведение гаснет сразу, а загорается лишь спустя задержку инвертора. В этот промежуток оба произведения равны нулю, и на выходе проскакивает короткий нулевой импульс — выброс (glitch). Это проявление логических состязанийГонка сигналов: два сигнала, вызванные одним событием, приходят на вентиль с разной задержкой, и на выходе возникает всплеск.: сигнал идёт к выходу по двум путям с разной задержкой.
Вентильный эквивалент 2-входового мультиплексора: при A = B = 1 и спаде S возможен выброс «в нуль».
Добавлен избыточный термИзбыточный терм — произведение, не меняющее функцию (консенсус двух других), но удерживающее выход при переходе между ними; минимизаторы его выбрасывают. A·B (выделен): он держит выход, пока инвертор переключается.
Лекарство на первый взгляд странное: добавить произведение , которое логически ничего не меняет. При A = B = 1 оно держит выход в единице, что бы ни происходило с S и его инверсией. Такой терм называют избыточным, или консенсусомКонсенсус термов и — терм ; добавление его не меняет функцию: . двух других.
Где искать такие места в больших выражениях? Удобнее всего на карте КарноТаблица истинности, разложенная по двум осям в порядке кода Грея (00, 01, 11, 10): соседние клетки отличаются одной переменной, и группы единиц дают простые произведения.. Каждая группа на карте — одно произведение суммы. Выход истинен, пока истинна хоть одна группа; но переход из одной группы в соседнюю может дать выброс, если переменные первой группы «уходят» раньше, чем устанавливаются переменные второй. Такие места называют логическими рисками.
| AB = 00 | 01 | 11 | 10 | |
|---|---|---|---|---|
| S = 0 | 0 | 1 | 1 | 0 |
| S = 1 | 0 | 0 | 1 | 1 |
| Статический выброс | Динамический выброс | |
|---|---|---|
| Что должно быть | выход не меняется | выход делает один переход |
| Что происходит | короткий импульс 1 → 0 → 1 (или 0 → 1 → 0) | выход переключается несколько раз |
| Лекарство | избыточный терм-консенсус | избегать внутренних гонок в структуре |
В нашем примере выброс статический: выход должен был стоять на месте. Бывают и динамические: выход, который должен переключиться один раз, переключается несколько раз подряд. В программируемой логике внутренних гонок такого рода можно избежать, но средства проектирования — PALASM, ABEL, CUPL — за вас этого не сделают.
Функция реализована суммой произведений, а инверсия A получается через инвертор с задержкой. Покажите, при каком изменении входов возможен статический выброс, и докажите, что терм устраняет выбросы при изменении любой одной переменной, не меняя функции.
Решение
Функция не меняется (теорема о консенсусе):
Где выброс. При B = C = 1 функция равна 1 при любом A: при A = 0 её держит , при A = 1 — . Когда A меняется 1 → 0, терм гаснет сразу, а загорается лишь после задержки инвертора: на это время F = 0 — выброс «в нуль». При подъёме A гореть успевают оба терма, выброса нет.
Почему других выбросов нет. Выброс при изменении одной переменной возможен, только если две соседние единицы карты, отличающиеся этой переменной, покрыты разными термами. Изменение B или C: термы, содержащие их, не содержат их дополнений, поэтому каждый терм либо остаётся постоянным, либо функция действительно меняется. Единственная пара соседних единиц в разных термах — клетки B = C = 1, A = 0/1, и терм покрывает обе, оставаясь равным 1 весь переход. От одновременного изменения нескольких переменных («функциональных» выбросов) избыточные термы не спасают.
Сколько избыточных термов надо добавить к мультиплексору на 16 входов (4 адресных бита), чтобы при смене любого одного адресного бита не было выбросов? И сколько всего произведений будет в сумме у 8-входового мультиплексора (основные плюс избыточные)?
Решение
Выброс возможен, когда меняется один адресный бит, а оба информационных входа, между которыми идёт переключение, равны 1. Значит, на каждую пару адресов, отличающихся одним битом, нужен свой консенсус: например, для адресов 0 и 1 у 4-входового мультиплексора — . Таких пар столько, сколько рёбер у n-мерного куба: . Для : терма. Для : избыточных плюс 8 основных — 20 произведений. В ПМЛ с 7–8 произведениями на выход это уже не помещается; кроме того, при одновременной смене двух адресных битов выброс всё равно возможен — надёжнее защёлкивать выход регистром, как в нашей ПМЛ-реализации.
8.6.5Большие последовательностные микросхемы
- FIFOFIFO («первым вошёл — первым вышел») — очередь слов с раздельными тактами записи и чтения; сглаживает пачки данных. — очередь с раздельными тактами записи и чтения: сглаживает пачки данных, но не спасает, если приёмник в среднем медленнее.
- Умножитель частоты даёт среднюю частоту — дробные коэффициенты, но импульсы неравномерны.
- БИС: частотомеры, вольтметры, синтезаторы, микропроцессоры и однокристальные микроконтроллеры.
Большие (БИС) и сверхбольшие (СБИС — более тысячи вентилей на кристалле) микросхемы делают в одном корпусе довольно сложные устройства. Возьмём несколько показательных примеров.
FIFO — «первым вошёл, первым вышел»
Представьте склад с двумя воротами. В одни ворота грузовики привозят коробки в своём темпе, из других их забирают в своём. Кладовщик ведёт учёт и выдаёт коробки строго в порядке поступления. Привезённая коробка не ждёт, пока её «протолкнут» следующие: она сразу проходит через склад и встаёт в очередь у ворот выдачи. Это и есть FIFO.
По виду она похожа на регистр сдвига — данные выходят в том же порядке, в каком вошли. Но в регистре сдвига слово продвигается только тогда, когда приходят новые биты и такты, а в FIFO оно «проваливается» к выходу само, с малой задержкой (её называют временем пролёта, обычно 1–25 мкс), и ждёт там. Записью и чтением управляют раздельные тактовые сигналы, а микросхема сама помнит, что записано и что уже прочитано.
Что здесь что (6)
- Источник. пишет слова в своём темпе — своим тактом записи
- Вход FIFO. слово сразу «проваливается» по очереди к выходу
- Время пролёта. сколько слово идёт к выходу: от нуля (IDT7202) до 1–25 мкс
- Очередь у выхода. слова ждут в порядке поступления
- Приёмник. забирает слова своим тактом чтения, когда готов
- Флаги «пусто/полно». FIFO сама помнит, что записано и что прочитано
FIFO нужна там, где данные приходят асинхронно и пачками: буфер клавиатуры или накопителя перед компьютером, буфер строки видеокамеры перед медленным процессором. Данные не теряются, пока приёмник занят, — если только очередь не заполнилась до конца.
| 74F433 | IDT7202 | |
|---|---|---|
| Технология | ТТЛТранзисторно-транзисторная логика: биполярное семейство, питание +5 В, порог ≈1,3 В, заметный ток покоя. Серии LS, ALS, AS, F. | КМОП |
| Организация | 64 слова × 4 бита | 4096 × 9 |
| Частота | 10 МГц | 15 МГц |
| Время пролёта | 4 мкс | нулевое |
Линейный датчик изображения выдаёт строку из 2048 пикселей с частотой 10 МГц, затем пауза. Микроконтроллер читает пиксели из FIFO непрерывно с частотой 4 МГц. Какой минимальной ёмкости нужна FIFO (слов, с округлением вверх) и какой должна быть пауза между строками, чтобы очередь не росла от строки к строке?
Решение
Строка длится мкс. За это время микроконтроллер заберёт слова, так что к концу строки в FIFO останется — нужно не меньше 1229 слов (на практике берут ближайшую стандартную ёмкость, 2048). Остаток читается за мкс; пауза должна быть не короче, иначе к началу новой строки очередь не опустеет. Проверка «в среднем успевает»: слова/мкс — ровно на пределе.
Умножитель частоты (rate multiplier)
Счётчик по модулю n делит частоту только на целое число. А если нужно 0,3 от тактовой? Умножитель частоты выдаёт последовательность импульсов, средняя частота которой связана с тактовой произвольной рациональной дробью. Трёхдекадный двоично-десятичный умножитель, например, даёт входной частоты, где — трёхзначное число на трёх двоично-десятичных входах.
| Счётчик по модулю n | Умножитель частоты | |
|---|---|---|
| Коэффициент | только (целое n) | любая дробь (или ) |
| Пример: | нельзя | можно: nnn = 300 |
| Равномерность импульсов | строго периодические | неравномерные: задана лишь средняя частота |
| Микросхемы | '160–'163, '40103 | '97 (6 разр., двоичный), '167 (BCD) |
Тактовая частота 2 МГц. Нужны две частоты: 400 кГц и 700 кГц. Какую из них можно получить счётчиком по модулю n, а какую — только умножителем частоты (в среднем)?
Решение
Счётчик даёт : 2 МГц/5 = 400 кГц. Для 700 кГц понадобилось бы n ≈ 2,86 — не целое. Умножитель с выдаёт 350 импульсов на каждые 1000 тактов — в среднем 700 кГц, но интервалы между импульсами то 2, то 3 периода такта (1 или 1,5 мкс), распределённые по-разному у разных микросхем.
Другие большие микросхемы
Если задача массовая, почти наверняка для неё уже есть готовая БИС — и с ней схема сокращается до нескольких внешних деталей.
- Частотомеры. У Intersil хороший набор счётчиков-частотомеров на кристалле: блокировка входа для точного отсчёта интервалов, до восьми декад двоично-десятичного счёта, формирователи для индикатора.
- Цифровые вольтметры: АЦП с синхронизацией, счётчик и управление индикатором в одном корпусе. Пример — экономичный 3½-разрядный ICL7136 и 4½-разрядный ICL7129; оба работают с жидкокристаллическим 7-сегментным индикатором от одной батареи 9 В. Внутри большинства недорогих мультиметров — именно такие кристаллы.
- Специального назначения: синтезаторы частотыСинтезатор частоты — ФАПЧ с программируемыми делителями: выход меняется с шагом . для радиосвязи; узлы цифровой обработки сигналов (умножители с накоплением, цифровые фильтры, корреляторы, арифметические устройства); передача данных (универсальные асинхронные приёмопередатчики, модемы, сетевые интерфейсы, шифраторы и дешифраторы, преобразователи последовательных форматов). Обычно они работают в паре с микропроцессором, а многие — только с ним.
- Массовый рынок: часы, таймеры, кодовые замки, калькуляторы, детекторы дыма, телефоны, музыкальные синтезаторы, генераторы ритма и аккомпанемента, синтез (и отчасти распознавание) речи — отсюда «говорящие» лифты, автомобили и кухонные приборы. Огромный рынок открывает автомобильная электроника: управление двигателем, системы предотвращения столкновений.
- Микропроцессоры — главное «чудо» больших микросхем, компьютер на кристалле. На одном полюсе — мощные 32-разрядные 68020/030 и 80386/486 с предвыборкой команд, виртуальной памятью и арифметическими сопроцессорами, а также кристаллы вроде MicroVAX, повторяющие архитектуру больших машин. На другом — однокристальные микроконтроллеры с памятью и вводом-выводом на борту, работающие самостоятельно. Типичный пример — Toshiba TLCS-90: маломощный КМОП-контроллер с 6-канальным 8-разрядным АЦП, таймерами, ОЗУ и ПЗУ, 20 двунаправленными линиями ввода-вывода, последовательным портом и двумя портами управления шаговыми двигателями. Он рассчитан больше на управление, чем на вычисления, — как и сегодняшние микроконтроллеры в бытовой технике.
Вычислительная мощность и объём памяти растут поразительно быстро: в течение 1980-х ёмкость одного кристалла памяти выросла с 16 Кбит до 1 Мбит, а цена бита падала на порядок каждые несколько лет. Это и есть знаменитая «кривая обучения» полупроводниковой промышленности.