クロックに合わせて記憶したビット列を1つずつ横にずらすレジスタ。
シフトレジスタとは、フリップフロップ(=1ビットを覚える部品)を直列に並べ、クロックの合図のたびに記憶したビット列を1つずつ横へずらす回路のことです。状態を覚えて動くので、順序回路の仲間です。
身近な例で考えると、バケツリレーに似ています。一列に並んだ人が、合図のたびに手元のバケツを隣へ手渡していくイメージです。新しいバケツは先頭から入り、列の端まで来たバケツは外へ出ていきます。
上のツールで▶ボタンを押すと、左から入力したビット 1 0 1 1 が、クロックのたびに隣のフリップフロップへ順々にずれていく様子を確認できます。
シフトレジスタの動きは、クロックの立ち上がり(=0から1に変わる瞬間)を合図に、全フリップフロップが一斉に隣の値を取り込むというものです。
1クロックでの動きは次の3つが同時に起こります。
・左端に入力:先頭のフリップフロップが、外からの入力 SI を取り込む
・中はずれる:各フリップフロップが、左隣が持っていた値を受け取る(全員が1つ右へずれる)
・右端から出力:いちばん右にあったビットは押し出され、外へ出力 SO される
たとえば [1, 0, 1, 1] の状態で左から 0 を入れると、右端の 1 が出ていき、全体は [0, 1, 0, 1] になります。各ビットが「ところてん」のように押し出されていくイメージです。クロックの合図でそろって動くのが、組合せ回路にはない順序回路ならではの特徴です。
シフトレジスタの代表的な使い道はシリアル(直列)とパラレル(並列)のデータ変換です。直列とは「1本の線で1ビットずつ順番に送る」形式、並列とは「複数の線で同時にまとめて送る」形式のことです。
おもな変換は次の2方向です。
・直列→並列(SIPO):1本ずつ届いたビットを順々にためて、4個のフリップフロップを同時に読むことで4ビットをまとめて取り出す
・並列→直列(PISO):4ビットをいっぺんに読み込み、クロックごとに1ビットずつ右端から送り出す
身近な例で考えると、1車線の道路と複数車線の道路をつなぐ合流・分流に似ています。配線の本数を減らしたい通信では「並列→直列」で1本にまとめて送り、受け取った側が「直列→並列」で元のまとまりに戻します。ほかにも、ビットを順にずらす性質を使って、データを 2 倍する乗算や時刻を刻むタイマーの一部としても利用されます。