フリップフロップ(2)

フリップフロップ(2)

 デジタル回路の同期設計にて、DFFの説明をしていませんでした。

 DFFにも遅延がありますが、考え方はAND,OR,NOT,ExORなどのゲート素子と同じです。違うのはクロックが入っている所です。

 DFFはクロックの立ち上がりで入力データを記憶します。実はクロック立ち上がりの前後でデータが動いてはいけない時間が存在します。
「だるまさんが転んだ」の鬼が参加者の方を見ます。鬼が見ている間は参加者は静止していますね。そして振り向いている間は参加者が動く。この動作にとても似ています。クロックの立ち上がる瞬間は鬼が参加者を見ている瞬間と思ってください。

 上の回路図にて、DFF1のクロックとD(データ)の部分をタイミングチャートで見てみます。

 このようにクロックの立ち上がり部分で赤で示した部分はdataが変化してはいけません。だるまさんが転んだの鬼が見ている状態です。この状態になったら、どうなるのか? それは誰にもわからないのです。通常であれば、クロックの立ち上がりを記憶したデータがQに出力されますが、この赤い枠に入った時にデータが変化してしまうと、Qに何が出力されるのかはわかりません。このような状況をエンジニアはよく「不定」とか、「メタステーブルが発生している」といいます。

 もう少し赤の部分を拡大して見てみましょう。説明のためにちょっとデータの変化点を前にずらして見やすくしています。

 クロックの立ち上がり前から赤枠の始まりまでの時間をセットアップタイム。クロックの立ち上がりから赤枠の終わりまでの時間をホールドタイム。といいます。一般的なFPGAではセットアップタイムとホールドタイムは同じではありません。ホールドタイムの方が長いです。そして、これらの時間はFPGAのデータシートに記されています。エンジニアはデータシートを読んでこの時間を把握しておく必要があります。上の例はセットアップタイム、ホールドタイム内でdataは変化していませんのでOKになります。

 悪い例を示しておきましょう。

 このようにdataがclockの立ち上がりから、ホールドタイム内で変化しています。このとき、DFFの出力は不定になります。

 データシートを読んで、セットアップタイム、ホールドタイムを知っていれば、青枠の時間が計算できます。クロックの周期がわかっていますから、赤枠の時間を引けば青枠の時間になりますね。その時間がゲート遅延の許される時間になります。

 セットアップタイム、ホールドタイムの間はデータが動いてはいけない。これは非常に重要な事なので、しっかりと覚えてください。

 そして、DFFの遅延はクロックの立ち上がりから出力されるまでの時間を示しています。DからQの時間ではないので注意してください。

 いかがでしたか? DFFの周辺だけでも結構面倒な制約が出てきました。この計算をエンジニアが全部やっているのか? というと、データシートを読んでセットアップタイム、ホールドタイムの確認をしますが、それ以外全部のDFFの計算はやっていません。それは、論理ゲートの組み合わせをエンジニアが設計したとしても、その組み合わせ回路をFPGAのコンパイラは最適化してしまいます。ブール代数の計算を自動で行って、簡略化してしまうのです。
 したがって、どの程度ゲートで時間がかかっているのかはコンパイルしてみないとわかりません。そして、コンパイルすると、セットアップタイムとホールドタイムから、どの程度のクロック周波数でDFFが動作可能か(青い範囲の時間)を自動的に計算してくれる機能がFPGAのコンパイラに備わっています。逆にクロック周波数を予めコンパイラに設定しておけば、ゲートを論理圧縮した時にワーニングを出してくれる機能もあります。

 このように計算そのものは自動で行ってくれますが、言葉の意味を理解していないと、コンパイラで出たエラーやワーニングに対応できません。対応するのはエンジニアです。

 セットアップタイムとホールドタイムを計算しなくてはいけないのはFPGAの入口と出口になります。たとえば、入口としてADコンバータのデータがあったり、出口にメモリがあったり、プリント基板を通じて他のデバイスに接続しています。それらとFPGA内部のDFFのセットアップタイム、ホールドタイムは自動で計算してくれませんので、エンジニアが注意する必要があります。