よくわからないFPGAのこととか

よくわからないFPGAとか回路とか数学とかについて

FF(フリップフロップ)の構成と仕組みを考える

はじめに

デジタル回路つくるとエッジでデータを保持するFFの恩恵はたくさん受ける。

ただ「FFって何だろう?」と思うことがある。

働き始めて数年、「FFってわかる?」みたいな質問を何回か受けたのだが、どんな回答を期待されてたのだろう。 本を読んでも何とかラッチを組み合わせるとDFFができると書いてあるがピンとこない。
説明はわかる(?)けど、本当に保持されるのとか頭が良くないから思ってしまう。

ある書物に46個のトランジスタの組み合わせでできると書いてあったので、わからないなりにつくってみることにした。
多分こんな道筋になると思う。

f:id:manaka1122:20200723220537j:plain
FFができるまで

といってもICをはんだ付けしてオシロで見るのは大変だ。
回路シミュレータの「LTspice」を使うことにしよう。


PMOSとNMOS

最初にPMOSとNMOSのFETを復習する。

f:id:manaka1122:20200723221037j:plain
NMOSとPMOS

正確には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を介して元に戻す。(バッファ)

f:id:manaka1122:20200723221213j:plain
NOT回路
青・・・入力   赤・・・出力

入力 出力
0 1
1 0

NOR

NOR回路はPMOSとNMOSを用いて以下のように作成する。
NMOSを並列にして、NOR条件をつくる。そのためPMOSは直列となる。(端子が浮かないように...)

f:id:manaka1122:20200723221244j:plain
NOR回路
緑・・・入力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は並列となる。(端子が浮かないように...)

f:id:manaka1122:20200723221317j:plain
NAND回路

緑・・・入力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のほうがわかりやすいです。)

f:id:manaka1122:20200723221343j:plain
NORラッチのイメージ

NORラッチ回路はPMOSとNMOSを用いて以下のように作成する。

f:id:manaka1122:20200723221405j:plain
NORラッチ
緑・・・入力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によりセット/リセットを操作している。

f:id:manaka1122:20200723221430j:plain
Dラッチイメージ

DラッチはPMOSとNMOSを用いて以下のように作成する。
素子数は22個になる。

f:id:manaka1122:20200723221459j:plain
Dラッチ回路
緑・・・入力CLK  青・・・入力DATA   赤・・・出力

入力CLK 入力DATA 出力
0 0 データ保持
1 0 0
0 1 データ保持
1 1 1

CLKが0の時はデータを保持する。ただし、クロック1の期間中にデータが変化すると出力もそのまま変化する。
パイプライン的に流し作業をするときに前の人の結果が早く来すぎてしまったり、作業中に論理が変わったりと不都合があるので、クロックの立ち上がりエッジだけでデータを更新したい。
それを実現するのはDFF(Delay-Flip-Plop)である。


DFF

f:id:manaka1122:20200723221524j:plain
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を用いて以下のように作成する。

f:id:manaka1122:20200723221545j:plain
DFF回路

f:id:manaka1122:20200723221603j:plain
DFF波形

ピンク・・・CLK
緑・・・DATA
青・・・Dラッチ(1)中間出力
赤・・・出力

入力CLK 入力DATA 出力
↑以外 0 データ保持
↑以外 1 データ保持
0 0
1 1

これでDFFができた。


その他 論理

XOR

入力ABの反転を生成し、全パターン網羅。素子数12個。

f:id:manaka1122:20200723221649j:plain
XOR回路(素子12個)
緑・・・入力CLK  青・・・入力DATA   赤・・・出力

NANDとNORで構成。素子数10個。
こちらの場合はクリティカルパスが12個使用した場合と同様の2段のため、素子数を減らしつつなおかつ速度を落とさない方法であると思われる。

f:id:manaka1122:20200723221713j:plain
XOR回路(素子10個)
緑・・・入力CLK  青・・・入力DATA   赤・・・出力


最後に

DFFをFETを組み合わせて作ることができたが、これでもまだまだ不思議な気持ちが残る。結局、調べれば調べるほどわからないことが増えていく。
しかしながら思いつた先人もすごいなと思う。私が年をとってもFFは不思議だと言っていそう。(そのころはトランジスタベースが終わっていることを期待。)
この記事はまだまだ至らない部分が多々あるので、少しずつ更新していきたい。


参考資料

・デジタル回路設計とコンピュータアーキテクチャ
 David Money Harris (著), Sarah L. Harris (著),
 鈴木 貢 (翻訳), 天野 英晴 (翻訳), 中條 拓伯 (翻訳), 永松 礼夫 (翻訳)