目的
同期回路の説明とその注意点を述べる。
わかりやすく書きたかったのですが、わかりにくいですよね。
同期回路とは
論気回路についてはwikipediaを参照すると詳しい。論理回路は電圧の低いLと高いHの状態を真理値の「真」と「偽」、あるいは二進法の「0」と「1」とみなして論理演算をするものである。
論理回路のうち、決まった周期でHとLを繰り返すクロックを使って、演算をするのが同期回路である。
回路の構成要素
同期回路の構成要素は下記である。
フリップフロップという記憶素子と論理演算を行う論理ゲートからなる。
フリップフロップはクロックに同期して動作する。
フリップフロップには種類がいくつかあるが、基本的にはDフリップフロップ(DFF)しか使用しない。
同期回路ではクロックに同期してDフリップフロップ(DFF)から出たデータを論理ゲートで演算し、またDフリップフロップ(DFF)でデータをうける。
DFFからDFFまでの時間はクロックの周期と等しく、DFFの間の論理ゲートでの演算はクロック周期内に完了するように設計される。
- フリップフロップ(FF)
- Dフリップフロップ(DFF)
- レジスタと呼ばれる。
- クロックの立ち上がり(LからH)でデータ取り込む
- ラッチ回路
- クロックがHのときにデータを取り込む
- Dフリップフロップ(DFF)
- 論理ゲート
- NOT
- AND
- OR
- XOR
フリップフロップはクロックに同期して動作する素子である。
Dフリップフロップの場合下記のようにCLKがLやHを繰り返しているときに
CLKの立ち上がり(LからH)で入力(IN)を取り込み出力(OUT)に取り込んだ値を出力する。
CLKの立ち上がりの前後は入力(IN)が変化しないように設計する必要がある。
立ち上がり前の入力(IN)の変化しない期間をセットアップ
立ち上がり後の入力(IN)の変化しない期間をホールドである。
CLK _|""|__|""|__|""|__
IN ""|_____|"""""|____
OUT XX""""""|_____|""""
ラッチ回路の場合下記のようにCLKがLやHを繰り返しているときに
CLKのHで入力(IN)を取り込み出力(OUT)に取り込んだ値を出力する。
DフリップフロップがCLKのエッジで動作するのにたいして、ラッチ回路はCLKのレベルで動作する。
立ち上がりで動作しないので、DFFよりタイミングの解析が難しく、基本的には使用しない素子である。verilogではラッチ回路が記述できるので不用意に使わない。
CLK _|""|__|""|__|""|__
IN """""|_____|"""""|_
OUT XX"""""|_____|"""""
回路の出力
同期回路ではクロックに同期してDフリップフロップ(DFF)から出たデータを論理ゲートで演算し、またDフリップフロップ(DFF)でデータをうける。
そのため、回路の出力は論理ゲートでなくDフリップフロップ(DFF)の出力がタイミング上好ましい。
異なるクロック間(非同期)でのデータのやりとり
異なるクロック間で注意することは、2点ある。
1, 多数のbit列を異なるクロック間でやりとりするときに、回路の配線上の影響などにより
特定のbitのみが受け渡されデータが化ける場合ある。
例えばクロックAで動くDFFの出力が1111->0000->1111のようにデータが変化しているとして、
クロックBで動くDFFでこのデータをとるとする。ちょうど0000->1111と変化しているときに
クロックB側でデータをとると0000や1111ではなく0011のように中途半端な状態になる。
2, DFFのセットアップとホールドの制約を守らないとHでもLでもないメタステーブル状態になる。
上記の問題があるため、異なるクロック間で受け渡す場合は多数のbit列のデータが中途半端な状態にならないようにデータが変わらないところで受け渡すようにする。また、メタステーブルのためにDFFの2段受けをする。
設計上の注意点
- 回路の出力はDFFで受ける。
- ラッチ回路を使用しない
- 同期してない異なるクロック間でデータをやりとりは注意
- メタステーブルがあるところは注意
- フリップフロップを2段受けしてとる。
- データが安定している状態にして受け渡す。