I2C

I2Cをverilog記述で作ろうと思って気になった点をいくつか。

  • inoutについて

inout記述が必要になるけど、どういう風に入力と出力を切り替えるかと思ったら、やはり入力時はハイインピーダンスにすれば良いみたい。

  • マスターのSCL端子もinout定義にすべきか?

I2Cは仕様で、スレーブ側がビジー時にSCLを強制的にlowにするクロックストレッチという機能があるので、それを考えるなら、high出力時は単純にin(high imp)状態にして、プルアップ抵抗によりhighレベルにする。
つまり
scl = 1'bz;
上の記述でhighと考えて
scl = 1'b0;
これでlowとする。
この方法はSDAにも使うべき。


Opencores by Verilog Source with VHDL Translation
上のページにopencoresで配布されているi2cモジュールのveritak用のシミレーションを追加したファイルもおいてあるので、それを見る限りでは上のようなことをやっているっぽい?