**要点:**シフトレジスタは、各段の出力を次段の入力へつないだDフリップフロップの連鎖です。クロックエッジごとに、すべてのビットが1つ隣へ移動します。構成にはSISO、SIPO(シリアルからパラレルへ。74HC595のLEDドライバで使用)、PISO(パラレルからシリアルへ。UART送信器で使用)、PIPOがあります。
シフトレジスタは、クロックサイクルごとに1ビットずつデータをハードウェア内で移動させます。シリアル転送とパラレル記憶をつなぐ橋渡しです。UART、LEDドライバ、シリアライザ、デシリアライザ、一部のプロセッサのシフト用データパスには関連する構造がありますが、高性能なシフタでは組合せ回路のバレルシフタネットワークを用いることもあります。
シフトレジスタとは何か?
シフトレジスタの本質は、同期式の順序回路です。通常はD_FLIP_FLOPを数珠つなぎにし、「バケツリレー」のように接続して構成します。連鎖の各段は、ちょうど1ビットのデータを記憶します。クロックパルスが到来すると、レジスタ内の全ビットは列車の乗客が一席ずつずれるように、右(または左)へ1段移動します。

digisim.ioのSHIFT_REGISTERコンポーネントはこの複雑さを抽象化していますが、個別のD_FLIP_FLOPから組み立てると、伝搬の様子をもっともはっきり確認できます。
数学的基礎
シフトレジスタの1段の振る舞いは、D_FLIP_FLOPの特性方程式で表されます。
多段のシフトレジスタでは、第段の入力は第段の出力に接続されます。したがって、時刻におけるレジスタ全体の状態は次のように記述できます。
この単純な関係によって、データはハードウェアの中を「流れて」いきます。
データ移動の4つの形
シフトレジスタはすべて同じではありません。データをどう入力し、どう出力するかにより、主に4つの型に分類されます。用途に適した構成を選ぶには、この違いを理解することが重要です。
1. SISO:シリアル入力、シリアル出力
**入力:**クロックサイクルごとに1ビット。**出力:**クロックサイクルごとに1ビット(遅延あり)。
SISOはもっとも単純な形です。データは一度に1ビットずつ入り、反対端から一度に1ビットずつ出ます。これはデジタルのサイクル遅延として働きます。4ビットのSISOレジスタなら、今入力したビットは4回の有効クロックエッジの後に最終段の出力に現れます。このため、SISOレジスタは、すでに同期している制御ストリームやデータストリームの位置合わせに役立ちます。ただし、汎用的なシフトレジスタだけでクロックドメイン間の転送を完全に解決できるわけではありません。
2. SIPO:シリアル入力、パラレル出力
**入力:**クロックサイクルごとに1ビット。**出力:**全ビットを同時に利用可能。
SIPOは「拡張」のための構成です。シリアルのビット列を入力し、レジスタが満たされると、すべての出力()を同時に読み取れます。シリアル入力・パラレル出力のデバイスは、少ないコントローラピンで複数の表示器を制御するなど、デジタル出力の拡張によく使われます。後述する74HC595 ICは、シフトレジスタと独立した出力保持レジスタを組み合わせています。
3. PISO:パラレル入力、シリアル出力
**入力:**全ビットを同時にロード。**出力:**クロックサイクルごとに1ビット。
PISOはSIPOと逆の働きをします。データバスからの8ビットのようなデータ「ワード」全体を受け取り、それを個々のビットからなるストリームへシリアル化します。UART送信器にはこの基本機能があり、その周囲にフレーミング、ボーレート、パリティ、状態、バッファリングのロジックが配置されています。
4. PIPO:パラレル入力、パラレル出力
**入力:**全ビットを同時にロード。**出力:**全ビットを同時に利用可能。
PIPOはデータをパラレルにロードし、パラレルに出力できます。単体では、クロックエッジでワードを取り込む標準的なレジスタとして振る舞います。「ユニバーサル」シフトレジスタでは、制御信号により選択するパラレルロードと左右シフトのモードを組み合わせます。オーバーフローのない符号なし値では、1ビットの論理左シフトは2倍に相当し、論理右シフトは2による切り捨て除算に相当します。符号付き演算とオーバーフローには、さらに注意が必要です。

