FC2カウンター FPGAの部屋 XUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラのラッパー・ソースファイル
fc2ブログ

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

FPGAの部屋

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

XUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラのラッパー・ソースファイル

XUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラ”でXUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラを実装して、CH7301Cの設定レジスタを設定して液晶ディスプレイにキャラクタを表示することができた。
表示ドット数は640×480ドットのVGAサイズでピクセルクロックは25MHz。下に表示タイミングの定義を記述したpackageファイルを示す。

-- 表示タイミングの定義

library ieee;
use ieee.std_logic_1164.all;

package disp_timing_pack is
    constant H_ACTIVE_VIDEO : integer := 640;
    constant H_FRONT_PORCH : integer := 16;
    constant H_SYNC_PULSE : integer := 96;
    constant H_BACK_PORCH : integer := 48;
    constant H_SUM : integer := H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;

    constant V_ACTIVE_VIDEO : integer := 480;
    constant V_FRONT_PORCH : integer := 11;
    constant V_SYNC_PULSE : integer := 2;
    constant V_BACK_PORCH : integer := 31;
    constant V_SUM : integer := V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;

    constant H_DISPLAY_SIZE : integer := H_ACTIVE_VIDEO/8; -- 横80桁
    constant V_DISPLAY_SIZE : integer := V_ACTIVE_VIDEO/8; -- 縦60行
end disp_timing_pack;


Spartan-6を使用したSP605ボードで同様にキャラクタ・ディスプレイ・コントローラを実装して、キャラクタを液晶ディスプレイに表示した。これは、予め他のコンフィグレーションファイルがロードされていたからのようだ?電源ONの時に液晶ディスプレイに模様が表示がされていた。この設定を使ったので、CH7301Cの設定レジスタは設定されてたようだ。参考資料を下に示す。
SP605でキャラクタ・ディスプレイ・コントローラ3(実機でテスト)
SP605でキャラクタ・ディスプレイ・コントローラ4(CH7301C用のラッパー・ソースファイル)
SP605でもCH7301Cの設定レジスタを設定するべきだと思う。

現在使用しているCH7301Cの設定レジスタの設定値は、”XPS Thin Film Transistor(TFT) Controller (v2.00a)”の6ページの”Table 2: Chrontel CH-7301 Configuration Register Description”と同一の設定値を使用している。Table 2: Chrontel CH-7301 Configuration Register Descriptionを下に引用する。
XUPV5-LX110T_CDispC_1_110426.png

CH7301Cの設定レジスタを設定する回路は、OV7670のSCCB設定レジスタの設定回路のID_ADDRESSを0xECに変更して使用した。
SCCB設定レジスタ設定回路の資料。
SCCBインタフェース回路の実装1(タイミングチャート)
SCCBインタフェース回路の実装2(ブロック図の作成)
SCCBインタフェース回路の実装3(シミュレーション)
SCCBインターフェース回路の説明1(SCCB_Reg_Controller.vhd)
SCCBインターフェース回路の説明2(freqdiv.vhd、SCCB_reg_values_ROM.vhd)
SCCBインターフェース回路の説明3(One_Transaction_SCCB.vhd)
更に、OV9655のID_ADDRESSに書き換えたときの参考資料がここにある。

さて、CH7301Cへ出力している部分のラッパー・ソースファイルを下に示す。(2012/07/23:追記 ODDRの設定をミスっていました。VGA_RED, VGA_GREEN, VGA_BLUEがclk0 に同期しているのであれば、ODDRプリミティブをSAME_EDGEモードにする必要があります。下のラッパー・ソースファイルを書き換えました)

-- CharDispCtrlerTest.vhd

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;

library unisim;
use unisim.vcomponents.all;

entity CharDispCtrlerTest is
    port(
        clk : in std_logic;
        reset : in std_logic;
--        dvi_reset : in std_logic;
        
        dvi_xclk_p : out std_logic;    
        dvi_xclk_n : out std_logic;
        dvi_reset_b : out std_logic;
        dvi_hsync : out std_logic;
        dvi_vsync : out std_logic;
        dvi_de : out std_logic;
        dvi_d : out std_logic_vector(11 downto 0);
        dvi_sda : out std_logic;
        dvi_scl : out std_logic
    );
end CharDispCtrlerTest;

architecture RTL of CharDispCtrlerTest is

...

    -- CH7301C へ出力する
    dvi_reset_b <= '1';
    
    ODDR_dvi_xclk_p :  ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_xclk_p,
        C => clk90,
        CE => '1',
        D1 => '1',
        D2 => '0',
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_xclk_n : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '1',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_xclk_n,
        C => clk90,
        CE => '1',
        D1 => '0',
        D2 => '1',
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d0 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(0),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[0]
        D2 => VGA_GREEN, -- G[4]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d1 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(1),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[1]
        D2 =>VGA_GREEN, -- G[5]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d2 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(2),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[2]
        D2 => VGA_GREEN, -- G[6]
        R => reset_node,
        S => '0'
    );

    ODDR_dvi_d3 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(3),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[3]
        D2 => VGA_GREEN, -- G[7]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d4 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(4),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[4]
        D2 => VGA_RED, -- R[0]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d5 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(5),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[5]
        D2 => VGA_RED, -- R[1]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d6 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(6),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[6]
        D2 => VGA_RED, -- R[2]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d7 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(7),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[7]
        D2 => VGA_RED, -- R[3]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d8 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(8),
        C => clk0,
        CE => '1',
        D1 => VGA_GREEN, -- G[0]
        D2 => VGA_RED, -- R[4]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d9 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(9),
        C => clk0,
        CE => '1',
        D1 => VGA_GREEN, -- G[1]
        D2 => VGA_RED, -- R[5]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d10 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(10),
        C => clk0,
        CE => '1',
        D1 => VGA_GREEN, -- G[2]
        D2 => VGA_RED, -- R[6]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d11 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(11),
        C => clk0,
        CE => '1',
        D1 => VGA_GREEN, -- G[3]
        D2 => VGA_RED, -- R[7]
        R => reset_node,
        S => '0'
    );
    
    -- I2C 設定レジスタ設定回路
    I2C_setting_inst : SCCB_Reg_Controller port map(
        clk => clk0,
        reset => reset_node,
        SCL => dvi_scl,
        SDA => dvi_sda
    );
end RTL;


(2011/06/02:追加)
dvi_de, dvi_hsync, dvi_vsync の出力用FFがIOBにマップされないと画面が表示されないので、UCFファイルに下の制約を追加する。

INST "dvi_de" IOB = FORCE;
INST "dvi_hsync" IOB = FORCE;
INST "dvi_vsync" IOB = FORCE;


XUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラのラッパー・ソースファイル2”に続く。
  1. 2011年04月26日 05:55 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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