Tang NanoからTang Nano 4Kへの移植
Tang Nano 4K は Tang Nano の上位機種だからそのままのプログラムで動くだろう、と思ったら結構な差分があった。リソース量は Tang Nano 4K の方が圧倒的に多いので、リソースの不足で移植できない、ということは基本的にはなさそう。
FPGA型番:GW1N-LV1QN48C6/I5→GW1NSR-LV4CQN48PC7/I6
Gowin EDA 上でプロジェクト設定の Part Number を「GW1NSR-LV4CQN48PC7/I6」に変更
内蔵オシレータ:OSCH→OSCZ
240MHz→250MHz
OSCZにはoscen入力が必須なので注意
code:Verilog
Gowin_OSC osc(
.oscout(osc_clk),
.oscen(1'd1) // ←この行を追加する
);
oscen に1(真)を与えないと発振しない
oscen は OSCH(Tang Nano)にはなく、OSCZ(Tang Nano 4K)にはある
IP Core Generator で生成すると Gowin_OSC という名前になるが、これは Tang Nano 時代の内蔵オシレータと同じ名前なのでビルドがエラーにならず気付きにくい
ビルドエラーにならないが発振しないので不可解な挙動になる
PLL:rPLL→PLLVR
基本の設定項目は差がないが、内蔵オシレータを PLL 入力とする場合、入力周波数を変えないといけない
PLLVR の入力として OSCZ の出力を使用し、かつ OSCZ の oscen に 1 を入力しない状態では PLLVR が約 32MHz で発振する
PLLVR の各種設定を変えても PLLVR の発振周波数が変わらない
まさか OSCZ が発振していないとは思わず、PLLVR の設定がおかしいのかと悩むことになる
ピン配置:ガラッと変わっている
そのままだと Place & Route に進んだところでエラー
ERROR (CT1113) : "ファイル名" Can't find pad location '38' in current package
UART:CH552→無し
Tang Nano 4K には USBシリアル変換のチップが積まれていないので、UART するには別途 USB シリアル変換器が必要 IO 用電圧:3.3V→1.8V/2.5V/3.3V
Tang Nano 4K(GW1NSR-4C)では IO ポートは「バンク」に分かれていて、バンク毎に電圧を変えられる
デフォルトは 1.8V
Tang Nano 4K のボードで各バンクの電圧が規定されているので、それに合わせて制約ファイルを書く必要がある
https://gyazo.com/72bfbf25d9d0f5f72a9a77fe83c8b9fb
code:port.cst
IO_LOC "fpga_rx" 3; // 3.3V
IO_PORT "fpga_rx" IO_TYPE=LVCMOS33;
IO_LOC "fpga_tx" 4; // 3.3V
IO_PORT "fpga_tx" IO_TYPE=LVCMOS33;
注意:同じバンク内で電圧が2種類登場すると競合してエラー
ERROR (CT1136) : Bank 0 vccio(1.8) is locked by other constraint or embedded port, conflicting BANK_VCCIO set by 'fpga_tx_s0' : IO_TYPE = LVCMOS33 in the same bank
TO_TYPEで電圧を指定しないと1.8Vとなるので、意図せず1.8Vとその他の電圧が競合しがち
教訓:すべてのポートできちんと電圧を指定しよう