FC2カウンター FPGAの部屋 Virtex4のIDELAY(FIXEDモード)
FC2ブログ

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

FPGAの部屋

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

Virtex4のIDELAY(FIXEDモード)

次はVirtex4のIDELAYのお勉強をしようとおもう。IDELAYはILOGICブロック(IOブロック)のプログラマブル遅延エレメントで0から63までの遅延タップがある。
IDELAYのゼロホールド時間遅延モード(DEFAULTモード)は遅延が0なので飛ばして、固定遅延モード(FIXEDモード)をやってみようと思う。
DDR SDRAMに使えるようにIDELAYをインスタンスしてからIDDRをインスタンスする。クロックはコアジェネレータでDCMをインスタンスして使用している。IDELAYを固定遅延モード(FIXEDモード)で使用しているので、IDELAYCTRLをインスタンスしている。全ソースを下に示す。(遅延タップは31)

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.

-- pragma translate off
library UNISIM;
use UNISIM.VComponents.all;
--pragma translate on

entity idelay_fixed_test is
    Port (
        clk : in std_logic;
        indata : in  std_logic_vector(7 downto 0);
        q1 : out  std_logic_vector(7 downto 0);
        q2 : out  std_logic_vector(7 downto 0);
        rdy : out std_logic
    );
end idelay_fixed_test;

architecture RTL of idelay_fixed_test is
component IDELAY
  generic(
      IOBDELAY_TYPE  : string := "FIXED";
      IOBDELAY_VALUE : integer := 0
  );
  port(
      O      : out std_ulogic;

      C      : in  std_ulogic;
      CE     : in  std_ulogic;
      I      : in  std_ulogic;
      INC    : in  std_ulogic;
      RST    : in  std_ulogic
      );
end component;
component IDELAYCTRL
  port(
      RDY    : out std_ulogic;

      REFCLK    : in  std_ulogic;
      RST    : in  std_ulogic
  );
end component;
component IDDR
    generic(
        DDR_CLK_EDGE : string := "OPPOSITE_EDGE";
        INIT_Q1 : bit := '0';
        INIT_Q2 : bit := '0';
        SRTYPE : string := "SYNC"
    );
    port(
        Q1 : out std_ulogic;
        Q2 : out std_ulogic;
        C : in std_ulogic;
        CE : in std_ulogic;
        D : in std_ulogic;
        R : in std_ulogic;
        S : in std_ulogic
    );
end component;
    COMPONENT dcm133
    PORT(
        CLKIN_IN : IN std_logic;          
        CLKIN_IBUFG_OUT : OUT std_logic;
        CLK0_OUT : OUT std_logic;
        LOCKED_OUT : OUT std_logic
        );
    END COMPONENT;

signal logic0, logic1 : std_logic;
signal iddr_reset : std_logic;
signal locked_out, clk_out : std_logic;
signal delay_out : std_logic_vector(7 downto 0);
begin
    logic0 <= '0';
    logic1 <= '1';
    iddr_reset <= not locked_out;
    
    dcm133_inst : dcm133 port map(
        clkin_in => clk,
        clkin_ibufg_out => open,
        clk0_out => clk_out,
        locked_out => locked_out
    );
    
    IDDR_GEN : for i in 7 downto 0 generate
        IDELAY_inst : IDELAY 
        generic map(
            IOBDELAY_TYPE => "FIXED",
            IOBDELAY_VALUE => 0
        )
        port map(
            o => delay_out(i),
            i => indata(i),
            c => logic0,
            ce => logic0,
            inc => logic0,
            rst => logic0
        );
        
        IDDR_inst : IDDR generic map(
            DDR_CLK_EDGE => "SAME_EDGE_PIPELINED"
        )port map(
            Q1 => q1(i),
            Q2 => q2(i),
            C => clk_out,
            CE => logic1,
            D => delay_out(i),
            R => iddr_reset,
            S => logic0
        );
    end generate IDDR_GEN;
    
    IDELAYCTRL_inst : IDELAYCTRL port map(
        rdy => rdy,
        refclk => clk_out,
        rst => iddr_reset
    );

end RTL;


どのようにILOGICがインスタンスされているか見てみよう。
FPGA Editorを起動してみてみる。
Virtex4_IDELAY_1_060612.png

黄色の矢印がIDELAYだ。IDDRをテストした時よりもこれが増えている。IOBDELAY_VALUE => 31というのがこの図からもわかる。
次にTiming AnalyzerでIDELAYの遅延を見てみよう。
Virtex4_IDELAY_VAL31_060612.png

ピンクのアンダーラインを引いたところがIDELAYの遅延だ。3.042ns遅延が挿入されている。
IOBDELAY_VALUE => 30にしてインプリメントし、同様にTiming AnalyzerでIDELAYの遅延を見てみる。
Virtex4_IDELAY_VAL30_060612.png

IDELAYの遅延は2.967nsで、先ほどの3.042nsと比べてみると0.075ns違っている。
試しにIOBDELAY_VALUE => 0にしてインプリメントして、同様にTiming AnalyzerでIDELAYの遅延を見てみた。
Virtex4_IDELAY_VAL0_060612.png

IDELAYの遅延は0.717nsだ。
IOBDELAY_VALUE => 30の遅延時間からIOBDELAY_VALUE => 0の遅延時間を引いて30で割ってみると、(2.967-0.717)/30=0.075(ns)。
Virtex4はSpartan3Eの遅延と違って値が1違うときっちり75ps違うようである。
これならば遅延素子として使いやすい。

ちなみにVirtex4ユーザーズガイドの321ページあたりにVHDLのインスタンスの書き方が載っている。そこではIDELAYプリミティブのCとRSTポートにクロックとリセットを入れる様に書いてある。その通りに書いたところなぜかMAPにERRORでけられた。ERRORメッセージを見たところCとRSTポートはGNDにしなければだめなようだ。ユーザーズガイドとISEが合わなくなっているようだ。今回は両方ともlogic0を入れてMAPを通した。
ユーザーズガイドの最新英語版をみても同じだったので、まだ直っていないようだ。早く直してもらいたいものだ。
  1. 2006年06月12日 23:00 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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