学ぶ › トピック 10
カウンタとシフトレジスタ:設計を一歩ずつ
読了時間:約 7 分 · bitGateLab チーム
カウンタとは、クロックパルスのたびに決まった状態の並びを順にたどっていく、フリップフロップの集まりです。レジスタとは、2 進のワードを保存したりシフトしたりする、フリップフロップの集まりです。これらを使って、時間を測り、周波数を分周し、データを直列から並列に変換し、制御用のシーケンスを生成します。D、JK、T の各フリップフロップとその励起表をしっかり理解しておく必要があります。これらはラッチとフリップフロップの記事で説明しています。
非同期カウンタ(リップルカウンタ)
数を数える最も単純な方法は、T = 1 にした T フリップフロップを数珠つなぎにすることです。各フリップフロップがトグルして、周波数を 2 で割ります。システムのクロックを受け取るのは最初の一つだけで、それ以降は、前段の出力をクロックとして使います。立ち下がりエッジトリガ型のフリップフロップでは、ある段の Q を次の段のクロックにつなぐと、カウンタはアップカウントします。立ち上がりエッジ型でアップカウントさせるには Q を使う必要があります(Q を使うとダウンカウントになります)。
欠点は遅延が累積することです。段 n は、それより前の段がすべて変化し終わるまで変化しません。変化が波のように鎖を伝わっていくのです。その間、出力は誤った値を通過します。
例:4 ビットの非同期カウンタで、フリップフロップ一つあたり tCQ = 12 ns とします。0111 から 1000 に変わる場合を考えます。
- 12 ns 後に Q0 が 1 から 0 に変わり、出力は 0110 と読めます。
- 24 ns 後に Q1 が変わります:0100。
- 36 ns 後に Q2 が変わります:0000。
- 48 ns 後に Q3 が変わります:1000。これが正しい値です。
48 ns の間に、出力は 0110、0100、0000 を示しました。これらの値をデコードする回路があれば、偽のパルスが見えてしまいます。常に安定した値を読むには、クロック周期が 48 ns を超えていなければなりません。つまり f < 20.8 MHz です。
同期カウンタ
同期カウンタでは、すべてのフリップフロップが同じクロックを受け取り、どれがトグルするかは論理回路が決めます。2 進アップカウンタでは、あるビットがトグルするのは、それより下位のビットがすべて 1 のときです。
T0 = 1, T1 = Q0, T2 = Q0·Q1, T3 = Q0·Q1·Q2
すべての出力は、エッジから tCQ 後に一斉に変化します。最小周期は、もうフリップフロップの連鎖によるビット数には依存せず、tCQ + AND の遅延 + tsu で決まります。
N 進カウンタ
N 進カウンタは、N 個の状態をたどって最初に戻ります。少なくとも ⌈log2 N⌉ 個のフリップフロップが必要です。作り方は二通りあります。
非同期リセットを使う方法:2 進カウンタを用意し、現れてはいけない最初の状態を検出します。10 進カウンタなら、その状態は 1010 です。Q3 と Q1 の NAND を負論理のクリア入力につなぐだけで済みます。Q3 と Q1 が同時に 1 になるのは、これが最初だからです。動作はしますが、状態 1010 が数ナノ秒の間だけ現れ、出力に短いパルスが生じます。
同期設計:状態表を書き、励起表を使って入力を求めます。過渡的な状態は現れません。
例:T フリップフロップによる同期式 6 進カウンタ(0 から 5)。状態は Q2 Q1 Q0 で表します。状態 110 と 111 は使わないので、ドントケア(X)とします。
| Q2 Q1 Q0 | 次の状態 | T2 | T1 | T0 |
|---|---|---|---|---|
| 000 | 001 | 0 | 0 | 1 |
| 001 | 010 | 0 | 1 | 1 |
| 010 | 011 | 0 | 0 | 1 |
| 011 | 100 | 1 | 1 | 1 |
| 100 | 101 | 0 | 0 | 1 |
| 101 | 000 | 1 | 0 | 1 |
各 T は、そのビットが変化するときに 1 になります。X を使って簡単化すると、次のようになります。
- T0 = 1。
- T1 = Q2·Q0(001 と 011 を覆います。101 では Q2 = 1 なので 0 になります)。
- T2 = Q1·Q0 + Q2·Q0 = Q0·(Q1 + Q2)。
未使用の状態を確認します。110 からは T2 = 0、T1 = 0、T0 = 1 なので、カウンタは 111 に進みます。111 からは T2 = 1、T1 = 0、T0 = 1 なので、010 に進みます。どちらも正規のシーケンスに戻ります。つまりこのカウンタは、無効な状態で電源が入っても自己起動します。
シフトレジスタ
シフトレジスタは、D フリップフロップを数珠つなぎにしたものです。各段の出力が次の段の入力になり、エッジのたびにすべてのビットが一つ先の位置へ進みます。データの入り方と出方によって、次のように分類されます。
- SISO(直列入力・直列出力):信号をクロック n 周期分だけ遅らせます。
- SIPO(直列入力・並列出力):ビットを一つずつ受け取り、まとめて出力します。直列を並列に変換します。
- PISO(並列入力・直列出力):ワード全体をロードし、それを一ビットずつ送り出します。各フリップフロップの入力には 2 対 1 の MUX があります。
Di = LOAD·Pi + LOAD·Qi−1。 - PIPO(並列入力・並列出力):単純な記憶用レジスタです。
例:4 ビットの SIPO レジスタ。初期値は 0000 で、Q0 ← 入力、Q1 ← Q0、Q2 ← Q1、Q3 ← Q2 とします。ビット 1、0、1、1 をこの順に送ります。
| エッジ | 入力ビット | Q0 Q1 Q2 Q3 |
|---|---|---|
| 1 | 1 | 1 0 0 0 |
| 2 | 0 | 0 1 0 0 |
| 3 | 1 | 1 0 1 0 |
| 4 | 1 | 1 1 0 1 |
4 回のエッジの後、Q3 Q2 Q1 Q0 の順に読むと、レジスタの内容は 1011 です。最初に送ったビットは Q3 に入っています。
リングカウンタとジョンソンカウンタ
シフトレジスタの最後のフリップフロップの出力を最初のフリップフロップの入力につなぐと、リングカウンタになります。1 を一つだけ入れて初期化すると(たとえば 1000)、その 1 が循環します。1000、0100、0010、0001、1000 という具合です。n 個のフリップフロップで状態は n 個あり、どの状態もすでにデコードされた形になっています。1 になっている出力は一つだけだからです。初期値のロードを確実に行わなければなりません。0000 で始まると、永久にそのままです。
Q の代わりに、最後のフリップフロップの Q をフィードバックすると、ジョンソンカウンタ(ツイステッドリングカウンタ)になり、状態は 2n 個です。4 ビットの場合(Q0 Q1 Q2 Q3、Q0 ← Q3)は次のようになります。
0000 → 1000 → 1100 → 1110 → 1111 → 0111 → 0011 → 0001 → 0000
各状態は、1 と 0 の境目がどこにあるかを見れば、2 入力の AND 一つで見分けられます。たとえば 1100 は Q1 = 1 かつ Q2 = 0 となる唯一の状態で、0000 は Q0 = 0 かつ Q3 = 0 となる唯一の状態です。
よくある間違い
- 過渡的な状態を考慮せずに、非同期カウンタの出力を組み合わせ回路でデコードする。
- 立ち上がりエッジ型の非同期カウンタで、段の間に Q ではなく Q をつなぎ、ダウンカウンタにしてしまう。
- N 進カウンタで、未使用の状態からどこへ進むかの確認を忘れる。
- 最初の 1 をロードせずにリングカウンタを起動する。
- SIPO レジスタを読むときにビットの順序を取り違える。最初に入ったビットは、いちばん遠い端に行き着きます。
シミュレータで試してみよう
非同期カウンタと同期カウンタをタイミング図で比べるのが、リップルの影響を見るいちばんの方法です。
- T = 1 にした T フリップフロップを四つ置き、最初の一つにクロックをつなぎ、残りを非同期カウンタとして数珠つなぎにします。
- 四つの出力を、表示用の LED と、表示器または LED バーにつなぎます。
- その隣に、T1 = Q0、T2 = Q0·Q1、T3 = Q0·Q1·Q2 とした同期カウンタを、すべて同じクロックで組みます。
- タイミング図を開いてクロックを動かし、両方のカウンタで 0111 から 1000 への遷移を観察します。
- D フリップフロップ四つを数珠つなぎにしてレジスタを組み、各エッジの前に直列入力を切り替えて、ビットが進んでいく様子を観察します。そのあと、最後の段の Q を最初の段にフィードバックし、ジョンソンカウンタの 8 状態を確かめます。
練習問題
- 12 進カウンタを、2 進カウンタ、リングカウンタ、ジョンソンカウンタで作る場合、それぞれフリップフロップはいくつ必要ですか。
解答
2 進:4 個(24 = 16 ≥ 12)。リング:12 個。ジョンソン:6 個(2 × 6 = 12)。
- 4 ビットの 2 進カウンタから、負論理の非同期リセットを使って 12 進カウンタを作るには、どのゲートとどの出力を使いますか。
解答
12 = 1100 です。Q3 と Q2 の NAND をクリア入力につなぎます。両方が 1 になるのは、これが最初だからです。
- 8 ビットの非同期カウンタが、tCQ = 10 ns のフリップフロップを使っています。出力が確定するまでの時間は、最悪の場合どれだけですか。
解答
8 × 10 = 80 ns です。たとえば 01111111 から 10000000 に変わるときです。
- 4 ビットのジョンソンカウンタの状態 0111 をデコードするのは、どんな 2 入力 AND ですか。
解答
Q0·Q1 です。Q0 = 0 かつ Q1 = 1 となる唯一の状態だからです。