Сдвиговый регистр — это тип цифровой схемы, использующей каскад триггеров , где выход одного триггера подключен к входу следующего. Они совместно используют один тактовый сигнал , который заставляет данные, хранящиеся в системе, перемещаться из одного места в другое. Подключив последний триггер обратно к первому, данные могут циклически перемещаться внутри сдвигающих устройств в течение длительных периодов, и в этой конфигурации они использовались в качестве компьютерной памяти , вытесняя системы памяти с линиями задержки в конце 1960-х и начале 1970-х годов.
В большинстве случаев несколько параллельных регистров сдвига использовались для создания большего пула памяти, известного как « битовый массив ». Данные сохранялись в массиве и считывались обратно параллельно, часто как компьютерное слово , в то время как каждый бит сохранялся последовательно в регистрах сдвига. В конструкции битовых массивов есть неотъемлемый компромисс: размещение большего количества триггеров в ряд позволяет одному сдвигателю хранить больше бит, но требует больше тактовых циклов для проталкивания данных через все сдвигатели, прежде чем данные можно будет снова считать обратно.
Сдвиговые регистры могут иметь как параллельные , так и последовательные входы и выходы. Они часто конфигурируются как «последовательный вход, параллельный выход» (SIPO) или как «параллельный вход, последовательный выход» (PISO). Существуют также типы, которые имеют как последовательный, так и параллельный вход, и типы с последовательным и параллельным выходом. Существуют также «двунаправленные» сдвиговые регистры, которые позволяют сдвигать в обоих направлениях: L → R или R → L. Последовательный вход и последний выход сдвигового регистра также могут быть соединены для создания «циклического сдвигового регистра». Регистр PIPO (параллельный вход, параллельный выход) — это просто регистр D-типа , не являющийся сдвиговым регистром, но очень быстрый — выход выдается в течение одного тактового импульса. «Универсальный» сдвиговый регистр обеспечивает двунаправленный последовательный вход и последовательный выход, а также параллельный вход и параллельный выход.
Это простейший вид регистров сдвига. Строка данных представлена в "data in" и сдвигается вправо на одну ступень каждый раз, когда "data advance" становится высоким . При каждом смещении бит на самом левом уровне (т. е. "data in") сдвигается на выход первого триггера . Бит на самом правом уровне (т. е. "data out") сдвигается и теряется.
Данные сохраняются после каждого триггера на выходе "Q", поэтому в этой компоновке доступно четыре "слота" хранения, следовательно, это 4-битный регистр. Чтобы дать представление о схеме сдвига, представьте, что регистр содержит 0000 (поэтому все слоты хранения пусты). Поскольку "data in" представляет 1,0,1,1,0,0,0,0 (в таком порядке, с импульсом на "data advance" каждый раз — это называется тактированием или стробированием) регистру, это и есть результат. Правый столбец соответствует выходному контакту самого правого триггера и т. д.
Итак, последовательный выход всего регистра равен 00010110. Видно, что если бы данные продолжали поступать на вход, они бы получили ровно то, что было введено (10110000), но смещенное на четыре цикла "продвижения данных". Такое расположение является аппаратным эквивалентом очереди . Кроме того, в любой момент весь регистр можно сбросить до нуля, переведя выводы сброса (R) в высокий уровень.
Такая компоновка выполняет деструктивное считывание — каждый элемент данных теряется, как только он смещается из крайнего правого бита.
Эта конфигурация позволяет преобразовывать последовательный формат в параллельный. Ввод данных последовательный, как описано в разделе SISO выше. После того, как данные были синхронизированы, они могут быть либо считаны на каждом выходе одновременно, либо могут быть смещены.
В этой конфигурации каждый триггер срабатывает по фронту . Все триггеры работают на заданной тактовой частоте. Каждый входной бит проходит путь вниз к N-му выходу после N тактов, что приводит к параллельному выходу.
В случаях, когда параллельные выходы не должны изменяться в процессе последовательной загрузки, желательно использовать защелкивающийся или буферизированный выход. В защелкивающемся регистре сдвига (например, 74595 ) последовательные данные сначала загружаются во внутренний буферный регистр, затем при получении сигнала загрузки состояние буферного регистра копируется в набор выходных регистров. В общем, практическое применение последовательного входного/параллельного выходного регистра сдвига заключается в преобразовании данных из последовательного формата на одном проводе в параллельный формат на нескольких проводах.
Эта конфигурация имеет вход данных на линиях D1–D4 в параллельном формате, D1 является самым значимым битом. Для записи данных в регистр линия управления Write/Shift должна быть LOW. Для сдвига данных линия управления W/S переводится в HIGH, и регистры тактируются. Теперь эта компоновка действует как сдвиговый регистр PISO, а D1 — как вход данных. Однако, пока количество тактовых циклов не превышает длину строки данных, выход данных, Q, будет параллельными данными, считываемыми по порядку.
Анимация ниже показывает последовательность записи/сдвига, включая внутреннее состояние регистра сдвига.
Одним из наиболее распространенных применений регистра сдвига является преобразование между последовательными и параллельными интерфейсами.
Регистры сдвига с последовательным входом и последовательным выходом могут использоваться как простые схемы задержки. [1]
Несколько двунаправленных регистров сдвига также могут быть подключены параллельно для аппаратной реализации стека .
Сдвиговые регистры обычно подключаются к микроконтроллерам, когда требуется больше универсальных входных/выходных контактов, чем доступно, иногда через последовательный периферийный интерфейс в конфигурации последовательной цепи , что позволяет осуществлять доступ к любому количеству двоичных устройств, используя всего два-четыре контакта, хотя и медленнее, чем параллельный ввод/вывод.
Для большего количества выходов используются сдвиговые регистры SIPO. Параллельные выходы сдвигового регистра и желаемое состояние для всех этих устройств могут быть отправлены из микроконтроллера с помощью одного последовательного соединения.
Для большего количества входов используются сдвиговые регистры PISO. Каждый двоичный вход (например, кнопка или более сложная схема) подключается к параллельному входу сдвигового регистра, затем данные последовательно отправляются обратно в микроконтроллер.
Сдвиговые регистры также могут использоваться в качестве расширителей импульсов. По сравнению с моностабильными мультивибраторами , синхронизация не зависит от значений компонентов, но требует внешнего тактового генератора, а точность синхронизации ограничена гранулярностью этого тактового генератора. Примером такого расширителя импульсов является Ronja Twister , в котором пять сдвиговых регистров 74164 создают ядро логики синхронизации таким образом (схема).
В ранних компьютерах для обработки данных использовались регистры сдвига: два числа, которые нужно было сложить, хранились в двух регистрах сдвига и выводились в арифметико-логическое устройство (АЛУ), а результат подавался обратно на вход одного из регистров сдвига (аккумулятора), который был на один бит длиннее, поскольку двоичное сложение может дать только ответ того же размера или на один бит длиннее.
Многие компьютерные языки включают побитовые операции для «сдвига вправо» и «сдвига влево» данных в регистре, фактически выполняя деление на два или умножение на два для каждой сдвинутой позиции.
Очень большие последовательные регистры сдвига (размером в тысячи бит) использовались аналогично более ранней памяти с линией задержки в некоторых устройствах, построенных в начале 1970-х годов. Регистрам сдвига не нужно много выводов или логики декодирования адреса, поэтому они были намного дешевле, чем память с произвольным доступом в то время. [2] Такая память с регистром сдвига иногда называлась циркулирующей памятью .
Например, Datapoint 3300 хранил свой дисплей терминала из 25 строк по 72 столбца 6-битных символов верхнего регистра, используя 54 200-битных регистра сдвига (расположенных в 6 дорожек по 9 пакетов), обеспечивая хранение 1800 символов. Конструкция регистра сдвига означала, что прокрутка дисплея терминала могла быть выполнена простой приостановкой вывода дисплея для пропуска одной строки символов. [3] Похожая конструкция использовалась для терминала Apple I. [4]
Одним из первых известных примеров сдвигового регистра был Mark 2 Colossus , машина для взлома кодов, построенная в 1944 году. Это было шестиступенчатое устройство, построенное из электронных ламп и тиратронов . [5] Сдвиговой регистр также использовался в машине IAS , построенной Джоном фон Нейманом и другими в Институте перспективных исследований в конце 1940-х годов. Сдвиговые регистры появились в интегральных схемах в 1960-х годах, о чем свидетельствуют ранние патенты Фрэнка Уонласса [6] и Кента Смита [7], работавших в General Instrument .