組合せ回路と記憶回路から構成され、その出力がそのときの 入力だけでなく、過去の入力の結果によって決まるような 回路を順序回路 (sequential circuit, シーケンス回路、逐次回路)といいます。
フリップフロップやその応用であるカウンタ、レジスタ、 そして複雑な電子計算機も順序回路です。
sequential circuit (順序回路; シーケンス回路; 逐次回路)
ある瞬間における出力値が,その時点での入力値と内部状態とによって定まり,その内部状態は,直前の入力値と直前の内部状態とによって定まる論理回路.
〈備考〉順序回路は,有限個の内部状態をとることができるので,抽象的な観点からは有限オートマトンとみなすことができる.
順序回路は組合せ回路と記憶回路より構成されています。 組合せ回路の入力には、外部および記憶回路の出力が接続されます。 組合せ回路の出力は、外部および記憶回路の入力へ接続されます。
記憶回路に用いられるフリップフロップの数がm個であれば、順序回路が とり得る状態の数は 2m 通りです。 入力に n ビットが与えられれば、入力のとり得る組合せは 2n 通りです。
順序回路の状態変化を表すのが状態遷移図 (state transition diagram) です。
前状態 x で 入力 A1 が与えられたときに、出力B1を生じて現状態 y に なったとします。ここで、 入力 A2 が与えられると出力 B2 を生じて次状態 z になり、 入力 A3 が与えられると出力 B3 を生じて次状態 w になります。
[2ビットカウンタ状態遷移図]
与えられた順序回路がどのように動作するかを調べて明らかにすることを 順序回路の解析 (analysis) とよびます。
以下のような順序回路を考えましょう。
この回路の動作を調べるには、現状態と次状態を表にします。
現状態 | 入力 | 出力 | 次状態 | ||||||
---|---|---|---|---|---|---|---|---|---|
$Q_a$ | $Q_b$ | $X$ | $J_a$ | $K_a$ | $J_b$ | $K_b$ | $Z$ | $Q_a$ | $Q_b$ |
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
「現状態」から「次状態」への遷移を図で表すと以下のように なることがわかります。
与えられた機能を持つ順序回路を実現することを、順序回路の 合成 (synthesis) といいます。 ただし、与えられた機能を実現する回路は必ずしも一義的に 決まるものではなく、種々の工夫や直観が必要な場合もあります。
[合成の手順]
[例題]
入力系列を3ビット毎に区切り、その中に偶数(0も偶数に含める)個の
1を含む時、出力1を生じるような順序回路を構成しなさい。
[解答]
入力パターンが 000, 110, 101, 011 のときに、出力に 1 を生じるようにすればよい。 はじめに「状態1 (以降これを S1 と書くことにする)」にあるとして、 次に "1" がくるか "0" がくるかで、次の状態が異なるとして、回路の状態遷移図を作る。 たとえば、入力が 110 であると、状態はS1 -> S2 -> S4 -> S1 と変化して S4 -> S1 へ戻るときに出力 1 を生じる。 入力が 010 であると、状態は S1 -> S3 -> S6 -> S1 と変化して、出力は 0 である。
原始状態図をよく検討すると、S4 と S7 はいずれも入力 "0" で出力 "1" を生じ、 入力 "1" で出力 "0" を生じて S1 に戻る。 したがって、S4 と S7 はそれ以後の回路の動作にとって区別する必要がない状態である。 同様に S5 と S6 も区別する必要がない。 つまり、S6 と S7 は冗長な状態であり、これを省略すれば冗長な状態が存在しない、 最終状態図となる。
原始状態図 | 最終状態図 |
最終状態図を見ると状態の数は5なので3bitで表現できます (22 < 5 <= 23)。 3bit で表現される 8 種類のビットパターンを5種類の状態に割り当てる 場合の数は 8!/3! = 6720 通りあります。 この割り当て方は回路の複雑さに大きく影響しますが、 一般的に使える方法は確立されていません。
ここでは仮に以下のように割り当てたものとします。 A B C S1: 0 0 0 S2: 0 1 1 S3: 0 0 1 S4: 1 0 1 S5: 1 1 1
状態遷移表は以下のようになります。
現状態 | 入力 | 次状態 | 出力 | ||||
---|---|---|---|---|---|---|---|
A | B | C | X | A | B | C | Z |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 |
0 | 1 | 0 | 0 | $\phi$ | $\phi$ | $\phi$ | $\phi$ |
0 | 1 | 0 | 1 | $\phi$ | $\phi$ | $\phi$ | $\phi$ |
0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 |
1 | 0 | 0 | 0 | $\phi$ | $\phi$ | $\phi$ | $\phi$ |
1 | 0 | 0 | 1 | $\phi$ | $\phi$ | $\phi$ | $\phi$ |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
1 | 1 | 0 | 0 | $\phi$ | $\phi$ | $\phi$ | $\phi$ |
1 | 1 | 0 | 1 | $\phi$ | $\phi$ | $\phi$ | $\phi$ |
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |
組合せ回路の入力は A, B, C, X なので、 状態遷移表から、フリップフロップの次状態を決定する 組合せ回路を作ります。 ここではDフリップフロップを使う場合を考えましょう。 存在しない 010, 110, 100 についての各項は φ (don't care) として扱います。
A, B, C それぞれのフリップフロップを FFa, FFb, FFc と表すと、 次状態デコーダのカルノーマップはそれぞれ以下のようになります。
FFa | FFb |
FFc | Z |
FFa の入力のための回路は $\overline{A} \cdot C$
FFb の入力のための回路は $\overline{A} \cdot (\overline{B} \cdot X + B \cdot \overline{X})$
FFc の入力のための回路は $\overline{A}$
Z (出力)のための回路は $A \cdot (B \cdot X + \overline{B} \cdot \overline{X}) $
順序回路の合成では、状態の割り当て方法によって、 できあがる回路が簡単になったり複雑になったりします。 順序回路の簡単化のためには、状態割当てにも工夫が必要です。
一般に次状態デコーダが複雑になることが多いので、これを 簡単化できるような状態割当てを行ないます。
不規則な回路で構成された順序回路は、設計するのが難しく、 また動作を解析するのも困難です。
見通しよく設計したり、動作を解析しやすくするためには、 シフトレジスタやカウンタなどの回路を組み合わせて 目的の回路を構成する方法をとります。
[例題]
入力系列の3ビット毎に区切り、その中に偶数(0も偶数に含める)個の
1を含む時、出力1を生じるような回路を構成せよ。
[解答]
カウンタとシフトレジスタによって構成します。
入力ビットを3ビット保持する必要があるので、Dフリップフロップ 3個
(FF3, FF4, FF5) を用います。その中に 000, 011, 101, 110 のパターンが
あれば検出します。
3ビット毎に初期状態に戻すために、3進カウンタをJKフリップフロップ 2個
(FF1, FF2)で構成し、信号を FF3, FF4, FF5 のリセット信号に入れます。
FF1の出力をQ1、
FF2の出力をQ2とすると、
3進カウンタは以下のように構成できます。
現状態 | 次状態 | FF2 | FF1 | ||||
---|---|---|---|---|---|---|---|
Q2 | Q1 | Q2 | Q1 | J2 | K2 | J1 | K1 |
0 | 0 | 0 | 1 | 0 | φ | 1 | φ |
0 | 1 | 1 | 0 | 1 | φ | φ | 1 |
1 | 0 | 0 | 0 | φ | 1 | 0 | φ |
~Q1 Q1 +-----+-----+ ~Q2| 1 | φ | +-----+-----+ Q2| 0 | φ | +-----+-----+ J1のカルノーマップ |
~Q1 Q1 +-----+-----+ ~Q2| φ | 1 | +-----+-----+ Q2| φ | φ | +-----+-----+ K1のカルノーマップ |
J1: FF1のJ入力 (J1 = ~Q2) k1: FF1のK入力 (K1 = 1) |
~Q1 Q1 +-----+-----+ ~Q2| 0 | 1 | +-----+-----+ Q2| φ | φ | +-----+-----+ J2のカルノーマップ |
~Q1 Q1 +-----+-----+ ~Q2| φ | φ | +-----+-----+ Q2| 1 | φ | +-----+-----+ K2のカルノーマップ |
J2: FF2のJ入力 (J2 = Q1) k2: FF2のK入力 (K2 = 1) |
一般に、要求される回路が複雑になればなるほど、設計が単純で見通しがよく、 しかも間違いのチェックが容易な回路構成 (つまり回路としては冗長であっても、定型的で見通しがよいもの) が必要とされます。
制御フリップフロップ FF14 は、回路に加算動作とシフト動作を 交互に繰り返させるためのものです。
[例題] 101 × 011 を計算するときの乗算器の動作を示して下さい。 [解答] 被乗数: 101 乗数: 011 (1, 1, 0の順番でFF8から出力されます)
結果レジスタ: | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
ADD | 1 | 0 | 1 | FF8の出力が1なのでADDします | ||||
結果レジスタ: | 0 | 1 | 0 | 1 | 0 | 0 | 0 | |
Shift | ||||||||
結果レジスタ: | 0 | 0 | 1 | 0 | 1 | 0 | 0 | |
ADD | 1 | 0 | 1 | FF8の出力が1なのでADDします | ||||
結果レジスタ: | 0 | 1 | 1 | 1 | 1 | 0 | 0 | |
Shift | ||||||||
結果レジスタ: | 0 | 0 | 1 | 1 | 1 | 1 | 0 | |
ADD | FF8の出力が0なのでADDしません | |||||||
結果レジスタ: | 0 | 0 | 1 | 1 | 1 | 1 | 0 | |
Shift | ||||||||
結果レジスタ: | 0 | 0 | 0 | 1 | 1 | 1 | 1 | ←答 |