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

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

FPGAの部屋

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

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

コメント

コメントの投稿


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

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