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

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

FPGAの部屋

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

Virtex4のIDELAY(VARIABLEモード)

Virtex4のIDELAY(VARIABLEモード)についてお勉強した。
今度はCEとINCがあるので外部ポートから入力することにした。CEが1でINCが1の時に遅延が増えて、CEが1でINCが0の時に遅延が減る。2クロックに1回増減するようだ。それを確かめてみよう。
まずはインプリメントして例によってFPGA Editorで見てみる。
Virtex4_IDELAY_V_1_060615.png

IOBDELAY_TYPEがVAERIABLEになっているのがわかる。
Timing Analyzerで見てみるとFIXEDの時と同様である。
Virtex4_IDELAY_V_3_060615.png

次にModelSimで論理シミュレーションをしてみた。テストベンチは上に示したが、CEとINCは1に固定してあるので、2クロックに一回遅延が増えている。
Virtex4_IDELAY_V_4_060615.png

下から5番目のi(入力)と4番目のo(出力)の位相がずれていくのがわかると思う。一番下はdelayの値で4725psから0psになるようだ。他は75psずつ増えている。これで位相シフトすればDDRデータを受けるのが簡単そうだ。FPGAのクロックに合うし。。。だんだんVirtex4ボードが欲しくなって来た。

そういえば1つVirtex4について気づいたことがある。それはチップのIOパッドの位置だ。V2proまではチップの4辺にIOパッドが散らばっていたが、V4では両脇と真ん中にIOパッドが配置されているようだ。V2proではチップの横になるべくデータバスを入れようとか考えていたが、その制限はなすことができるようだ。とはいっても関連する信号を近い位置に配置したほうが良いのは当然だろうけど。下にFPGA Editorで見たチップの真ん中に位置するIOパッドを使っている例と、フロアプランナーの一部を示す。チップの上にIOパッドがない。
Virtex4_IDELAY_V_2_060615.png

Virtex4_IDELAY_V_5_060615.png


最後にソースを下に示す。

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

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


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

architecture RTL of IDELAY_VARIABLE_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 => "VARIABLE",
            IOBDELAY_VALUE => 0
        )
        port map(
            o => delay_out(i),
            i => indata(i),
            c => clk_out,
            ce => idelay_ce,
            inc => idelay_inc,
            rst => iddr_reset
        );
        
        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;


ついでにテストベンチも。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_TEXTIO.ALL;
USE STD.TEXTIO.ALL;

ENTITY IDELAY_VARIABLE_TEST_tb IS
END IDELAY_VARIABLE_TEST_tb;

ARCHITECTURE testbench_arch OF IDELAY_VARIABLE_TEST_tb IS

    COMPONENT IDELAY_VARIABLE_TEST
        PORT (
            clk : In std_logic;
            indata : In std_logic_vector(7 downto 0);
            idelay_ce : in std_logic;
            idelay_inc : in std_logic;
            q1 : Out std_logic_vector(7 downto 0);
            q2 : Out std_logic_vector(7 downto 0)
        );
    END COMPONENT;

    SIGNAL clk : std_logic := '0';
    SIGNAL indata : std_logic_vector(7 downto 0) := "00000000";
    SIGNAL q1 : std_logic_vector(7 downto 0) := "00000000";
    SIGNAL q2 : std_logic_vector(7 downto 0) := "00000000";
    signal idelay_ce : std_logic := '0';
    signal idelay_inc : std_logic := '0';

    constant PERIOD : time := 10 ns;
    constant DUTY_CYCLE : real := 0.5;
    constant OFFSET : time := 0 ns;

    BEGIN
        UUT : IDELAY_VARIABLE_TEST
        PORT MAP (
            clk => clk,
            indata => indata,
            idelay_ce => idelay_ce,
            idelay_inc => idelay_inc,
            q1 => q1,
            q2 => q2
        );

        PROCESS    -- clock process for clk
        BEGIN
            WAIT for OFFSET;
            CLOCK_LOOP : LOOP
                clk <= '0';
                WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE));
                clk <= '1';
                WAIT FOR (PERIOD * DUTY_CYCLE);
            END LOOP CLOCK_LOOP;
        END PROCESS;

        PROCESS begin
               wait for (PERIOD/4);
               DATA_LOOP : LOOP
                   wait for (PERIOD/2);
                   indata <= indata + 1;
                end loop;            
        END PROCESS;
        
        idelay_ce <= '1';
        idelay_inc <= '1';

    END testbench_arch;

  1. 2006年06月16日 19:10 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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