FC2カウンター FPGAの部屋 XUPV5-LX110T

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

FPGAの部屋

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

カメラ表示用プラットフォームが完成

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

CamDispPH_2_110624.jpg

画像はMIGを使用して、DDR2-SDRAMのSO-DIMMモジュールにバッファしている。
CamDispPH_3_110624.jpg
(注:ディスプレイ画面は一部、ガウスフィルタでぼかしてあります)

綺麗に映っていると思う。
なお、カメラからのクロックはDCMに入力してはおかしくなるようだ。現在は、BUFGを通して直接内部クロックの1つとして使用している。
  1. 2011年06月24日 04:44 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

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

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つ分の余裕を持たせた。
SCCB_block_fig_3_091216.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;


  1. 2011年06月06日 14:19 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

XUPV5-LX110T Development SystemでMIGを試す3(ISimでシミュレーション)

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のビット数に変化はなかった。
XPUV5-LX110T_MIG_1_110512.png

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

`define x512Mb
`define sg37E
`define x16


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

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

#ModelSimはdoファイルでwhen を使ってエラーテストも出来るみたいですね?同じようなことをISimでTCLでできないか?と思って、Helpを見てみたところ、isim condition コマンドで、できそうです。そのうちに試してみようと思います。
  1. 2011年05月12日 16:39 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

XUPV5-LX110T Development SystemでMIGを試す2

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のデモを行うことができた。
  1. 2011年05月06日 17:20 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

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

XUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラ

XUPV5-LX110TにCMOSカメラを付ける準備段階として、DVI-Iに出力してみようということで、キャラクタ・ディスプレイ・コントローラをXUPV5-LX110Tに移植している。同じCH7301Cの載っているSP605では、キャラクタ・ディスプレイ・コントローラで文字を表示できているので、簡単だと思っていた。
Spartan-6のSP605では、IOBのDDRレジスタはODDR2プリミティブだが、Virtex-5ではODDRプリミティブなので、それに変更してやってみたが動作しない。いろいろ出力ドライブ電流などの制約を変えてコンフィグレーションしていると、一度だけキャラクタが出力できた。やはり、回路的には間違ってなくて、何かのタイミングで表示できないようだ。ちなみに、だめな時はNO SIGNALになってしまう。
なぜ、SP605では表示できていて、XUPV5-LX110Tではだめなのか?がわかないが、”XPS Thin Film Transistor (TFT) Controller (v2.00a)”の6ページのTable 2: Chrontel CH-7301 Configuration Register Descriptionを見ると、CH7301Cの設定レジスタを設定する必要があるようだ。そこで、CH7301Cの設定レジスタを設定する回路を付加することにした。
CH7301CのWebサイトAN-41を見てみたが、このプロトコルだと、すでにOmivision社のSCCB設定レジスタを設定する回路を作ってあるので、そのアドレスを変更すれば良いようだ。XUPV5-LX110TやSP605のCH7301CのASはGNDに落ちているので、レジスタをWriteするためのDevice IDは0xEC番地になる。
そこを変更すればプロトコル的には同一のようなので、この回路を付加して、”XPS Thin Film Transistor (TFT) Controller (v2.00a)”の6ページのTable 2: Chrontel CH-7301 Configuration Register Descriptionの設定値を参考に設定してみることにする。

(2011/04/25:追加)
CH7301CにI2C回路を追加して、設定したところ表示ができました。やはり設定が必要のようです。よかったです。
XUPV5-LX110T_ChaDispC_1_110425.jpg

XUPV5-LX110T_ChaDispC_2_110425.jpg
  1. 2011年04月23日 21:07 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

XUPV5-LX110T Development SystemのFPGAの放熱

前回、”XUPV5-LX110T Development SystemでMIGを試す”でXUPV5-LX110T Development SystemでMIGを試してみた。
その際に、FPGAののダイ温度がヒートシンク付きで83度を超えてしまった。

下が標準で付いていたFPGAのヒートシンクをみることが出来るボード写真だ。
fr_436_size580.jpg

真ん中にある銀色のアルミ加工物がヒートシンクで、大きさは35mm X 35mm X 10mm。
これだと、MIG3.6のサンプル回路を動作させると、FPGAののダイ温度がヒートシンク付きで83度を超えてしまう。
ML509_MIG_2_110204.png

個のヒートシンクでは役不足なので、チップセットクーラーを付けることにした。選択したチップセットクーラーのファンは+12V動作だった。このボードの電源は最大+5Vだった。ファンを+5Vで駆動できるか試してみたが、回り始めなかった。そこで、RSで+5Vのファンを購入して付け替えた。熱伝導性の高いヒートシンク貼りつけ用の両面テープを使用している。
ボードにファン付きのごついヒートシンクを付けたところ。
fr_476_size580.jpg

付け替えたら、FPGAのダイ温度が40度程度で安定した。やはり、ファン付きのヒートシンクが必要のようだ。
ML509_MIG_6_110325.png

  1. 2011年03月25日 20:59 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0
»