FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

カテゴリ: XUPV5-LX110T

XilinxのXUPV5-LX110Tを使用したカメラ表示用プラットフォームが完成した。これをベースにいろいろな実験的な回路を実装する予定だ。
カメラはアプティナ社のMT9T031をカメラモジュールとして使用したカメラを購入して使用している。MT9T031は48MHzで動作している。2048x1536ピクセルのCMOSカメラだ。
DVI表示用ICは、XUPV5-LX110Tに搭載されているCH7301Cを使用している。出力画面は、1024x768のXGAでRGB各8ビットずつになっている。
e8117e6f.jpg


08aa9382.jpg


画像はMIGを使用して、DDR2-SDRAMのSO-DIMMモジュールにバッファしている。
141093fd.jpg

(注:ディスプレイ画面は一部、ガウスフィルタでぼかしてあります)

綺麗に映っていると思う。
なお、カメラからのクロックはDCMに入力してはおかしくなるようだ。現在は、BUFGを通して直接内部クロックの1つとして使用している。

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

(2011/06/02:追加)でdvi_de, dvi_hsync, dvi_vsync の出力用FFがIOBにマップされるように変更したが、やはりDVI出力がでない。
dvi_scl, dvi_sdaのCH7301CのI2C関連ピンは、DDR2 SDRAMと同一のFPGAバンクにつながっているので、電圧は1.8Vなのだが、LVCMOS18に設定するとDVI出力がでない。しかし、LVCMOS33に設定するとDVI出力が出る。でもLVCMOS33にしておいてDDR2 SDRAMのピン配置をすると、MAPでIO電圧が違うとErrorになってしまう。非常に困った。
もう一度、1からI2C回路を検証してみると、OmniVison社のCMOSカメラ用のI2CのSCCBはデータシートでSDAのHOLD Timeは0nsに指定されていたので、クロック2つ分の余裕を持たせた。
4654c863.png


HOLD Timeが少ないのではないか?と考えた。ちなみにCH7301C Full Data Sheetにも、CH7301 Registers Read/Write Operation, AN-41.pdf にもI2Cのタイミングの記述はなかった。
試しに、SRL16Eで16クロック分遅延させてみたら、LVCMOS18に指定しても動作するようになった。やはりSCLに対するSDAのHOLD Timeが足りなかったようだ。16クロック×15.38nsec = 246nsec(画面サイズはXGA、ピクセルクロックは65MHz)遅延させた。今回書き加えた分を下に示す。

    -- SLC, SDA を遅延させる
    process(clk) begin
        if clk'event and clk='1' then
            if reset='1' then
                SDA_Delay <= (others => '1');
                SDA_ena_Delay <= (others => '1');
                SCL_Delay <= '1';
            else
                SDA_Delay(2) <= SDA_shift_reg(8);
                SDA_Delay(1) <= SDA_Delay(2);
                SDA_Delay(0) <= SDA_Delay(1);
                SDA_ena_Delay(1) <= SDA_enable;
                SDA_ena_Delay(0) <= SDA_ena_Delay(1);
                SCL_Delay <= SCL_shift_reg(17);
            end if;
        end if;
    end process;
    
    SRL16E_SDA : SRL16E generic map(
        INIT => X"0000")
    port map(
        Q => SDA_Delay_SRL16,
        A0 => '1',
        A1 => '1',
        A2 => '1',
        A3 => '1',
        CE => '1',
        CLK => clk,
        D => SDA_Delay(0)
    );    
    
    SRL16E_SDA_ena : SRL16E generic map(
        INIT => X"0000")
    port map(
        Q => SDA_ena_Delay_SR16,
        A0 => '1',
        A1 => '1',
        A2 => '1',
        A3 => '1',
        CE => '1',
        CLK => clk,
        D => SDA_ena_Delay(0)
    );    
    
    SDA <= SDA_Delay_SRL16 when SDA_ena_Delay_SR16='0' else 'Z';
    SCL <= SCL_Delay;


下にCH7301C関連のUCFを示す。

