2017年6月1日木曜日

サンプルレートコンバータのマスタクロックをつくる

サンプルレートコンバータに供給するクロックをDE0nanoで作ります。DE0nano基板に搭載された50MHzクロックモジュールの信号をFPGA内蔵のPLLで所要の周波数に変換します。PLLはFPGAに埋め込まれたハードマクロなので、利用するにはIPコア(IPメガファンクション)をインスタンシエートします。
まずは、練習としてサンプルレートコンバータから受け取ったそのままループバックして送信させてみます。


PLLを使うIPを生成

Quartus Primeのウインドウに表示されるIP Catalog(表示されていなければTools ⇒ IP Catalog)からALTPLLを選びます


IPの保存先を聞いてくるので適当な名前を付けて保存(ここではXPLL)

入力クロック周波数 50MHz

これはそのまま。リセットとロック検出があれば良いですね。

そんなに細かいこと聞かれても

これもそのまま

これもそのまま

出力周波数24.576MHzにします

clk c1~c4は使わないのでスルー

これもそのまま

インスタンシエーション テンプレートにチェック

プロジェクトに登録

作成済みIPの設定を変更するには

あとからPLLの周波数を変更するなど設定を変えるには、Project Navigator の IP Components タブで変更したいIPを右クリックして Edit in Parameter Editor を起動する。が、Parameter Editorが灰色で選べないときは、メモリ不足らしいのでQuartusの再起動や設定変更で対応します。


IPを使う

具体的なコードは、記事の最後に示します。今回のPLLとasrc_ifモジュールを呼び出し、FPGAの外部ピンと接続しています。
コンパイルすると、例のごとくWarningがいくつか出てきます。
Warning (292013): Feature LogicLock is only available with a valid subscription license. You can purchase a software subscription to gain full access to this feature.
えっ!このIPコア有料!?まさか!!。どきりとしました。調べてるとLogicLock(下位階層モジュールごとに最適化していくコンパイル手法)機能を使うには、有料ライセンス買ってくださいねというメッセージでした。目障りならWarningのsuppress機能で表示を消すしかないみたいです。
Warning (15064): PLL "XPLL:XPLL24M576|altpll:altpll_component|XPLL_altpll:auto_generated|pll1" output port clk[0] feeds output pin "SRC_MCLK~output" via non-dedicated routing -- jitter performance depends on switching rate of other design elements. Use PLL dedicated clock outputs to ensure jitter performance
SRC_MCLKに割り当てたFPGAのピンは、PLL専用の配線領域を経由していないからジッタ特性が良くないかもという警告でした。是正するには、ピンアサインを変更しなくてはなりませんが今回の用途では問題視することでもないかと考えました。

module DE0nano
(
CLOCK_50,
KEY0,
LED,
SRC_RST,
SRC_MCLK,
SRC_LRCK,
SRC_BCK,
SRC_DOUT,
SRC_DIN,
SRC_LOCK
);


input CLOCK_50;
input KEY0;
output [7:0] LED;
output SRC_RST;
output SRC_MCLK; // 512fs 
output SRC_LRCK; // fs; 48kHz
output SRC_BCK; // 64fs
input SRC_DOUT;
output SRC_DIN;
input SRC_LOCK;

wire c0;
wire locked;
wire SRC_RST;
wire SRC_MCLK;
wire SRC_LRCK;
wire SRC_BCK;
wire SRC_DOUT;
wire SRC_DIN;
wire SRC_LOCK;
wire [23:0] LCH_OUT;
wire [23:0] RCH_OUT;

// ASRC Interface
asrc_if asrc_if (
.CLK(c0),
.RST(~KEY0),
.LCH_IN(LCH_OUT), 
.RCH_IN(RCH_OUT),
.LCH_OUT(LCH_OUT),
.RCH_OUT(RCH_OUT),
.SRC_MCLK(SRC_MCLK),
.SRC_RST(SRC_RST),
.SRC_BCK(SRC_BCK),
.SRC_LRCK(SRC_LRCK),
.SRC_DOUT(SRC_DOUT),
.SRC_DIN(SRC_DIN),
.SRC_LOCK(SRC_LOCK)
);

// PLL Clock Generator
XPLL XPLL24M576 (
.areset(~KEY0),
.inclk0(CLOCK_50),
.c0(c0),
.locked(locked)
);
endmodule

0 件のコメント:

コメントを投稿