技術仕様:4ビットSIPOの真理値表
4ビットSIPO(シリアル入力、パラレル出力)が、4クロックサイクルでどう振る舞うかを見てみましょう。右端のビットから始めて、2進数列をシフト入力するとします。
| クロックパルス | シリアル入力() | ||||
|---|---|---|---|---|---|
| 初期状態 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | |
| 1 | 1 | 1 | 0 | 0 | |
| 0 | 0 | 1 | 1 | 0 | |
| 1 | 1 | 0 | 1 | 1 |
で入力された「1」が、から、を経て、最後にへ移動したことに注目してください。これが実際の「シフト」です。
よくある落とし穴:タイミングと伝搬遅延
すべての段は同じアクティブエッジで入力をサンプリングします。フリップフロップはクロックからQへの遅延が経過するまで出力を変えないため、前に記憶されていた値は1段先へ進みます。正しく動作させるには、最大遅延に対するセットアップチェックと、最小遅延に対するホールドチェックの両方を満たさなければなりません。
重要なパラメータは3つあります。
- **セットアップ時間():**データがクロックエッジの前に安定していなければならない最小時間。
- **ホールド時間():**データがクロックエッジの後も安定していなければならない最小時間。
- **クロックからQへの遅延():**アクティブなクロックエッジから、データを送り出す段の出力が変化するまでの時間。
段どうしを直接接続する場合、ホールド条件は簡略化すると次のようになります。
ここで、正のはクロックスキューの解説で用いる符号規約において、キャプチャ側のクロックが遅く到着することを意味します。セットアップには、最大のクロックからQへの遅延と配線遅延を用います。静的タイミング解析は、対象デバイスで規定された遅延を使ってこれらを検査します。機能的な波形ビューアだけでは、物理的なタイミングクロージャを確認できません。根本となる制約については、セットアップ、ホールド、メタスタビリティを参照してください。
OSCILLOSCOPE_8CHで動作を検証する
SHIFT_REGISTER_8BITを構築するとき、OUTPUT_LIGHTコンポーネントを見るだけでは不十分です。高速クロックでは点滅が速すぎて、人の目では追えません。
回路を本当に検証するには、次の手順を試してください。
- CLOCKをOSCILLOSCOPE_8CHのチャンネル1へ接続します。
- シリアル入力をチャンネル2へ接続します。
- パラレル出力(から)を残りのチャンネルへ接続します。
シミュレーションを実行すると、波形には階段状のパターンが現れるはずです。サンプリングされたシリアルビットは、1回のアクティブエッジの後に最初の段に現れ、その後の各エッジで1段ずつ進みます。この表示を使えば、ビット順、イネーブル、リセット、サイクル数に関する論理的な誤りを見つけられます。モデルに規定済みの遅延が含まれない限り、波形の見かけ上の位置関係は、実機ハードウェアのセットアップ/ホールドタイミングを証明も反証もしません。
実世界での応用:1978年から今日まで
シフトレジスタは単なる学習用の題材ではありません。エレクトロニクス産業を支える働き者です。
1. 74HC595とLED制御
74HC595は、独立したストレージレジスタを備える8ビットのシリアル入力・パラレル出力シフトレジスタです。コントローラはデータをシフトしてから、ラッチ信号によって8本すべての出力ビットを同時に更新できます。デバイスはカスケード接続できますが、負荷の数と種類は出力電流、パッケージ全体の電流、クロックレート、信号完全性、リフレッシュ要件によって制限されます。大規模なLEDシステムには、無制限の直接拡張ではなく、用途に合ったドライバが必要です。
2. Intel 8086とUART/USART
Intel 8086にはUARTが内蔵されていませんでした。システムでは、Intel 8251A USARTなどの周辺機器を組み合わせることができました。概念的には、プロセッサが1バイトをパラレルに周辺機器へ書き込み、送信ロジックがフレーム化してビットをシリアル線へ送り出します。受信ロジックはシリアルフレームをサンプリングし、復元したバイトをパラレルバス上で利用可能にします。現代のUART実装では、基本となるシフト操作の周囲に、ボーレート生成、スタート/ストップビット処理、ステータスフラグ、バッファリングが追加されます。
3. 乗算と除算
2進数を左へ1桁シフトすることは、数学的には2倍することと等しいのをご存じですか?
現代のALU(算術論理演算装置)は、高速シフトレジスタを使用して、こうした演算を1クロックサイクルで実行します。
digisim.ioで最初のシフトレジスタを作る
さっそく手を動かしてみましょう。次の手順で4ビットSIPOレジスタを作れます。
- **段を配置する:**キャンバスにD_FLIP_FLOPコンポーネントを4つ置きます。
- **データを連結する:**最初のフリップフロップの出力を、2番目の入力へつなぎます。すべての段で繰り返します。
- **共通クロック:**CLOCKコンポーネントを置き、4つのフリップフロップすべてのクロック入力に接続します。ここが重要です。すべて同期していなければなりません。
- **入力と出力:**INPUT_SWITCHを最初のフリップフロップの入力に接続します。各出力にはOUTPUT_LIGHTを接続します。
- **SimCastの利点:**SimCast機能を使って、回路の動作を記録します。入力スイッチを切り替え、クロックをパルスし、「1」がライトの中を移動する様子を観察しましょう。
まとめ
シフトレジスタは、単純な部品の組み合わせから複雑な振る舞いが生まれることを示す格好の例です。わずかな数のフリップフロップを連結するだけで、データ形式の変換、信号の遅延、演算が可能になります。
制御スイッチに基づいて左右の両方へシフトできる4ビット双方向シフトレジスタを作ってみましょう。SHIFT_REGISTERと、各段のデータ入力に置くマルチプレクサを組み合わせます。
SISO、SIPO、PISO、PIPOのモードを続けて読むか、この学習モデルの記憶要素であるDフリップフロップのコンポーネントリファレンスを開いてください。