NET "dvi_d[0]" IOSTANDARD = LVDCI_33;
NET "dvi_d[1]" IOSTANDARD = LVDCI_33;
NET "dvi_d[2]" IOSTANDARD = LVDCI_33;
NET "dvi_d[3]" IOSTANDARD = LVDCI_33;
NET "dvi_d[4]" IOSTANDARD = LVDCI_33;
NET "dvi_d[5]" IOSTANDARD = LVDCI_33;
NET "dvi_d[6]" IOSTANDARD = LVDCI_33;
NET "dvi_d[7]" IOSTANDARD = LVDCI_33;
NET "dvi_d[8]" IOSTANDARD = LVDCI_33;
NET "dvi_d[9]" IOSTANDARD = LVDCI_33;
NET "dvi_d[10]" IOSTANDARD = LVDCI_33;
NET "dvi_d[11]" IOSTANDARD = LVDCI_33;
NET "dvi_de" IOSTANDARD = LVCMOS33;
NET "dvi_hsync" IOSTANDARD = LVDCI_33;
NET "dvi_reset_b" IOSTANDARD = LVCMOS33;
NET "dvi_vsync" IOSTANDARD = LVDCI_33;
NET "dvi_xclk_n" IOSTANDARD = LVCMOS33;
NET "dvi_xclk_p" IOSTANDARD = LVCMOS33;
NET "dvi_xclk_n" DRIVE = 24;
NET "dvi_xclk_p" DRIVE = 24;
NET "dvi_xclk_n" SLEW = FAST;
NET "dvi_xclk_p" SLEW = FAST;
NET "reset_sw" IOSTANDARD = LVCMOS33;
NET "dvi_scl" LOC = U27;
NET "dvi_sda" LOC = T29;
NET "dvi_scl" IOSTANDARD = LVCMOS18;
NET "dvi_sda" IOSTANDARD = LVCMOS18;
NET "dvi_scl" SLEW = FAST;
NET "dvi_sda" SLEW = FAST;
NET "dvi_scl" DRIVE = 24;
NET "dvi_sda" DRIVE = 24;
NET "dvi_scl" TIG;
NET "dvi_sda" TIG;
NET "dvi_scl" PULLUP;
NET "dvi_sda" PULLUP;
INST "dvi_de" IOB = FORCE;
INST "dvi_hsync" IOB = FORCE;
INST "dvi_vsync" IOB = FORCE;


XUPV5-LX110T Development SystemでMIGを試す2”の続きで、シミュレーションを試みた。

ModelSimでシミュレーションを行うらしく、sim.do があったが、ISimでシミュレーションをやってみようということで、example_design\sim フォルダのddr_model.v, ddr2_model_parameters.vh, sim_tb_top.v, wiredly.v をプロジェクトに入れて、Simulationを試みた。
しかし、Activateコマンドを実行したところで止まってしまった。エラーログを下に示す。

sim_tb_top.\gen_cs[0].gen[0].u_mem0 .cmd_task: at time 20718860.0 ps ERROR: Activate Failure. Initialization sequence is not complete.


初期化シーケンスが悪いのか?と思い調べた。調査結果を下に示す。

1.    9129.485 ns     All banks PRECHARGE
2.    10111.985 ns        LOAD MODE        
    BA=2, EMR2 値は0000、1X refresh rate
3.    11094.485 ns    LOAD MODE
    BA=3, EMR3 値は0000
4.    12076.985 ns    LOAD MODE
    BA=1, EMR1 値は0004、Outputs Enable, RDQS Disable, DQS# Enable, OCD exit, Rtt=75Ω, Posted CAS# = 0, Output Drive Strength Full, DLL Enable
5.    13059.485 ns    LOAD MODE
    BA=0, MR 値は0742、Fast exit, Write Recovery = 4, DLL Reast = Yes, CAS Latency = 4, Sequential, Burst Length = 4
6.    14821.985 ns    All banks PRECHARGE
7.    15804.485 ns    REFRESH
8.    16786.985 ns    REFRESH
9.    17769.485 ns    LOAD MODE
    BA=0, MR 値は0642、Fast exit, Write Recovery = 4, DLL Reast = No, CAS Latency = 4, Sequential, Burst Length = 4
10.    18751.985 ns    LOAD MODE
    BA=1, EMR1 値は0384、Outputs Enable, RDQS Disable, DQS# Enable, Enable OCD defaults, Rtt=75Ω, Posted CAS# = 0, Output Drive Strength Full, DLL Enable
11.    19734.485 ns    LOAD MODE
    BA=1, EMR1 値は0004、Outputs Enable, RDQS Disable, DQS# Enable, OCD exit, Rtt=75Ω, Posted CAS# = 0, Output Drive Strength Full, DLL Enable
