前回は、“入力CLKのTr/Tfが遅くなるとDFFは誤動作を起こしてしまうので、Tr/Tfに制限をつける必要がある”ことを紹介しました。今回はもうちょっとこの辺りを掘り下げてみたいと思います。
前回の記事↓
DFFを安定に動作させるには、“前の状態をラッチした後、D1Xが変化する”ようにすれば良いことを前回は説明しました。
- スレーブがデータをラッチするのは、CLK2の立下りが決めています。
- マスターが新しいデータを取り込むのは、CLK3の立下がりが決めています。
つまり、前の状態をラッチした後に、D1Xが変化するようにするには、CLK2の立下りの後にCLK3の立下りが来れば良いことになります。

CLK2/3の立上がりを遅らせてもよいのか
ここで気になるのは、“立下りを遅らせると立上りも遅れるが・・・良いのか?”ということです。
- スレーブラッチが新しいデータを取り込むのは、CLK2の立上がりが決めています。
- マスターラッチがデータをラッチするのは、CLK3の立上がりが決めています。
なので、スレーブが新しいデータを取り込んだ後に、マスターがラッチする事になります。

前回の回路に思いっきり遅延回路を追加して確認してみたいと思います。

入力データは雑音の影響を分かりやすくするために小さくし、雑音を入れました。
図 3の結果を見ると、CLK2の立上り~CLK3の立上り間、出力Qに入力Dの雑音がそのまま出力されてしまっています。
これは、スレーブが取り込む新しいデータにラッチがかかっていないために、
入力がそのまま出力につながり、入力信号に雑音やヒゲが入っていたら、そのまま出力に出てしまう
ことになります。これではDFFとしての役目を果たしていません。
スレーブがデータを取り込めるように、Dutyの幅を調節する
ではどうすれば良いかというと、マスターがラッチしたデータをスレーブが取り込む。つまり、CLK3の立ち上がりの後、CLK2の立ち上がりが来る必要があります。
簡単にいうと、CLK2はDutyを細く、CLK3はDutyを広くすると良いのです。

処理の順番は、
- CLK3の立上り:マスターラッチがデータをラッチ。
- CLK2の立上り:マスターラッチの出力をスレーブが取り込み、Qに出力
- CLK2の立下り:スレーブラッチが出力したデータをラッチ
- CLK3の立下り:マスターラッチが新しい入力データを取り込む
このようにDutyを意図的ずらすクロックはSCF(Switched Capacitor Filter)などで、スイッチを同時にONさせたくない場合などに、よく使います。

CLK回路にNANDと遅延回路を使った図 4の回路で実現できます。(上記は一例であって、他にもDutyを意図的にずらす回路はあります)

CLKのDutyを適切に調整することで、入力雑音が出力に出てこなくなりました。
実際のDFFで図 4の様にNANDを使うことは消費電力やサイズの面で不利なので、Pch/NchのL/W長を調整して閾値を意図的に変えて、Dutyの調整をすることが多い様に思います。
次回は、セットアップ・ホールドタイムについて触れたいと思います。