FC2カウンター FPGAの部屋 Virtex4のリージョナルバッファ(BUFIO、BUFR)
FC2ブログ

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

FPGAの部屋

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

Virtex4のリージョナルバッファ(BUFIO、BUFR)

Virtex4のリージョナルバッファのBUFIO、BUFRをテストしてみようと思う。
リージョナルバッファは部分的な領域のクロックバッファのようなものだ。部分的なクロック領域はVitex2シリーズとは違ってCLB16個(IOB32個分)の高さ、チップの1/2の幅に固定されているそうです。
DDR SDRAMのDQS信号でデータをサンプルする方法2はVirtex2proチップでDQSをクロックとしたSRL16E(ルックアップテーブル)を使用してFIFOを構成してみた。その場合にクロックはローカル配線を使用しているので、場所によっては遅延が増えることが考えられる。注意してクロックの遅延が変わらないところにSRL16Eを配置しなければならないだろう。
これをVirtex4のBUFIO、BUFRでその領域にクロックを供給することにしようとする。それで以前の結果と比較してみる。
まずはソースを下に示す。

-- 8bit LUT FIFO 

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 lut_fifo is
    port (
        clk: IN std_logic;
        areset : in std_logic; -- async reset
        sreset : in std_logic; -- sync reset
        din: IN std_logic_vector(7 downto 0);
        wr_en: IN std_logic;
        rd_en: IN std_logic;
        dout: OUT std_logic_vector(7 downto 0);
        full: OUT std_logic;
        empty: OUT std_logic);
end lut_fifo;

architecture RTL of lut_fifo is
component SRL16E
    port (
        q : out std_logic;
        a0 : in std_logic;
        a1 : in std_logic;
        a2 : in std_logic;
        a3 : in std_logic;
        ce : in std_logic;
        clk : in std_logic;
        d : in std_logic
    );
END component;
component BUFIO
    port(
        o : out std_ulogic;
        i : in std_ulogic
    );
end component;
component BUFR
    generic(
        BUFR_DIVIDE : string := "BYPASS"
    );
    port(
        o : out std_ulogic;
        ce : in std_ulogic;
        clr : in std_ulogic;
        i : in std_ulogic
    );
end component;
        
signal addr : std_logic_vector(3 downto 0);
signal clk_bufio, clk_bufr : std_logic;
signal logic0, logic1 : std_logic;
begin
    logic0 <= '0';
    logic1 <= '1';
    
    bufio_inst : bufio port map(
        i => clk,
        o => clk_bufio
    );
    
    bufr_inst : bufr port map(
        o => clk_bufr,
        ce => logic1,
        clr => logic0,
        i => clk_bufio
    );
    
    DIST_FIFO_GEN : for i in 0 to 7 generate
        SRL16E_inst : SRL16E port map(
            q => dout(i),
            a0 => addr(0),
            a1 => addr(1),
            a2 => addr(2),
            a3 => addr(3),
            ce => wr_en,
            clk => clk_bufr,
            d => din(i)
        );
    end generate DIST_FIFO_GEN;
    
    empty <= '1' when addr=0 else '0';
    full <= '1' when addr=15 else '0';
    
    process(clk_bufr, areset) begin
        if areset='1' then
            addr <= (others => '0');
        elsif clk_bufr'event and clk_bufr='1' then
            if sreset='1' then
                addr <= (others => '0');
            elsif wr_en='1' and rd_en='0' then
                addr <= addr + 1;
            elsif wr_en='0' and rd_en='1' then
                addr <= addr - 1;
            end if; -- wr_en='1' and rd_en='1'の時はaddrはそのまま
        end if;
    end process;

end RTL;


まずは、SEのProcessesウインドウのUser Constraintsを展開してAssgin Package PinsをダブルクリックしてPACEを起動してピンをアサインしよう。
BUFIO_BUFR_4_060622.png

次にBUFRだけをBUFR_X0Y11にアサインする。

NET "areset"  LOC = "D16"  ;
#INST "bufio_inst" LOC = "BUFIO_X0Y11"  ;
INST "bufr_inst" LOC = "BUFR_X0Y11"  ;
NET "clk"  LOC = "D18"  ;
NET "din<0>"  LOC = "B17"  ;
NET "din<1>"  LOC = "A17"  ;
NET "din<2>"  LOC = "E17"  ;
NET "din<3>"  LOC = "F17"  ;
NET "din<4>"  LOC = "A18"  ;
NET "din<5>"  LOC = "A19"  ;
NET "din<6>"  LOC = "C18"  ;
NET "din<7>"  LOC = "C19"  ;
NET "dout<0>"  LOC = "D19"  ;
NET "dout<1>"  LOC = "F18"  ;
NET "dout<2>"  LOC = "E18"  ;
NET "dout<3>"  LOC = "B19"  ;
NET "dout<4>"  LOC = "A20"  ;
NET "dout<5>"  LOC = "H18"  ;
NET "dout<6>"  LOC = "J19"  ;
NET "dout<7>"  LOC = "B20"  ;
NET "empty"  LOC = "B21"  ;
NET "full"  LOC = "D20"  ;
NET "rd_en"  LOC = "C17"  ;
NET "sreset"  LOC = "H17"  ;
NET "wr_en"  LOC = "G17"  ;


これでインプリメントしてとりあえずFPGA Editorで見てみる。全体の回路を見渡せる位置にして、BUFRの出力ネット(clk_bufr)を赤で表示してみるとクロック専用ラインを使用しているのがわかる。
BUFIO_BUFR_2_060622.png

Virtex2proのものと比べてみよう。こっちのほうはクロックに遅延が入っているが、Virtex4はIDELAYで遅延を入れられるし、データの方を遅延することも出来るので、同様に比較する。下のがVirtex2proの時のクロック配線だ。
ddr_receive_2_060418.png

次に例によってTiming Analyzerで遅延を見てみよう。クロックのIOパッドからの遅延とデータのIOパッドからの遅延を見てみよう。
BUFIO_BUFR_1_060622.png

クロックのほうがバッファが2つ入っている分遅れている。うまく調整すればDQS(クロック)でデータを取れるだろう。Virtex4はデータをIDELAYで遅らせてFPGAの内部クロックでサンプルしても良いが、DQS(クロック)でデータをサンプルする方法でも安定しているようだ。
これをやっていて納得いかないことがある。BUFIOとBUFRを近くに配置しようとしていたが、配置するとエラーが出てしまう。UCFの#コメントアウトした部分がそうだ。(INST "bufio_inst" LOC = "BUFIO_X0Y11" ;)
BUFIO,BUFRの部分をFPGA Editorで見てみよう。
BUFIO_BUFR_3_060622.png

XC4LX25-11FF676の現在使用中のリージョンのリージョナルクロックのクロック入力はC18,C19とD18,D19だが、FPGA Editorで良く見てみるとC18,C19はX0Y11のBUFIO、D18,D19はX0Y10のBUFIOに行く配線しかないようだ。
やはりVirtex4のリージョナルクロックはちゃんと使えれば使い勝手が良いようだ。
  1. 2006年06月22日 20:32 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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