12.    20716.985 ns    Activate ここでエラーになる。ERROR: Activate Failure. Initialization sequence is not complete.
    BA=0, address=0000
13.    21691.985 ns    Write 当然、ここでもエラー。ERROR: Write Failure. Initialization sequence is not complete.
    BA=0, address=0000、データはFFFFFFFFFFFFFFFFと0000000000000000の繰り返し
14.    21699.485 ns    Write 当然、ここでもエラー。ERROR: Write Failure. Initialization sequence is not complete.
    BA=0, address=0004、データはFFFFFFFFFFFFFFFFと0000000000000000の繰り返し


問題なく初期化シーケンスが実行されている。

原因は何かと探ったら、ddr2_model.vのbaのインスタンスが3ビット、addrのインスタンスが14ビットだった。正しくはbaが2ビット、addrが13ビットで両方共最上位の1ビットの接続がなく、Xとなってしまった。これで、比較演算がうまくいかなくてDDR2 SDRAMモデル(ddr2_model.v)の初期化の認識がうまく行かなかったようだ。

sim.doを見ると、下のようにdefineされていた。

vlog +incdir+. +define+x512Mb +define+sg37E +define+x16 ddr2_model.v



Project NavigatorのDesignのSimulationラジオボタンをクリックして、シミュレーションモードに移行する。Simulation Behavioral Modelを右クリックして、右クリックメニューからProcess Properties...を選択して、ISim Propertiesダイアログを表示する。
-d オプションの欄にx512Mb sg37E x16 を書いてコンパイルし、シミュレーションしてみたが、ba, addrのビット数に変化はなかった。
692701d4.png


次に、ddr2_model_parameters.vh に直接記述した。

`define x512Mb
`define sg37E
`define x16


その結果、ba=2ビット幅、addr=13ビット幅になって正常にシミュレーションが進むようになった。(図を追加)
5089b26c.png


Micron社のメモリモデルはdefineする必要があるのを忘れていた。

#ModelSimはdoファイルでwhen を使ってエラーテストも出来るみたいですね?同じようなことをISimでTCLでできないか?と思って、Helpを見てみたところ、isim condition コマンドで、できそうです。そのうちに試してみようと思います。

XUPV5-LX110T Development SystemでMIGを試す”で、Digilent社のVirtex-5 OpenSPARC Evaluation PlatformでMIGを試してみたが、あくまでも”XUPV5-LX110T Reference Designs ”のMIGデザインをそっくりそのまま、まねただけだった。

MIGのクロック入力の状態を記述する。

・ このMIGデザインは、SMAコネクタのクロック入力J10とJ11から200MHzの差動クロックを入力している。SMAコネクタから入力された差動クロックは、回路図の2ページ右上のH14(SMA_DIFF_CLKIN_P), H15(SMA_DIFF_CLKIN_N)に入力されている。
・ クロックが出力されるのはJ12とJ13で、これは、ICS843001-21から出力された差動クロックだ。回路図9ページ。
・ SW6が設定スイッチとして割り当てられている。SW6が01001010と設定されていると、N0-0, N1-1, N2-0, M0-0, M1-1, M2-0, SEL1-1, SEL0-0 となる。
・ SEL1, SEL0で入力を選択していて、この値の時はTEST_CLK入力となる。TEST_CLKには、25MHzの水晶発振器がつながっている。
・ ICS843001-21は上記の設定だと、25MHz入力、M分周比=24, N分周比=3となって、出力周波数は200MHzとなる。(TABLE 3A. COMMON CONFIGURATIONS TABLE 参照)


結論としては、SMAケーブルでsys_clkを供給しているので、ケーブルを接続している。しかし、ケーブルで接続するのは面倒だ。
fr_476_size580.jpg

SMAケーブルを外したいので、sys_clkとして使える差動200MHzクロックが出ているFPGAのピンを探した。
そうすると回路図の9ページのCLK_BUF_Q1_P, CLK_BUF_Q1_Nに差動200MHzクロックが出ていた。これは、回路図2ページの右上で、FPGAのK18, J19ピンに入力されている。よって下のようにUCFファイルを書き換えた。

NET "sys_clk_p" LOC = "K18" ; #Bank 3
NET "sys_clk_n" LOC = "J19" ; #Bank 3


これで、SMAケーブルを外しても、MIGのデモを行うことができた。

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を下に引用する。
ef0c2279.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”に続く。

↑このページのトップヘ