”
SCCBインタフェース回路の実装1(タイミングチャート)”でタイミングチャートを作成した。今度は回路構成を考えてブロック図を書いてみることにした。
最初に、SCLを100KHz、10usec 周期にすることにした。SCCBインタフェース回路が動作する周波数(イネーブルを入れるタイミング)はその倍の200KHz とする。これはクロックをシフトレジスタで生成する都合からそうなった。
まずは制御部のメインのステートマシンを下に示す。

メインステートマシンは、ごくごく当たり前の構成になっている。
次に、シリアルデータの出力方法だが、ブロック図を下に示す。

メインステートマシンでの各ステートのデータのパターンとクロックのパターンを、18ビット長のシフトレジスタに最初にロードして200KHz (5usec) ごとに送出することにより、シリアルデータを出力する。SDAの方は確実にSCLより遅れるようにFF2段を通過されることにする(ここのFFのクロックは25MHz)。その後、ドントケアビットのためにトライステート・バッファをつけてある。そのトライステート・バッファは、シフトレジスタを駆動するクロックで動くCounter(9ビット目)とID_Address、SCCB_Reg_Addr、Write_Data の各ステートのANDをとった信号でハイ・インピーダンスになるようにする(ドントケアビット)。
クロックの方も出たり出なかったりするので、このような構成にすることにした。これでSCCBレジスタに値を書き込むI2C似のプロトコルの方のブロック図は完成した。
次に、もう1つ上のレベルでに設計だが、BRAMを1つ使って、値を変更するSCCBレジスタはBRAMにアドレスと値を書いていくことにする。それを見て上に書いたブロック図の回路がSCCBプロトコルでSCCBレジスタに値を書いていく。最後にアドレスがFFのエントリを検出したら終了とする。
アドレスと値の設定方法だが、”
VHDLでのブロックRAMや分散RAMの初期化(外部データファイル)”を使用して外部のファイルにアドレスと値を1列に書いて、BRAMへデータをイニシャライズすることにする。このブログ記事の例では1列に1つのデータだが、2つのデータに拡張できるはずである。よってBRAMのデータ幅は16ビットとする。
これでやっとVHDLで書くことができるようになったので、次は、VHDLで書いていくことにする。
(2009/12/21:追記)
シリアルデータの出力回路のブロック図を変更したので、下に書いておく。やはり、SDAは18ビットは必要ないと考えた。SLCの2回シフトに付き1回シフトする。それから、SLCとSDAをIOBのFFに入るようにする。SDAのトライステートバッファのイネーブルを正しい形に変更した。トライステートバッファのイネーブルは必ずFFからの出力とする。ここを組み合わせ回路にしてしまうと、特にFPGAではどこにひげがでるか分からないので、必ずFFからの出力とする。
- 2009年12月16日 06:04 |
- 画像処理
-
| トラックバック:0
-
| コメント:0