FC2カウンター FPGAの部屋 DVI、HDMIの勉強7(キャラクタ・ディスプレイ・コントローラをDVI出力にする VHDL編2)
FC2ブログ

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

FPGAの部屋

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

DVI、HDMIの勉強7(キャラクタ・ディスプレイ・コントローラをDVI出力にする VHDL編2)

”DVI、HDMIの勉強4(キャラクタ・ディスプレイ・コントローラをDVI出力にする VHDL編1)”の続き。

今回は、SVGA(800x600)とXGA(1024x768) 解像度が表示できるかどうかを確かめてみた。おまけでSXGA(1280x1024)もやってみた。

・SVGA解像度
まずは、SVGAから。
修正部分を示す。画像のパラメータを記述してあるdisp_timing_parameters.vh をSVGA用に変更した。

// SVGA 解像度
parameter H_ACTIVE_VIDEO= 800;
parameter H_FRONT_PORCH = 40;
parameter H_SYNC_PULSE = 128;
parameter H_BACK_PORCH = 88;
parameter H_SUM = H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;

parameter V_ACTIVE_VIDEO = 600;
parameter V_FRONT_PORCH = 1;
parameter V_SYNC_PULSE = 4;
parameter V_BACK_PORCH = 23;
parameter V_SUM = V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;


次に、キャラクタを表示するCharDispCtrlerTest.vhd のアドレスをSVGA用に増やした。

    process(clk) begin -- キャラクタコードを+1して表示
        if clk'event and clk='1' then
            if reset='1' then
                processor_addr <= (others => '0');
            else
                if ena='1' then
                    -- if processor_addr=CONV_STD_LOGIC_VECTOR(4799, 13) then -- 終了(VGA)
                    if processor_addr=CONV_STD_LOGIC_VECTOR(7499, 13) then -- 終了(SVGA)
                        processor_addr <= (others => '0');
                    else
                        processor_addr <= processor_addr + 1;
                    end if;
                end if;
            end if;
        end if;
    end process;
    


最後に、pixclk_gen のCLK_OUT2 を40MHz に変更した。
これでインプリメントしたらSVGA解像度で動作した。
DVI_HDMI_11_120223.jpg

・XGA解像度
次に、XGAでやってみた。
修正部分を示す。画像のパラメータを記述してあるdisp_timing_parameters.vh をXGA用に変更した。

parameter H_ACTIVE_VIDEO= 1024;
parameter H_FRONT_PORCH = 24;
parameter H_SYNC_PULSE = 136;
parameter H_BACK_PORCH = 160;
parameter H_SUM = H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;

parameter V_ACTIVE_VIDEO = 768;
parameter V_FRONT_PORCH = 2;
parameter V_SYNC_PULSE = 6;
parameter V_BACK_PORCH = 29;
parameter V_SUM = V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;


キャラクタを表示するCharDispCtrlerTest.vhd のアドレスをXGA用に増やそうとしたが、足りなかった。仕方がないので、最大の8191に変更した。XGA用には12,287に設定したいところだ。これで画面の下は、フレーム・バッファが足りずにミラー・イメージが出てしまう。

    process(clk) begin -- キャラクタコードを+1して表示
        if clk'event and clk='1' then
            if reset='1' then
                processor_addr <= (others => '0');
            else
                if ena='1' then
                    -- if processor_addr=CONV_STD_LOGIC_VECTOR(4799, 13) then -- 終了(VGA)
                    -- if processor_addr=CONV_STD_LOGIC_VECTOR(7499, 13) then -- 終了(SVGA)
                    if processor_addr=CONV_STD_LOGIC_VECTOR(8191, 13) then -- 足りないが終了(XGA)
                        processor_addr <= (others => '0');
                    else
                        processor_addr <= processor_addr + 1;
                    end if;
                end if;
            end if;
        end if;
    end process;


pixclk_gen のCLK_OUT2 を65MHz に変更した。この変更により、CharDispCtrlerTest_HDMI.vhdのdvi_disp.vhd のgeneric map の値を変更した。65MHzを20倍すると1000MHzを超えてしまうので、PLL_CLKFBOUT_MULTを10倍に変更した。それに応じて他のパラメータも変更した。

    dvi_disp_inst : dvi_disp generic map (

        PLL_CLKFBOUT_MULT    => 10,    -- XGA
        PLL_CLKIN_PERIOD    => 15.4,
        PLL_CLKOUT0_DIVIDE    => 1,
        PLL_CLKOUT1_DIVIDE    => 10,
        PLL_CLKOUT2_DIVIDE    => 5
    ) port map (


これでインプリメントしたらXGA解像度で動作した。
DVI_HDMI_12_120223.jpg


SVGAでもXGAでも問題なく表示できるようだ。
これでHDMIコネクタからDVI出力することができたので、SVGA解像度に戻して、キャラクタ・ディスプレイ・コントローラとして、AXI4バスにラッパーを作って接続してみようと思う。

(追加)
・SXGA解像度
SXGAはピクセルクロックが108MHzで10倍すると1080MHzなので、Spartan-6の-2スピードグレードだと、インプリメントでエラーになるが、-3スピードグレードに設定すると、インプリメントが通る。-2スピードグレードのFPGAを-3スピードグレードに偽って設定しているため、その他のタイミングでミスる可能性もあるが、やってみた。

画像のパラメータを記述してあるdisp_timing_parameters.vh をSXGA用に変更した。

// SXGA 解像度
parameter H_ACTIVE_VIDEO= 1280;
parameter H_FRONT_PORCH = 48;
parameter H_SYNC_PULSE = 112;
parameter H_BACK_PORCH = 248;
parameter H_SUM = H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;

parameter V_ACTIVE_VIDEO = 1024;
parameter V_FRONT_PORCH = 1;
parameter V_SYNC_PULSE = 3;
parameter V_BACK_PORCH = 38;
parameter V_SUM = V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;


キャラクタを表示するCharDispCtrlerTest.vhd のアドレスはXGAと同一だ。

CharDispCtrlerTest_HDMI.vhdのdvi_disp.vhd のgeneric map の値はXGAと同様に、PLL_CLKFBOUT_MULTを10倍に変更して、それに応じて他のパラメータも変更した。

pixclk_gen のCLK_OUT2 を108MHz に変更した。

インプリメントすると動作した。2時間くらい連続運転しているが大丈夫のようだ。案外行けるのかも?でも、ボード個体によってはダメかも知れないし、もっとリソースを使ってくるとだめになるかもしれない。いずれにせよリスキーだ。
下に、SXGA解像度の画面を貼っておく。
DVI_HDMI_13_120223.jpg

SXGAになると、本当に字が細かいですね。見を凝らさないと見えません。(老眼です)

  1. 2012年02月23日 04:49 |
  2. DVI, HDMI
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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