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 の詳細なブロック図を引用します。
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
);