FC2カウンター FPGAの部屋 Spartan-3A Starter KitでEDKを使ってカメラ表示23(LCD、Rotary EncoderカスタムIPの追加)
FC2ブログ

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

FPGAの部屋

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

Spartan-3A Starter KitでEDKを使ってカメラ表示23(LCD、Rotary EncoderカスタムIPの追加)

Spartan-3A Starter KitでEDKを使ってカメラ表示22(一応完成)”の続き。

前回、CMOSカメラの画像データをディスプレイに表示することができた。それでも、MicroBlazeプロセッサは何も仕事をしていない。ハードウェアだけで表示している。これでは、MicroBlazeプロセッサがかわいそうなので、仕事を割り振ることにした。以前はSMMでやっていたのだが、LCDに主要なCMOSカメラのパラメータを表示して、ロータリー・エンコーダでパラメータを設定して、LCDで表示するという機能をMicroBlazeに割り振ることにした。(”The Simple MicroBlaze Microcontroller 19 (SCCB設定レジスタを設定できたが...)”参照)
Cソースはあるのだが、SMM用なので、MicroBlaze用に修正する必要がある。例えば、タイマーはSMM用でなく、axi_timerを使用するので、そこは修正が必要だ。後はアドレスは修正する必要がある。

さて、今までのXPSプロジェクトにlcd_controller とrotary_encoder の新しい2つのカスタムIPを生成した。2つともスレーブIPだ。
Spa3A_SKit_OV7670_95_110928.png

まずはロータリー・エンコーダの方から、関連するVHDLファイルをコピーした。
Spa3A_SKit_OV7670_96_110928.png

user_logic.vhd を修正する。VHDLコードの主要な部分を下に示す。まだコードチェックをしていないので間違っているかもしれない。この他にもsignal宣言、component宣言、ポート宣言を追加した。

  -- implement slave model software accessible register(s) read mux
  SLAVE_REG_READ_PROC : process( slv_reg_read_sel, slv_reg0 ) is
  begin

    case slv_reg_read_sel is
      when "1" =>
        slv_ip2bus_data(0 to C_SLV_DWIDTH-5) <= (others => '0');
        slv_ip2bus_data(C_SLV_DWIDTH-4) <= center_hold;
        slv_ip2bus_data(C_SLV_DWIDTH-3) <= left_hold;
        slv_ip2bus_data(C_SLV_DWIDTH-2) <= right_hold;
        slv_ip2bus_data(C_SLV_DWIDTH-1) <= '0';
      when others => slv_ip2bus_data <= (others => '0');
    end case;

  end process SLAVE_REG_READ_PROC;

  ------------------------------------------
  -- Example code to drive IP to Bus signals
  ------------------------------------------
  IP2Bus_Data  <= slv_ip2bus_data when slv_read_ack = '1' else
                  (others => '0');

  IP2Bus_WrAck <= slv_write_ack;
  IP2Bus_RdAck <= slv_read_ack;
  IP2Bus_Error <= '0';

    -- rot_enc_cont.vhd を接続
    
    -- CS_rot_enc_wr を生成する
    process( Bus2IP_Clk ) begin
        if Bus2IP_Clk'event and Bus2IP_Clk = '1' then
            if Bus2IP_Reset = '1' then
                CS_rot_enc_wr <= '0';
            else
                if slv_reg_write_sel="1" then
                    CS_rot_enc_wr <= '1';
                else
                    CS_rot_enc_wr <= '0';
                end if;
            end if;
        end if;
    end process;    
    
    -- ロータリーエンコーダ
    rot_enc_cont_i : rot_enc_cont port map(
        clk => Bus2IP_Clk,
        reset => Bus2IP_Reset,
        rot_a => rot_a,
        rot_b => rot_b,
        rot_center => rot_center,
        right_pulse => right_pulse,
        left_pulse => left_pulse,
        center_pulse => center_pulse
    );
    
    -- right_pulse, left_pulse をホールドするFF
    process(Bus2IP_Clk) begin
        if Bus2IP_Clk'event and Bus2IP_Clk='1' then
            if Bus2IP_Reset='1' then
                right_hold <= '0';
                left_hold <= '0';
                center_hold <= '0';
            else
                if right_pulse = '1' then
                    right_hold <= '1';
                elsif CS_rot_enc_wr='1' then 
                    right_hold <= '0';
                end if;
                
                if left_pulse='1' then
                    left_hold <= '1';
                elsif CS_rot_enc_wr='1' then
                    left_hold <= '0';
                end if;
                
                if center_pulse='1' then
                    center_hold <= '1';
                elsif CS_rot_enc_wr='1' then
                    center_hold <= '0';
                end if;
            end if;
        end if;
    end process;


レジスタReadのcenter_hold, left_hold, right_hold のビット割り当ては、以前のSMMの時のハードウェアに合わせてある。

rotary_encoder.vhd にロータリー・エンコーダ用のポート宣言とそのポート接続を追加した。ポート宣言部分の一部を下に示す。

entity rotary_encoder is
  generic
  (
    -- ADD USER GENERICS BELOW THIS LINE ---------------
    --USER generics added here
    -- ADD USER GENERICS ABOVE THIS LINE ---------------

    -- DO NOT EDIT BELOW THIS LINE ---------------------
    -- Bus protocol parameters, do not add to or delete
    C_BASEADDR                     : std_logic_vector     := X"FFFFFFFF";
    
    ...

    -- DO NOT EDIT ABOVE THIS LINE ---------------------
  );
  port
  (
    -- ADD USER PORTS BELOW THIS LINE ------------------
    --USER ports added here
    rot_a : in std_logic;
    rot_b : in std_logic;
    rot_center : in std_logic;
    -- ADD USER PORTS ABOVE THIS LINE ------------------


ロータリー・エンコーダのA相(rot_a)、B相(rot_b)、センター・スイッチ(rot_center)を入力ポートとして定義した。

  1. 2011年09月28日 05:37 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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