”
SCCBインタフェース回路の実装2(ブロック図の作成)”で書いたブロック図を元にVHDLでコーディングをした。
下のconstant値ががSCL用18ビットシフトレジスタにロードする値と9ビットのSDA用シフトレジスタにロードする値だ。
constant START_PATTERN_SCL : std_logic_vector := "111111111111111111";
constant IDA_SCCBR_WD_PATTERN_SCL : std_logic_vector := "010101010101010101";
constant STOP_PATTERN_SCL : std_logic_vector := "011111111111111111";
constant START_PATTERN_SDA : std_logic_vector := "111111110";
constant ID_ADDRESS_PATTERN_SDA : std_logic_vector := "010000100";
constant STOP_PATTERN_SDA : std_logic_vector := "011111111";
VHDLの階層はSCCB_Reg_Controller.vhdがトップで、その下に、freqdiv.vhd、One_Transaction_SCCB.vhd、SCCB_reg_values_ROM.vhd の各モジュールがある。
freqdiv.vhd は25MHzを200KHz, 5usec のイネーブルを生成する。One_Transaction_SCCB.vhd はSCCBレジスタのアドレスとデータを与えられて、SCCBレジスタに1つ書き込む回路である。SCCB_reg_values_ROM.vhd はSCCB_reg_values.data の内容をROMに読み込んだROM。VHDLソースは長いので省略。
シミュレーション波形を下に示す。

上の図でscl がクロック、sda がデータだ。scl は10usec周期、100KHzとなっている。下のcs_main が現在のステートを表している。start_state がスタートだけれども、slc は18ビットのシフトレジスタに値をロードしているので、最後の200KHzで2クロック分のみを使用している。最初はダミーなので、効率が悪いが最初に設定するだけなので、スピードは必要ない。よって、わかりやすさを優先して、このような実装となった。
id_address は8ビットの42を出力して、最後にドントケアビットがある(ハイ・インピーダンス)。
sccb_reg_addr はSCCBレジスタのアドレスを示していて、この場合はAC番地を表している。やはり、最後にドントケアビットがある。
write_data はsccb_reg_addr に書き込みデータを示している。ここではDF を書き込む。やはり、最後にドントケアビットがある。
最後に、stop_state はstop_state 同様に効率が悪い。最初の200KHzで2クロック分のみを使用している。
さて、うまく行ったようなので、今度はインプリメントして確かめてみることにする。うまく行ったら、このソースを公開するかも?
- 2009年12月21日 22:07 |
- 画像処理
-
| トラックバック:0
-
| コメント:0