FC2カウンター FPGAの部屋 SCCBインターフェース回路の説明1(SCCB_Reg_Controller.vhd)
FC2ブログ

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

FPGAの部屋

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

SCCBインターフェース回路の説明1(SCCB_Reg_Controller.vhd)

SCCBインターフェース回路が完成した。VHDLソースを全部公開するか、説明を書きながら一部分公開するかで迷ったが、説明を書きながら一部分公開しようと思う。
最上位のトップ階層はSCCB_Reg_Controller.vhd である。このファイルのentity を下に示す。

-- SCCB_Reg_Controller.vhd
-- SCCBレジスタのコントローラ
-- SCCB_reg_values_ROM.data には必ず256行のデータを用意しておく。アドレスがFFの場合はレジスタ・アクセスはそこで終了する。
-- 1行のデータは16ビット幅となっていて、上位8ビットがアドレス、下位8ビットがデータとなる。
-- One_Transaction_SCCBにアドレスとデータを渡して、1クロック分のstart_pules をアサートしSCCBレジスタに書き込む
-- One_Transaction_SCCBが書き込みを終了したら、end_pulseをアサートされるので、終了を検出できる。
-- SCCB_reg_values_ROM.dataのアドレスにFFが書いてあるエントリまで、上記の動作を実行する。

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_arith.all;
-- pragma translate_off
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
-- pragma translate_on

entity SCCB_Reg_Controller is
    port(
        clk : in std_logic; -- クロック
        reset  : in std_logic; -- リセット
        SCL : out std_logic; -- SCCBのクロック
        SDA : out std_logic -- SCCBのデータ
    );
end SCCB_Reg_Controller;


clkとresetを受け取って、SCL(SCCBクロック)とSDA(SCCBデータ)を出力する。
この下に、freqdiv.vhd、One_Transaction_SCCB.vhd、SCCB_reg_values_ROM.vhd の各モジュールがある。
SCCB_Reg_Controller.vhd には、SCCB_reg_values_ROM.vhd から読み込んだデータをSCCBレジスタを設定するモジュール(One_Transaction_SCCB.vhd) に渡すステートマシンがある。これはアドレス値0xFFを読むと停止する。下にそのステートマシンのVHDLコードを示す。

    -- SCCBのレジスタをセットするためのステートマシン
    process(clk) begin
        if clk'event and clk='1' then
            if reset='1' then
                cs_reg_set <= idle;
                start_pulse <= '0';
            else
                case cs_reg_set is
                    when idle =>
                        if ROM_data(15 downto 8) = x"FF" then -- レジスタセット終了
                            cs_reg_set <= end_state;
                            start_pulse <= '0';
                        else -- アドレスがFFでないので、セットするレジスタがある
                            cs_reg_set <= start_pulse_state;
                            start_pulse <= '1';
                        end if;
                    when start_pulse_state =>
                        cs_reg_set <= wait_one_trans_SCCB;
                        start_pulse <= '0';
                    when wait_one_trans_SCCB =>
                        if end_pulse='1' then -- SCCBレジスタへの書き込みが終了
                            cs_reg_set <= next_address;
                            start_pulse <= '0';
                        end if;
                    when next_address =>
                        if ROM_address=x"FF" then -- 終了
                            cs_reg_set <= end_state;
                            start_pulse <= '0';
                        else
                            cs_reg_set <= idle;
                            start_pulse <= '0';
                        end if;
                    when end_state =>
                        cs_reg_set <= end_state;
                        start_pulse <= '0';
                end case;
            end if;
        end if;
    end process;


このステートマシンでは、One_Transaction_SCCB.vhd にstart_pulse を出して1つのSCCBレジスタへのWriteを実行させる。One_Transaction_SCCB.vhd のSCCBレジスタへのWrite終了後に受け取るend_pulse を受けるとSCCB_reg_values_ROM.vhd のアドレスを1つ進める。そして、idleステートに戻り、アドレスに0xFFが出てきたらend_state に行ったきりになって終了となる。
  1. 2009年12月23日 08:28 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/1329-ae616be6
この記事にトラックバックする(FC2ブログユーザー)