GN1WNSR-LV4CQN48PC7/I6の内蔵オシレータの周波数
データシート の "3.18 On Chip Oscillator" に以下のように書いてある。 The following formula is employed to get the output clock frequency for
GW1NSR-2C/2 device: fout=240 MHz/Param.
The following formula is employed to get the output clock frequency for
GW1NSR-4C/4 device: fout=210 MHz/Param.
ただ、この下に書いてある表が僕には理解不能だった。Modeって何だ?
https://gyazo.com/2e4bace1ee62720f2bccef5e7de5ea1f
GW1NSR-4C/4の方はfout=210MHz/Paramで、Paramは2~128なのに、fout=125MHzとなる意味がわからない。
最大でfout=105MHzではないのか?
Gowin EDA の IP Core Generator にある OSC のドキュメントによれば次の通り
table:内蔵オシレータの周波数
GW1N-4(B/D)/GW1NR-4(B/D)/GW1NRF-4B/GW1N-9(C)/GW1NR-9(C) 210MHz
GW1N-1(S)/GW1NR-1/GW1NS-2(C)/GW1NSR-2(C)/GW1NSE-2C 240MHz
GW2AN-18X/GW2AN-9X 200MHz
その他 250MHz
Tang Nano 4K に搭載されてるチップのデバイスは GW1NSR-4C なので「その他」に該当する。周波数は250MHzである。おそらくデータシートの「fout=210 MHz/Param.」という記述が間違っていて、正しくはfout=250MHz/Paramである。これなら125MHzまで出せるのでデータシートのTable 3-28とも整合する。
PLL で 50MHz のクロックを作るには、PLLVR の設定で CLKIN を 125MHz、CLKOUT を 50MHz に設定する
https://gyazo.com/63a6dcf9f6d0621b4b4b1846882a81c4
rPLL→PLLVR に変更してビルドすると違うエラー
ERROR (RP0008) : There is no OSCH resource in current device, please change device
Tang Nano 4KではOSCH→OSCZになった
周波数の実測
内蔵オシレータの周波数を外部クロック(27MHz)で計ってみる
外部クロックで1秒を計り、内蔵オシレータ(125MHz)のクロックをカウント
外部クロックの公称精度は不明
内蔵オシレータはデータシートによれば118.75MHz~131.25MHz
0~+85℃
Typicalが125MHz
DSLogic Plusで外部クロックの精度を計ると割と良い精度
https://gyazo.com/55be4649f9ce4527fe61e0e55e269dd2
1秒が真値だとすると、誤差が0.18904msなのでなかなか良好
外部クロックで1秒を計る間に進んだ内蔵オシレータのクロックは以下
table:内蔵オシレータのカウント値
試行回 カウント値 MHz
1回目 132255188 132.26
2回目 132322866 132.32
3回目 132251586 132.25
平均132.28MHz
あれ?データシートの上限を超えてるぞ
室温は23℃くらいで、チップを触っても全然熱くないから0~+85℃には収まってるはずなのに
内蔵オシレータを使ってUART受信した場合のエラー率 9600bpsで通信する場合
PLLで125MHzから50MHzを作り、UART Master回路へ入力する
PLLの倍率=2/5
内蔵オシレータが132.3MHzのとき、PLL出力は52.92MHz
50MHz:9600bps = 52.92MHz:Xbpsを解くとX=10160.64bps
https://gyazo.com/78f57522f9294af2ede6da6ab2c44b63
8ビット目は833.3μsの時点で読まないといけないが、787.4μsの時点で読んでしまう
確率的に読み誤る