FC2カウンター FPGAの部屋 Artix-7, Kintex-7, Virtex-7
fc2ブログ

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

FPGAの部屋

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

7シリーズのMMCM (Mixed Mode Clock Manager)

7シリーズ用のMMCM (Mixed Mode Clock Manager)についてまとめておこうと思います。

7シリーズ用のMMCMについては、”ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP5(MMCM)”で書いたのですが、より詳細にまとめておこうと思います。とにかく M と O0 に実数が使えるのが良いです。但し、0.125ステップです。

なおこのブログを書くにあたっては、”7 シリーズ FPGA クロッキング リソースユーザーガイド UG472 (v1.8) 2013 年 8 月 7 日”を参照しました。

まずは、”7 シリーズ FPGA クロッキング リソースユーザーガイド UG472 (v1.8) 2013 年 8 月 7 日”の63ページの図3-2 : MMCM の詳細なブロック図を引用します。
MMCM_1_140509.png

D は、クロック入力のプログラマブルな分周器です。その分周比は、プリミティブで言うと、DIVCLK_DIVIDE パラメータに相当します。(値は、1 ~ 106 の整数値)

M は、VCOの周波数を分周して入力クロックとVCOで位相比較器するための分周器です。プリミティブで言うと、CLKFBOUT_MULT_F パラメータに相当します。(値は、2 ~ 64までの整数か、2.000 ~ 64.000 の増加幅が 0.125の実数)

O0 ~ O6 は、出力の分周器です。O0のみ分周比に実数を使うことが出来ます。それ以外の分周比は整数です。
プリミティブで言うと、O0のパラメータは、CLKOUT0_DIVIDE_F です。(値は、2 ~ 128までの整数か、2.000 ~ 128.000 の増加幅が 0.125の実数)
O1 ~ O6 は、プリミティブのパラメータは、CLKOUT[0:6]_DIVIDE です。(値は、1 ~ 128 の整数)

VCOの周波数、Fvco = Fclkin x M / D です。

Zynq-7000 All Programmable SoC (Z-7010、Z-7015、Z-7020) : DC 特性および AC スイッチ特性 (日本語版) ( ver 1.11, 2411 KB )”の 46ページ、表 69 : MMCM のスイッチ特性によると、MMCM_FVCOMIN(最小 MMCM VCO 周波数)は 600MHz、MMCM_FVCOMAX(最大 MMCM VCO 周波数)は -1 グレードでは、1200MHz ですので、この間に、Fvco を収める必要があります。

出力周波数は、 Fout = Fclkin x M / (D x O) です。

MMCMの 0番目は、O が実数で選択できるので、かなり正確に出力周波数を合わせることが出来ますが、M と O を決めるのが難しいです。ソフトウェアがあると良いですね。作ろうと思っていましたが、面倒ですね。誰か作ってくれると良いですね。。。

