FC2カウンター FPGAの部屋 2009年12月16日
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

SCCBインタフェース回路の実装2(ブロック図の作成)

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

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

メインステートマシンでの各ステートのデータのパターンとクロックのパターンを、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からの出力とする。
SCCB_block_fig_3_091216.png
  1. 2009年12月16日 06:04 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0