FC2カウンター FPGAの部屋 The Simple MicroBlaze Microcontroller 8 (ロータリーエンコーダの実装)
FC2ブログ

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

FPGAの部屋

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

The Simple MicroBlaze Microcontroller 8 (ロータリーエンコーダの実装)

前回の”The Simple MicroBlaze Microcontroller 7 (50MHzから25MHzへクロックを変更)”でクロック周波数を50MHzから25MHzに変更してみたが、今度は目的の”Spartan-3A Starter Kitによる画像演奏装置”にロータリーエンコーダの制御回路と一緒に組み込んだ。だが、まだ、目的のSCCB設定レジスタを制御するように変更してはいない。それは今、修正中だ。

さて、ロータリーエンコーダをled_ref.vhdの中に下のように組み込んだ。ついでに、いつまでもled_ref.vhdではないので、ファイル名もlcd_rot_cont.vhdに変更した。(ついでにCのソフトウェアのファイル名もlcd_rot_cont.cに変更した)

    -- ロータリーエンコーダ
    rot_enc_cont_i : rot_enc_cont port map(
        clk => clk,
        reset => 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
    );


SMMのDIN入力は下のように変更した。

DIN (0) <= Button_S_int;
DIN (1) <= right_pulse;
DIN (2) <= left_pulse;
DIN (3) <= rot_center;
DIN (4 to 31) <= (others => '0') ; -- Not used


更に、ロータリーエンコーダのセンタースイッチを押すと、LCDにrot_center と表示するように、SMMのソフトウェアを変更した。同様にロータリーエンコーダを右に回すとright_pulse、左に回すとleft_pulseと表示するようにした。そうすると、ロータリーエンコーダのセンタースイッチは反応して、LCDにrot_center と表示されるが、他は表示されない。
そうだ、pulseは1パルスのみ出力するんだった。これではSMMが検知できないということでハンドシェークすることにした。どうしたかというと、right_pulse, left_pulse をホールドするFF (right_hold, left_hold) を付けて、それらをクリアする書き込みアドレスを用意した。

    -- right_pulse, left_pulse をホールドするFF
    process(clk) begin
        if clk'event and clk='1' then
            if Reset='1' then
                right_hold <= '0';
                left_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;
            end if;
        end if;
    end process;


CS_rot_enc_wr <= '1' when ((ADDR = X"0030") and CS = '1' and RNW = '0') else '0' ;


DIN (0) <= Button_S_int;
DIN (1) <= right_hold;
DIN (2) <= left_hold;
DIN (3) <= rot_center;
DIN (4 to 31) <= (others => '0') ; -- Not used


lcd_rot_cont.cの関連するソフトウェアは下。

    while (1) {
        while (1){
            button_push = XIo_In8(STATUS_ADDR);
            if (button_push == 0x10break;
            else if (button_push == 0x20break;
            else if (button_push == 0x40break;
        }

        // Clear the LCD
        lcd_clear();

        // Print to the LCD
        if (button_push == 0x10){
            lcd_print(1"rot_center ON");
        } else if (button_push == 0x40){ // right -> left
            XIo_Out32(ROT_ENC_ADDR, 0);
            lcd_print(2"left_pulse");
        } else if (button_push == 0x20){ // left -> right
            XIo_Out32(ROT_ENC_ADDR, 0);
            lcd_print(2"right_pulse");
        }
    }


上のソフトウェアで、leftとrightが逆だが、最初は右に回すとleft_pulseと表示されて、左に回すとright_pulseと表示されてしまったので、どうやら逆のようだったので、ソフトウェアの方で反対にした。
下に表示の様子を示す。
SMM_37_101207.jpg
SMM_38_101207.jpg
SMM_39_101207.jpg

これで、ロータリーエンコーダと組み合わせての表示はOKなので、今度はSCCBレジスタ設定回路を修正して、SMMからのコマンドを受け付けるようにするつもりだ。
  1. 2010年12月07日 04:45 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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