Tang Nano 4KのPLLの謎挙動
PLL
FCLKIN="125"
FBDIV_SEL=1→FBDIV=2
IDIV_SEL=4→IDIV=5
Fout = Fin×FBDIV/IDIV = Fin × 2/5
OSCとPLLの接続は次の通り
code:Verilog
Gowin_OSC osc125(
.oscout(clk125), //output oscout
.oscen(1'd1) //input oscen
);
Gowin_PLLVR pll50(
.clkout(clk50), //output clkout
.clkin(clk125) //input clkin
);
OSC DIV=2
https://gyazo.com/4d3c94fe7e29078e1a0e20e0543d1853
OSC DIV=4
https://gyazo.com/102ba5ad1530aa65572575855c5b9919
OSC DIV=8
https://gyazo.com/553ceb91f3acdbf713eda8aabd73254b
OSC DIV=16
https://gyazo.com/cae1d36bfb3f05dcad2c421d7cf4430a
もしかしたらPLLの設定をOSCに依存して変える必要あり?
PLLの設定を次のようにしてみた
FCLKIN="62.5"
FBDIV_SEL=1→FBDIV=2
IDIV_SEL=4→IDIV=5
https://gyazo.com/aaddc6e3ce79fb2423093e09d430578b
なんか変わった。FBDIV_SELとIDIV_SELの値は変わっていないが、明らかに結果が変わっている。
PLLのファイル(gowin_pllvr.v)を前後で比較したら、FCLKINが125→62.5に変わっていただけでなく、ODIV_SELの設定値も16→32に変わっていた。
PLLへの入力周波数を変えるときは、FBDIVとIDIVだけでなく、その他の設定値も調整する必要があるようだ。
OSCZのOSCENにも気をつけよう
code:bad.v
Gowin_OSC osc(
.oscout(osc_clk)
);
OSCEN入力を省略しちゃうと、ビルドエラーにはならないがきちんと動かない。
PLLのクロックが0になってくれれば分かりやすいが、そうではなく32MHzが出力されるという症状になるようだ。
code:good.v
Gowin_OSC osc(
.oscout(osc_clk),
.oscen(1'd1)
);
正しくはこう。