FC2カウンター FPGAの部屋 FPGA同期リセット変更(PCI-Xテスト・モジュール)
FC2ブログ

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

FPGAの部屋

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

FPGA同期リセット変更(PCI-Xテスト・モジュール)

FPGAの非同期リセットと同期リセットの比較は終わって、同期リセットの方がよいということになった。PCI-Xテスト・モジュールも大体完成したので、これを同期リセットに直すことにした。
それで、直したのだが、どうもタイミング制約が満足できない。
まずはADが満足できない。それは、出力バッファのイネーブル制御がIOBのFFに入らなくなってしまったためのようだ。元の(非同期リセットの)ADの宣言や関係している部分を抜き出すと、下のようになる。
ちなみに使っている論理合成ツールはSynplify Pro 8.5, ISEは9.1SP3。

        ad : inout std_logic_vector(63 downto 0); -- アドレスとデータ

signal pcix_dout_ena, master_dout_ena : std_logic;

attribute syn_useioff of pcix_dout_ena : signal is true;

    process(reset, pcix_clk) begin -- ADのイネーブルをIOBに入れる
        if reset='1' then
            pcix_dout_ena <= '0';
        elsif pcix_clk'event and pcix_clk='1' then
            pcix_dout_ena <= target_dout_ena or master_dout_ena;
        end if;
    end process;
    process(pcix_dout, pcix_dout_ena) begin -- PCIX_ADへの出力トライステート・バッファ
        if pcix_dout_ena='1' then
            ad <= pcix_dout;
        else
            ad <= (others => 'Z');
        end if;
    end process;


1行目はADの入出力ポート宣言、2行目はpcix_dout_enaの宣言、3行目はsyn_useioffを宣言して各ADのIOBに出力バッファのイネーブル制御用FFをインスタンシエーションするように指定している。4行目からはVHDLコード。これで各ADのIOBに出力バッファのイネーブル制御用FFをインスタンシエーションすることができている。
PCI_AD10_IOB_AR_071221.png

Timing Analyzerでみた遅延も規格内に収まっている。

Timing constraint: COMP "pcix_ad(10)" OFFSET = OUT 3.8 ns AFTER COMP "pcix_clk";

 2 items analyzed, 0 timing errors detected.
 Minimum allowable offset is   3.086ns.
--------------------------------------------------------------------------------
Slack:                  0.714ns (requirement - (clock arrival + clock path + data path + uncertainty))
  Source:               pcix_inst/pcix_dout[10] (FF)
  Destination:          pcix_ad(10) (PAD)
  Source Clock:         clk_dcm rising at 0.645ns
  Requirement:          3.800ns
  Data Path Delay:      2.715ns (Levels of Logic = 0)
  Clock Path Delay:     -0.274ns (Levels of Logic = 3)
  Clock Uncertainty:    0.000ns

  Clock Path: pcix_clk to pcix_inst/pcix_dout[10]
    Delay type         Delay(ns)  Logical Resource(s)
    ----------------------------  -------------------
    Tiopi                 0.921   pcix_clk
                                  dcm_pcix_inst/CLKIN_IBUFG_INST
    net (fanout=1)        0.431   dcm_pcix_inst/CLKIN_IBUFG
    Tdcmino              -4.145   dcm_pcix_inst/DCM_INST
    net (fanout=1)        1.185   dcm_pcix_inst/CLK0_BUF
    Tgi0o                 0.057   dcm_pcix_inst/CLK0_BUFG_INST
    net (fanout=681)      1.277   clk_dcm
    ----------------------------  ---------------------------
    Total                -0.274ns (-3.167ns logic, 2.893ns route)

  Data Path: pcix_inst/pcix_dout[10] to pcix_ad(10)
    Delay type         Delay(ns)  Logical Resource(s)
    ----------------------------  -------------------
    Tiockp                2.715   pcix_inst/pcix_dout[10]
                                  pcix_ad_iobuf[10]/OBUFT
                                  pcix_ad(10)
    ----------------------------  ---------------------------
    Total                 2.715ns (2.715ns logic, 0.000ns route)
                                  (100.0% logic, 0.0% route)