下に私のHDMIの周波数のパラメータを示します。シリアライザに供給するためピクセルクロックの5倍の周波数をMMCMで合成しています。XGAまではピッタリの周波数を合成できましたが、SXGA、HDはピッタリの周波数を合成できませんでした。HDの周波数については、表示ができなかったので、再検討が必要だと思います。
DIVCLK_DIVIDE = 1, MMCM_CLKFBOUT_MULT が CLKFBOUT_MULT_F、MMCM_CLKOUT0_DIVIDE が CLKOUT0_DIVIDE_F に相当します。

    -- pixclk = 25MHz, MMCM VCO Frequency = 600 ~ 1200 MHz
    dvi_disp_inst : dvi_disp generic map (
        -- MMCM_CLKFBOUT_MULT    => 30.0,    -- VGA (VCO Freq = 750MHz)
        -- MMCM_CLKIN_PERIOD    => 40.0,
        -- MMCM_CLKOUT0_DIVIDE    => 6.0        -- 25MHz x 5 = 125MHz
        
        -- MMCM_CLKFBOUT_MULT    => 24.0,    -- SVGA (VCO Freq = 600MHz)
        -- MMCM_CLKIN_PERIOD    => 40.0,
        -- MMCM_CLKOUT0_DIVIDE    => 3.0        -- 40MHz x 5 = 200MHz
        
        MMCM_CLKFBOUT_MULT    => 26.0,    -- XGA (VCO Freq = 650MHz)
        MMCM_CLKIN_PERIOD    => 40.0,
        MMCM_CLKOUT0_DIVIDE    => 2.0        -- 65MHz x 5 = 325MHz
        
        -- MMCM_CLKFBOUT_MULT    => 43.25,        -- SXGA (VCO Freq = 1081.25MHz)
        -- MMCM_CLKIN_PERIOD    => 40.0,
        -- MMCM_CLKOUT0_DIVIDE    => 2.0            -- 108MHz x 5 = 540MHz(540.625/5=108.125MHz)
        
        -- MMCM_CLKFBOUT_MULT    => 29.75,    -- HD (VCO Freq = 743.75MHz)
        -- MMCM_CLKIN_PERIOD    => 40.0,
        -- MMCM_CLKOUT0_DIVIDE    => 1.0        -- 148.5MHz x 5 = 742.5MHz(743.75/5=148.75MHz)
    ) port map (


Xilinx\14.7\ISE_DS\ISE\verilog\src\unisims に Verilog HDLのプリミティブのソースが有ります。その、MMCME2_ADV.v と MMCME2_BASE.v を見ると、どのようなパラメータとポートがあるかわかると思います。VHDLでしたら、Xilinx\14.7\ISE_DS\ISE\vhdl\src\unisims\primitive です。VHDLの MMCME2_BASE のポート宣言部分を下に引用します。

  entity MMCME2_BASE is
    generic (
      BANDWIDTH : string := "OPTIMIZED";
      CLKFBOUT_MULT_F : real := 5.000;
      CLKFBOUT_PHASE : real := 0.000;
      CLKIN1_PERIOD : real := 0.000;
      CLKOUT0_DIVIDE_F : real := 1.000;
      CLKOUT0_DUTY_CYCLE : real := 0.500;
      CLKOUT0_PHASE : real := 0.000;
      CLKOUT1_DIVIDE : integer := 1;
      CLKOUT1_DUTY_CYCLE : real := 0.500;
      CLKOUT1_PHASE : real := 0.000;
      CLKOUT2_DIVIDE : integer := 1;
      CLKOUT2_DUTY_CYCLE : real := 0.500;
      CLKOUT2_PHASE : real := 0.000;
      CLKOUT3_DIVIDE : integer := 1;
      CLKOUT3_DUTY_CYCLE : real := 0.500;
      CLKOUT3_PHASE : real := 0.000;
      CLKOUT4_CASCADE : boolean := FALSE;
      CLKOUT4_DIVIDE : integer := 1;
      CLKOUT4_DUTY_CYCLE : real := 0.500;
      CLKOUT4_PHASE : real := 0.000;
      CLKOUT5_DIVIDE : integer := 1;
      CLKOUT5_DUTY_CYCLE : real := 0.500;
      CLKOUT5_PHASE : real := 0.000;
      CLKOUT6_DIVIDE : integer := 1;
      CLKOUT6_DUTY_CYCLE : real := 0.500;
      CLKOUT6_PHASE : real := 0.000;
      DIVCLK_DIVIDE : integer := 1;
      REF_JITTER1 : real := 0.010;
      STARTUP_WAIT : boolean := FALSE
    );

    port (
      CLKFBOUT             : out std_ulogic;
      CLKFBOUTB            : out std_ulogic;
      CLKOUT0              : out std_ulogic;
      CLKOUT0B             : out std_ulogic;
      CLKOUT1              : out std_ulogic;
      CLKOUT1B             : out std_ulogic;
      CLKOUT2              : out std_ulogic;
      CLKOUT2B             : out std_ulogic;
      CLKOUT3              : out std_ulogic;
      CLKOUT3B             : out std_ulogic;
      CLKOUT4              : out std_ulogic;
      CLKOUT5              : out std_ulogic;
      CLKOUT6              : out std_ulogic;
      LOCKED               : out std_ulogic;
      CLKFBIN              : in std_ulogic;
      CLKIN1               : in std_ulogic;
      PWRDWN               : in std_ulogic;
      RST                  : in std_ulogic      
    );

  1. 2014年05月09日 05:24 |
  2. Artix-7, Kintex-7, Virtex-7
  3. | トラックバック:0
  4. | コメント:0

ISE13.1でVirtex-7をインプリメントしてみた

前回はISE13.1でKintex-7をインプリメントしてみたが、今度はVirtex-7をインプリメントしてみた。Virtex-7はWebPACKではインプリメントすることができない。
xc4v285t-1ffg484の一番小さいVirtex-7でインプリメントしてみた。
Virtex-7も下のワーニングが出て、ビットファイルを生成することができない。

WARNING:Bitgen:26 - Bitgen only supports DRC but not bitstream generation on this device. This condition can occur if there are problems obtaining a license to run bitgen or if the design targets a device which is Early Access.


A7_K7_V7_7_110319.png

次にFPGA Editorで見てみるが、やはり一番小さいとはいえVirtex-7。大きい。44,700スライスあって、前回のKintex-7の約10倍だ。
A7_K7_V7_8_110319.png

右はじに、600Mbps~12.5GbpsのGTXトランシーバが並んでいる。PCI Express(PCIe)も2個実装されている。左はじは普通のIOのようだ。
Virtex-7もKintex-7と内部のスライスやIO、CMTなどの内部ブロックは同様みたいだ。Airtex-7はまだISE13.1ではインプリメント出来ないが、全シリーズ同じ構造だと移行するのが簡単でとても良いと思う。

従来、SpartanからVirtexに移行するのは、プリミティブを使ってあると特に難しく、全面書き直しになることもあったが、今回はスムーズに上下のシリーズに移行できそうだ。これはとても良いと思う。
  1. 2011年03月19日 05:22 |
  2. Artix-7, Kintex-7, Virtex-7
  3. | トラックバック:0
  4. | コメント:0

ISE13.1でKintex-7をインプリメントしてみた

どうも地震でやる気がなくなっていたが、そろそろ始めようと思う。基板も作成中だが、ISE13.1からインプリメント可能になった。Kintex-7のインプリメントをしながら、Airtex-7, Kintex-7, Virtex-7シリーズに付いて学んでみたいと思う。

まずはしょぼくて申し訳ないが、キャラクタ・ディプレイ・コントローラをKintex-7、xc7k30t-1fbg484でインプリメントしてみた。
xc7k30t-1fbg484は、4,750スライス(1スライスは4個のLUT、8個のFFを持つ)、Block RAMの容量は、18Kb換算で130個、3CMT、PCI Expressインターフェース1個、GTXトランシーバー4個を持っている。
キャラクタ・ディプレイ・コントローラをインプリメントするに当たって、IOピンの配置制約LOCをすべてコメントアウトして、PERIOD制約だけにしている。

NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %;


ISE13.1でインプリメントしてみるとGenerate Programming Fileでエラーとなった。
A7_K7_V7_1_110316.png

エラー内容と言うかワーニングを下に示す。

WARNING:Bitgen:26 - Bitgen only supports DRC but not bitstream generation on this device. This condition can occur if there are problems obtaining a license to run bitgen or if the design targets a device which is Early Access.


どうやら、まだビットファイルは生成できないようだ。

次に、例によって、FPGA Editorで見てみよう。
A7_K7_V7_2_110316.png

左からI/Oパッドがあって、FIFO、BRAM、BRAM、PCIe、BRAM、GTX、FIFO、I/Oピンが並んでいるのがわかる。

DCMがどうインプリメントされているか見てみると、MMCM (mixed-mode clock manager)に割り当てられている。
A7_K7_V7_3_110316.png

MMCMは、7 Series FPGAs Overviewによると、11.2psごとに位相シフトできるPLLのようだ(まだ、細かい違いがあるのかもしれないが。。。)CMTの中にMMCMが1個、PLLが1個入っている。使用したMMCME2_ADVを下に示す。
A7_K7_V7_4_110316.png

(追記)
Kintex-7のSLICELを下に示す。
A7_K7_V7_5_110317.png

4個の6入力LUTと8個のFFがある。
次にSLICEMを下に示す。
A7_K7_V7_6_110317.png

LUTが分散RAMになることを除けば、SLICELと同様だ。
これはVirtex-6と同様のSLICE構造に見える。(”Virtex-6とSpartan-6のスライス構造とパスの比較”参照)
  1. 2011年03月16日 21:30 |
  2. Artix-7, Kintex-7, Virtex-7
  3. | トラックバック:0
  4. | コメント:0