MCBを使う場合の、各部のクロック周波数はどうやって設定するのでしょうか?
DDR2/DDR3メモリを400MHzで動かすには、メモリのデバイスにはその半分の200MHzのクロックを与えますが、MCBには400MHzを与えます。MCBはメモリの2倍の速度のクロックが必要です。
このクロックを作り出すにはFPGAの中のPLLを使います。
クロックとリセット信号を司るのが、memc3_infrastructure.vhdです。
memc3_infrastructure.vhdは、Generic文で以下の項目がカスタマイズできるようになっています。つまり、memc3_infrastructure.vhdを直接いじらなくても、上位のソース(ここではmymcb.vhd)から設定できます。
entity memc3_infrastructure is
generic
(
C_MEMCLK_PERIOD : integer := 2500;
C_RST_ACT_LOW : integer := 1;
C_INPUT_CLK_TYPE : string := "DIFFERENTIAL";
C_CLKOUT0_DIVIDE : integer := 1;
C_CLKOUT1_DIVIDE : integer := 1;
C_CLKOUT2_DIVIDE : integer := 16;
C_CLKOUT3_DIVIDE : integer := 8;
C_CLKFBOUT_MULT : integer := 2;
C_DIVCLK_DIVIDE : integer := 1
);
C_MEMCLK_PERIODは入力クロックの周期をps単位で指定します。パラメータの名前は「メモリクロックの周期」ですが、これはCoreGenが生成したファイルに誤りがあるためです。
※本来はメモリクロックの周期する予定だったのでしょうが、memc3_infrastructure.vhdの中を見ると、PLLに入力される元クロックの周波数として使われています。実際にSP601のサンプルとして提供されている回路を見ると、このパラメータはC_INCLK_PERIODに変わっていて、入力されるクロックの周期を指定するようになっています。
C_CLKOUT0_DIVIDE~C_CLKOUT3_DIVIDE、C_CLKFBOUT_MULTがここでの設定の肝となります。
Spartan-6のPLLは出力を6つ持ちます。このデザインでは0番と1番は高速クロック、2番はユーザクロック、3番はキャリブレーション用クロックに割り当てられています。
C_CLKOUT0_DIVIDEとC_CLKOUT1_DIVIDEは常に1にしておきます。
DDR2メモリの転送速度を400MHzにする場合、DDR2メモリの動作クロックは200MHzです。MCBに与えるクロックは2倍速なので400MHzを与えることになります。FPGAへ入力するクロックが50MHzならば、C_CLKFBOUT_MULT=8にします。FPGA内のユーザロジックを100MHzで動かすならば、C_CLKOUT2_DIVIDE=4に設定します。

キャリブレーション用クロックは100MHz以上でMCBクロックと同期していなければなりません。ここでは、C_CLKOUT3_DIVIDE=4と指定します。
このように、memc3_infrastructureのパラメータを変更することで、MCBの動作速度と供給クロック、ユーザロジックのクロックを個別に設定できます。
この辺の設定は現時点のMIGのGUI画面では設定できないので、ソースを開いて手作業で修正するしかなさそうです。
memc3_infrastructureの入出力ポートを見てみましょう。
port
(
sys_clk_p : in std_logic;
sys_clk_n : in std_logic;
sys_clk : in std_logic;
sys_rst_n : in std_logic;
clk0 : out std_logic;
rst0 : out std_logic;
async_rst : out std_logic;
sysclk_2x : out std_logic;
sysclk_2x_180 : out std_logic;
mcb_drp_clk : out std_logic;
pll_ce_0 : out std_logic;
pll_ce_90 : out std_logic;
pll_lock : out std_logic
);
end entity;
入力クロックに差動クロックを使う場合はsys_clk_pとsys_clk_nから、シングルエンドクロックを使う場合はsys_clkから入力します。
生成されたMCB用クロックはsysclk_2xとsysclk_2x_180から、ユーザ用クロックはclk0から、キャリブレーション用クロックはmcb_drp_clkから出力されます。
最近のコメント