これを同期リセットに修正すると、どうもADのイネーブル信号が1つにまとめられてしまうようだ。下のようにpcix_dout_enaをバスにしてみたが、それでもだめなようだ。

signal pcix_dout_ena : std_logic_vector(63 downto 0);

attribute syn_useioff of pcix_dout_ena : signal is true;
attribute syn_keep of pcix_dout_ena : signal is true;

    process(pcix_clk) begin -- ADのイネーブルをIOBに入れる
        if pcix_clk'event and pcix_clk='1' then
            for i in 63 downto 0 loop
                if reset='1' then
                    pcix_dout_ena(i) <= '0';
                else
                    pcix_dout_ena(i) <= target_dout_ena or master_dout_ena;
                end if;
            end loop;
        end if;
    end process;
    process(pcix_dout, pcix_dout_ena) begin -- PCIX_ADへの出力トライステート・バッファ
        for i in 63 downto 0 loop
            if pcix_dout_ena(i)='1' then
                ad(i) <= pcix_dout(i);
            else
                ad(i) <= 'Z';
            end if;
        end loop;
    end process;


Timing Analyzerでの解析結果はこれ。

Timing constraint: COMP "pcix_ad(10)" OFFSET = OUT 3.8 ns AFTER COMP "pcix_clk";

 2 items analyzed, 1 timing error detected.
 Minimum allowable offset is   3.946ns.
--------------------------------------------------------------------------------
Slack:                  -0.146ns (requirement - (clock arrival + clock path + data path + uncertainty))
  Source:               pcix_inst/pcix_dout_ena[0] (FF)
  Destination:          pcix_ad(10) (PAD)
  Source Clock:         clk_dcm rising at 0.645ns
  Requirement:          3.800ns
  Data Path Delay:      3.588ns (Levels of Logic = 1)
  Clock Path Delay:     -0.287ns (Levels of Logic = 3)
  Clock Uncertainty:    0.000ns
  Timing Improvement Wizard
  Clock Path: pcix_clk to pcix_inst/pcix_dout_ena[0]
    Delay type         Delay(ns)  Logical Resource(s)
    ----------------------------  -------------------
    Tiopi                 0.921   pcix_clk
                                  dcm_pcix_inst/CLKIN_IBUFG_INST
    net (fanout=1)        0.431   dcm_pcix_inst/CLKIN_IBUFG
    Tdcmino              -4.145   dcm_pcix_inst/DCM_INST
    net (fanout=1)        1.185   dcm_pcix_inst/CLK0_BUF
    Tgi0o                 0.057   dcm_pcix_inst/CLK0_BUFG_INST
    net (fanout=687)      1.264   clk_dcm
    ----------------------------  ---------------------------
    Total                -0.287ns (-3.167ns logic, 2.880ns route)

  Data Path: pcix_inst/pcix_dout_ena[0] to pcix_ad(10)
    Delay type         Delay(ns)  Logical Resource(s)
    ----------------------------  -------------------
    Tcko                  0.374   pcix_inst/pcix_dout_ena[0]
    net (fanout=64)       0.629   pcix_inst/pcix_dout_ena_1(0)
    Tiotp                 2.585   pcix_ad_iobuf[10]/OBUFT
                                  pcix_ad(10)
    ----------------------------  ---------------------------
    Total                 3.588ns (2.959ns logic, 0.629ns route)
                                  (82.5% logic, 17.5% route)


V2proを使用したPCI-X 133MHzでは、IOBにFFを入れないとタイミングを満足できないので、FFがIOBに入らないのは致命的だ。
Synplify proを使用するときは、とりあえず非同期リセットで行くことにした。
  1. 2007年12月21日 16:44 |
  2. FPGAのリセットについて
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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