
シフトレジスタは、フリップフロップをカスケード接続したデジタル回路の一種で、あるフリップフロップの出力が次のフリップフロップの入力に接続されます。これらのフリップフロップは単一のクロック信号を共有し、この信号によってシステムに格納されたデータが1つの場所から次の場所へと移動します。最後のフリップフロップを最初のフリップフロップに接続することで、データはシフトレジスタ内で長期間循環することができ、この構成でコンピュータメモリとして使用され、 1960年代後半から1970年代初頭にかけて遅延線メモリシステムに取って代わりました。
ほとんどの場合、複数の並列シフトレジスタを使用して、「ビットアレイ」と呼ばれるより大きなメモリプールを構築します。データはアレイに格納され、並列に読み出されます。多くの場合、コンピュータワードとして読み出されますが、各ビットはシフトレジスタに直列に格納されます。ビットアレイの設計には本質的なトレードオフがあります。フリップフロップを複数並べると、1つのシフタでより多くのビットを格納できますが、データを読み出す前にすべてのシフタを通してデータを転送するために、より多くのクロックサイクルが必要になります。
シフトレジスタは、並列入力とシリアル入力、およびシリアル出力の両方を持つことができます。これらは通常、「シリアル入力、並列出力」(SIPO)または「並列入力、シリアル出力」(PISO)として構成されます。シリアル入力と並列入力の両方を持つタイプや、シリアル出力と並列出力の両方を持つタイプもあります。また、「双方向」シフトレジスタもあり、L → R または R → L の両方向にシフトできます。シフトレジスタのシリアル入力とシリアル出力は接続されて、循環シフトレジスタを形成します。PIPO レジスタ (並列入力、並列出力) は単なるD 型レジスタであり、シフトレジスタではありませんが、非常に高速で、単一のクロックパルス内で出力が得られます。「ユニバーサル」シフトレジスタは、双方向のシリアル入力とシリアル出力、および並列入力と並列出力を提供します。

シリアル入力・シリアル出力シフトレジスタでは、格納するデータはシリアルデータ入力(SD IN )に1ビットずつ入力されます。クロックの立ち上がりエッジ(論理レベルが低から高に遷移するたび)に、入力データは最初のフリップフロップに格納され、各フリップフロップの出力(Q)は右隣のフリップフロップに格納されます。これにより、新しいビットが入力され、他のすべてのビットが1ビット右にシフトされます。最も右のフリップフロップにシフトされたデータビットがシリアルデータ出力(SD OUT)に出力されます。最も右のフリップフロップに以前格納されていたビットは上書きされ、失われます。
データ入力に1,0,1,1,0,0,0,0(この順序)が与えられ、各ビットにクロックパルスが印加されると、この結果が得られます。右端の列は最も右にあるフリップフロップの出力ピンに対応し、以下同様です。
したがって、全体の値のシリアル出力は00010110となります。データの入力が継続された場合、入力された値(10110000)と全く同じ値が得られますが、4クロックサイクル分オフセットされます。この構成は、ハードウェアにおけるキューの等価物です。また、いつでもリセット(R)ピンをハイにすることで、レジスタ全体をゼロに設定できます。

この構成では、シリアル形式からパラレル形式への変換が可能です。データ入力は、上記のSISOセクションで説明したようにシリアルです。データがクロック入力されると、各出力で同時に読み出すことも、シフトアウトすることもできます。
この構成では、各フリップフロップはエッジトリガ方式です。すべてのフリップフロップは指定されたクロック周波数で動作します。各入力ビットはNクロックサイクル後にN番目の出力に到達し、並列出力となります。
シリアルロード処理中にパラレル出力が変化しないようにするには、ラッチ付きまたはバッファ付き出力を使用するのが望ましい。ラッチ付きシフトレジスタ( 74595など)では、まずシリアルデータが内部バッファレジスタにロードされ、ロード信号を受信するとバッファレジスタの状態が出力レジスタにコピーされる。一般的に、シリアル入力/パラレル出力シフトレジスタの実用的な用途は、1本のワイヤ上のシリアル形式のデータを、複数のワイヤ上のパラレル形式に変換することである。
この構成では、D1~D4ラインへのデータ入力は並列形式で行われます。レジスタにデータを書き込むには、書き込み/シフト制御線をLOWに保持する必要があります。データをシフトするには、W/S制御線をHIGHにし、レジスタにクロックを供給します。この構成は、D1をデータ入力とするPISOシフトレジスタとして機能します。ただし、クロックサイクル数がデータ列の長さを超えない限り、データ出力Qは、並列に読み出されたデータが順番に出力されます。

