ハンドシェイク・シンクロナイザ
MUXシンクロナイザはイネーブル信号が一方通行なので、あらかじめ転送先と転送元のクロック周波数を考慮しておかなければならなかったが、これを回路で自動的に調整させるには、転送元からリクエスト信号(req)、転送先からアクノリッジ信号(ack)を出して、双方がそろった時だけ転送するようにすればよい。この手順をハンドシェイクという。(たぶん双方が握手している様子に似ているからこう呼ぶのではないか)
ハンドシェイクの信号reqとackをダブルFFシンクロナイザで転送すれば、ハンドシェイク・シンクロナイザができる。
この回路ではen_aが入るとreq_aがセットされ、req_a の立ち上がりパルスen_bで転送が行われる。同時にack_bが返りreq_aをクリアする。ack_bが返ってくるまでreq_aが保持されるから、clk_aとclk_bの速度を気にしなくてよい。ただし、req_a=1またはack_a=1の期間はen_aが受け付けられないので、転送に結構な時間がかかってしまう。
ここでreq_aのクリアを、ack_aのレベルではなくack_aの立ち上がりエッジで行えば、ack_a=0になるまで待たずにすぐにen_aが受け付けられるように見えるが、req_a=0になってすぐに1にセットしてしまうと、req_a=0の期間が短すぎてclk_bでサンプリングし損なってしまうのでダメである。