FF(フリップフロップ)の構成と仕組みを考える
はじめに
デジタル回路つくるとエッジでデータを保持するFFの恩恵はたくさん受ける。
ただ「FFって何だろう?」と思うことがある。
働き始めて数年、「FFってわかる?」みたいな質問を何回か受けたのだが、どんな回答を期待されてたのだろう。
本を読んでも何とかラッチを組み合わせるとDFFができると書いてあるがピンとこない。
説明はわかる(?)けど、本当に保持されるのとか頭が良くないから思ってしまう。
ある書物に46個のトランジスタの組み合わせでできると書いてあったので、わからないなりにつくってみることにした。
多分こんな道筋になると思う。
といってもICをはんだ付けしてオシロで見るのは大変だ。
回路シミュレータの「LTspice」を使うことにしよう。
PMOSとNMOS
最初にPMOSとNMOSのFETを復習する。
正確にはMOSFET(metal-oxide-semiconductor field-effect transistor)
金属-酸化物-半導体でMOSという。ポリシリコンは半金属だが、ゲートは歴史的に金属で作られてたらしいのでそう呼ぶらしい。
NOT
NOT回路はPMOSとNMOSを用いて以下のように作成する。
NMOSはGND側(PullDownの役目)に、PMOSは電源側(PullUpの役目)に配置する。
NMOSはゲートに正電圧を与える(-を誘起)ため、ゲートが正の時にGNDにPullDownする役目を担う。
PMOSはゲートに負電圧を与える(+を誘起)ため、ゲートが負の時にHighレベルにPullUpする役目を担う。
GateがHighの時にHighを出すような作り方はGate電圧がなくなるのでできない。NOTとして使いたくないならもう一度NOTを介して元に戻す。(バッファ)
青・・・入力 赤・・・出力
入力 | 出力 |
---|---|
0 | 1 |
1 | 0 |
NOR
NOR回路はPMOSとNMOSを用いて以下のように作成する。
NMOSを並列にして、NOR条件をつくる。そのためPMOSは直列となる。(端子が浮かないように...)
緑・・・入力S00 青・・・入力S01 赤・・・出力
入力S00 | 入力S01 | 出力 |
---|---|---|
0 | 0 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 0 |
ORを作りたいときは出力にNOTを追加すればよい。素子数は4つ→6つと増える。
NAND
NAND回路はPMOSとNMOSを用いて以下のように作成する。
NOTを直列にして、NAND条件をつくる。そのためPMOSは並列となる。(端子が浮かないように...)
緑・・・入力S00 青・・・入力S01 赤・・・出力
入力S00 | 入力S01 | 出力 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
ANDを作りたいときは出力にNOTを追加すればよい。同様に素子数は4つ→6つと増える。
NORラッチ
NOTを使うと値が保持できます。ここにOR条件を加えると保持している値を0にしたり1にしたりできます。
これがNORラッチです。NANDでもできます。(ですが、NORのほうがわかりやすいです。)
NORラッチ回路はPMOSとNMOSを用いて以下のように作成する。
緑・・・入力S00 青・・・入力S01 赤・・・出力
リセットS00 | セットS01 | 出力Q |
---|---|---|
0 | 0 | データ保持 |
1 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | X(禁止) |
Resetで出力Qが0となり、setで出力Qが1となる。
リセット1、セット1は論理的な矛盾が起こるため、禁止入力である。実際素子がどのようなふるまいをしうる可能性があるのか?気になる...
Dラッチ
DラッチはNORラッチにCLKでゲートしたデータを入力している。セットはクロック&データ1、リセットはクロック&データ0となる。
クロックがHIGHの時にDataの0か1によりセット/リセットを操作している。
DラッチはPMOSとNMOSを用いて以下のように作成する。
素子数は22個になる。
緑・・・入力CLK 青・・・入力DATA 赤・・・出力
入力CLK | 入力DATA | 出力 |
---|---|---|
0 | 0 | データ保持 |
1 | 0 | 0 |
0 | 1 | データ保持 |
1 | 1 | 1 |
CLKが0の時はデータを保持する。ただし、クロック1の期間中にデータが変化すると出力もそのまま変化する。
パイプライン的に流し作業をするときに前の人の結果が早く来すぎてしまったり、作業中に論理が変わったりと不都合があるので、クロックの立ち上がりエッジだけでデータを更新したい。
それを実現するのはDFF(Delay-Flip-Plop)である。
DFF
1段目のDラッチはCLKのLOWで値を取り込む。2段目のDラッチはCLKのHIGHで値を取り込む。
1段目のDラッチはCLKがHIGHではデータを保持する。
2段目のDラッチはCLKがHIGHの間は手前のDラッチの保持値で一定に保たれ、CLKがLOWでは2段目のDラッチが保持を行う。CLKを反転させ、2段のDラッチを用いることで、CLKがLOWでは1段目が、CLKがHIGHでは2段目がデータを保持して1クロックのデータの保持を達成している。
そのため、1段目のDATAのCLK立ち上がり直前のデータが次の立ち上がりエッジまで保持される。
素子数は46個(D-latch*2+NOT)になる。
DFFはPMOSとNMOSを用いて以下のように作成する。
ピンク・・・CLK
緑・・・DATA
青・・・Dラッチ(1)中間出力
赤・・・出力
入力CLK | 入力DATA | 出力 |
---|---|---|
↑以外 | 0 | データ保持 |
↑以外 | 1 | データ保持 |
↑ | 0 | 0 |
↑ | 1 | 1 |
これでDFFができた。
その他 論理
XOR
入力ABの反転を生成し、全パターン網羅。素子数12個。
緑・・・入力CLK 青・・・入力DATA 赤・・・出力
NANDとNORで構成。素子数10個。
こちらの場合はクリティカルパスが12個使用した場合と同様の2段のため、素子数を減らしつつなおかつ速度を落とさない方法であると思われる。
緑・・・入力CLK 青・・・入力DATA 赤・・・出力
最後に
DFFをFETを組み合わせて作ることができたが、これでもまだまだ不思議な気持ちが残る。結局、調べれば調べるほどわからないことが増えていく。
しかしながら思いつた先人もすごいなと思う。私が年をとってもFFは不思議だと言っていそう。(そのころはトランジスタベースが終わっていることを期待。)
この記事はまだまだ至らない部分が多々あるので、少しずつ更新していきたい。
参考資料
・デジタル回路設計とコンピュータアーキテクチャ
David Money Harris (著), Sarah L. Harris (著),
鈴木 貢 (翻訳), 天野 英晴 (翻訳), 中條 拓伯 (翻訳), 永松 礼夫 (翻訳)