FC2カウンター FPGAの部屋 7シリーズのMMCM (Mixed Mode Clock Manager)

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

コメント

コメントの投稿


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

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