最終更新日:2026年9月22日
fe fe-technology computer-system logic-circuit
まず結論
シフトレジスタは、クロックなどのタイミングに合わせてビットを取り込み、保持しているビット列を一定方向へずらす回路です。
波形問題では、波形全体を追うのではなく、次の順で読みます。
1. 何のエッジで取り込む?
2. その瞬間のデータは0か1か?
3. どちらへシフトする?
4. 新しいビットはどこへ入る?
5. 何のエッジで値を確定する?
特に、
クロックの立上り → データを取り込む
ストローブの立上り → その時点の値を確定する
のように、信号ごとの役割を分けることがポイントです。
直感的な説明
8個の箱が横に並んでいると考えます。
上位 下位
[7][6][5][4][3][2][1][0]
上位方向へシフトし、新しいデータを最下位ビットへ入れるなら、クロックが来るたびに全体が左へ1つ動きます。
最初がすべて0で、順番に 1 0 0 0 1 1 0 1 を取り込むとします。
初期 00000000
1 → 00000001
0 → 00000010
0 → 00000100
0 → 00001000
1 → 00010001
1 → 00100011
0 → 01000110
1 → 10001101
最後は 10001101₂ です。
4ビットずつ区切ると、
1000 1101
8 D
なので、16進数では 8D になります。
大切なのは、最初に入ったビットも、新しいビットが入るたびに上位側へ移動することです。
まずは「箱が動く」と考える
文字列だけで追いにくい場合は、8個の箱の中身が左へ動き、右端から新しいビットが入ると考えると分かりやすくなります。
← ← ← ← ← ← ← 上位方向へシフト
MSB LSB
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 1 │ ← 1回目:1を入力
└───┴───┴───┴───┴───┴───┴───┴───┘
↑
新しいデータ
← ← ← ← ← ← ←
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 1 │ 0 │ ← 2回目:0を入力
└───┴───┴───┴───┴───┴───┴───┴───┘
← ← ← ← ← ← ←
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ 0 │ 1 │ 0 │ 0 │ ← 3回目:0を入力
└───┴───┴───┴───┴───┴───┴───┴───┘
このように、新しいデータは右端へ入り、すでに入っていたデータは左へ押されていくと考えます。
波形は「縦線を引く」イメージで読む
波形問題では、データ波形を横方向にずっと追わないのがコツです。
クロックの立上り位置に縦線を引き、その真上のデータだけを拾います。
時間 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧
│ │ │ │ │ │ │ │
データ 1 0 0 0 1 1 0 1
│ │ │ │ │ │ │ │
クロック ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
立上りエッジだけを見る
読み取る値
1 → 0 → 0 → 0 → 1 → 1 → 0 → 1
つまり、複雑な波形を見ても、頭の中では次のように単純化します。
波形
↓
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ← クロック立上りだけ残す
↓
1 0 0 0 1 1 0 1 ← その瞬間のデータだけ読む
↓
10001101
↓
8D
横に波形を追うのではなく、クロックの立上りから上へ縦に見る。
この見方にすると、データが途中で何度変化していても、取り込む瞬間だけに集中できます。
定義・仕組み
シフトレジスタ
レジスタは複数ビットの情報を保持する回路です。
シフトレジスタでは、その内容をクロックに合わせて1ビットずつ移動できます。
現在
0 0 0 0 0 0 0 1
上位方向へシフトし、0を入力
0 0 0 0 0 0 1 0
シフト演算そのものについては、シフト演算とは?で整理しています。
シリアル入力・パラレル出力
シリアル入力では、データを1ビットずつ順番に受け取ります。
1 → 0 → 0 → 0 → 1 → 1 → 0 → 1
↓
シフトレジスタ
↓
10001101
1ビットずつ入ったデータを、8ビットなどのまとまりとして同時に取り出せるものを、シリアル入力・パラレル出力として考えられます。
立上りエッジ
立上りエッジは、信号が 0 → 1 に変わる瞬間です。
0 ____| ̄ ̄ 1
↑
立上り
「クロックの立上りエッジで取り込む」と指定されたら、Highになっている期間全部を見るのではなく、0から1へ変わる瞬間のデータを読みます。
ストローブ
ストローブは、問題文で指定されたタイミングに値を確定・取り出すための信号として使われることがあります。
クロック立上り
→ ビットを順番に取り込む
ストローブ立上り
→ その時点のレジスタ値を確定
試験では、信号名だけで動作を決めず、問題文に書かれたエッジと役割を確認します。
シフトレジスタは、1ビットを保持するフリップフロップを複数組み合わせて構成できます。フリップフロップについては、フリップフロップとは?で確認できます。
科目Aでどう出る?
波形からレジスタの値を求める問題では、次の5段階で処理します。
1. 取り込むエッジを探す
問題文が、
クロックの立上りエッジで取り込む
なら、クロックの 0 → 1 の位置だけに印を付けます。
2. その瞬間のデータだけ読む
波形全体を追わず、印を付けた位置のデータを左から読みます。
例えば、
立上り ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
データ 1 0 0 0 1 1 0 1
なら、取得した8ビットは、
10001101
です。
3. シフト方向と挿入位置を確認する
上位方向へシフト
+
最下位ビットへ新しいデータ
なら、
左へずらす
+
右端へ新しいビットを入れる
と読み替えます。
4. 確定するタイミングを確認する
クロックとストローブは、次のように仕事が違う二つの合図として考えます。
データ 1 0 0 0 1 1 0 1
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
クロック ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
取 取 取 取 取 取 取 取
込 込 込 込 込 込 込 込
レジスタ ───── 1ビットずつ更新 ─────→ 10001101
│
ストローブ ↑
│
ここで確定
「ストローブの立上りで確定」なら、その立上りまでに取り込まれたビットを使います。
クロック → 取り込む
ストローブ → 確定する
この2つを混同しないことが重要です。
5. 必要なら16進数へ変換する
8ビットなら4ビットずつ区切ります。
10001101
↓
1000 1101
↓
8 D
↓
8D
16進数1桁と4ビットの対応は、16進数と2進数の変換でも確認できます。
どんな場面で使う?
シフトレジスタは、ビットを順番に取り込んだり、順番に送り出したりするときに使われます。
例えば、
- シリアルデータを複数ビットにまとめる
- 複数ビットのデータを1ビットずつ送り出す
- データを1ビットずつ遅らせる
- デジタル回路でビット列を移動する
といった場面があります。
FE試験では、具体的な回路設計よりも、クロックとデータの波形からレジスタ内部の値を追う問題として考えると分かりやすいです。
よくある誤解・混同
波形がHighの間はずっとデータを取り込む
問題文が「立上りエッジで取り込む」なら違います。
Highの期間
→ 見続けない
0 → 1 の瞬間
→ ここで取り込む
クロックとストローブは同じ役割
役割を問題文から分けます。
クロック
→ ビットを取り込む
ストローブ
→ 値を確定する
入力された8ビットを逆順に並べる
シフト方向と新しいビットの挿入位置を確認せず、機械的に逆順にするのは危険です。
上位方向へシフト
+
最下位へ入力
なら、古いビットが上位へ押し上げられるため、8回後は入力順に 10001101 と並びます。
上位方向・下位方向が分かりにくい
一般的なビット表記では、
上位 下位
MSB LSB
左 右
と置くと考えやすくなります。
最後に16進数へ変換するときに8ビットを一気に考える
4ビットずつ区切ります。
1000 → 8
1101 → D
と変換すれば安全です。
まとめ(試験直前用)
- シフトレジスタは、ビットを保持しながら一定方向へずらす
- 立上りエッジ = 0 → 1 の瞬間
- クロックの指定されたエッジだけでデータを読む
- シフト方向と、新しいビットを入れる位置を確認する
- ストローブは、問題文で指定されたタイミングに値を確定する
- 8ビットを16進数にするときは4ビットずつ区切る
波形問題では、まず次の3つを書き出します。
どのエッジで読む?
どちらへずらす?
どのエッジで確定する?
波形全部を見るのではなく、指定されたエッジだけを点で読む。