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用のシミレーションを追加したファイルもおいてあるので、それを見る限りでは上のようなことをやっているっぽい?