以下の動画は、シフトレジスタの内部状態を含めた書き込み/シフトシーケンスを示しています。


シフトレジスタの最も一般的な用途の一つは、シリアルインターフェースとパラレルインターフェース間の変換です。
シリアル入力シリアル出力シフトレジスタは、単純な遅延回路として使用できます。[ 1 ]
複数の双方向シフトレジスタを並列に接続することで、ハードウェアスタックを実装できます。
シフトレジスタは、利用可能な汎用入出力ピンよりも多くのピンが必要な場合に、マイクロコントローラによく接続されます。場合によっては、デイジーチェーン構成のシリアルペリフェラルインターフェースを介して接続され、並列I/Oよりも速度は遅いものの、わずか2~4本のピンで任意の数のバイナリデバイスにアクセスできます。
出力数を増やすために、SIPOシフトレジスタが使用されます。シフトレジスタの並列出力と、それらすべてのデバイスの目標状態は、単一のシリアル接続を使用してマイクロコントローラから出力できます。
入力数を増やすには、PISOシフトレジスタが使用されます。各バイナリ入力(ボタンやより複雑な回路など)はシフトレジスタのパラレル入力に接続され、データはシリアル通信でマイクロコントローラに送り返されます。
シフトレジスタはパルス拡張器として使用できます。単安定マルチバイブレータと比較すると、タイミングは部品の値に依存しませんが、外部クロックが必要であり、タイミング精度はこのクロックの粒度によって制限されます。
初期のコンピュータでは、データ処理にシフトレジスタが使用されていました。加算する2つの数値は2つのシフトレジスタに格納され、算術論理演算ユニット(ALU)にクロック出力され、その結果はシフトレジスタの1つ(アキュムレータ)の入力にフィードバックされました。このアキュムレータの入力は、2進数の加算では同じサイズか1ビット長い結果しか得られないため、1ビット長くなっていました。
多くのプログラミング言語には、レジスタ内のデータを「右シフト」および「左シフト」するためのビット演算が含まれており、これはシフトされた各桁ごとに実質的に2で割ったり2で掛けたりする処理です。
1970年代初頭に製造された一部のデバイスでは、非常に大きなシリアル入力シリアル出力シフトレジスタ(数千ビット)が、以前の遅延線メモリと同様の方法で使用されていました。シフトレジスタは多くのピンやアドレス復号ロジックを必要としないため、当時はランダムアクセスメモリよりもはるかに安価でした。[ 2 ]このようなシフトレジスタメモリは、循環メモリと呼ばれることもありました。
例えば、Datapoint 3300 は、 6 ビットの大文字文字25行72列の端末表示を54 個の 200 ビットシフトレジスタ (9 パックの 6 トラックに配置) を使用して格納し、1800 文字を格納しました。シフトレジスタの設計により、表示出力を一時停止して 1 行の文字をスキップするだけで、端末表示をスクロールすることができました。 [ 3 ] Apple Iの端末でも同様の設計が使用されました。[ 4 ]
シフトレジスタの最初の既知の例の 1 つは、1944 年に製造された暗号解読機Mark 2 Colossusにありました。これは真空管とサイラトロンで構成された 6 段の装置でした。[ 5 ]シフトレジスタは、1940 年代後半にプリンストン高等研究所のジョン・フォン・ノイマンらが製造したIAS マシンにも使用されていました。シフトレジスタは、ゼネラル・インストゥルメントで働いていたフランク・ワンラス[ 6 ]とケント・スミス[ 7 ]による初期の特許からもわかるように、1960 年代に集積回路に取り入れられました。