UARTのボーレートの計算方法
#fpga #verilog #uart
やりたいこと
100MHzのクロックから「ボーレート9600Hz、サンプリング回数16回」の場合のサンプリング用のクロックを生成したい
→ 1周期(9600Hz)の中で16回サンプリングするので、15360Hzのクロックを生成すれば良い
→ 100MHzのクロック何回で15360Hzのクロックを1回出力すれば良いか?
求める数 divisor は以下の式で求められる
式
divisor = システムクロック / ( サンプリング回数 * ボーレート )
例
UARTのボーレートが9600Hz
1周期あたりのサンプリング回数が16回
システムクロックが100MHz
の場合、
dvsr = 100,000,000(100Mhz) / ( 16(サンプリング回数) * 9600(ボーレート) )
= 100,000,000 / 153600
= 651.0416666666666
dvsr = 651 となる
100MHzのクロック651回で15360Hzのクロックが1回出力される
(以下はメモ)
ミリ秒・マイクロ秒・ナノ秒・ピコ秒
1秒(sec)
= 1000ミリ秒(msec/10**-3)
= 1,000,000マイクロ秒(μs/10**-6/100万)
= 1,000,000,000ナノ秒(ns/10**-9/10億)
= 1,000,000,000,000ピコ秒(ps/10**-12/1兆)
周波数と秒数
1Hz
1秒間に1周期
1Hzのクロックだと1回
100Hzのクロックだと100クロック
100MHzのクロックだと100,000,000(1億)クロック
1000Hz
1秒間に1000周期
1周期 = 1ミリ秒 = 1,000,000ナノ秒
100MHzのクロック100,000(10万)回で1000Hzのクロックが1回出力
100,000,000 / 1000 = 100,000(10万)
100MHz
1秒間に100,000,000周期
1周期 = 10ナノ秒
5nsごとにclkを反転させると100MHzになる
9600Hz
1秒間に9600周期
1周期 = 104166ナノ秒
100MHzのクロック10416回で9600Hzのクロックが1回出力
100,000,000 / 9600 = 10416クロック
153600Hz(9600Hz * 16サンプリングで153600Hz)
1秒間に153600周期
1周期 = 6510ナノ秒 = 6.51マイクロ秒
100MHzのクロック651回で153600Hzのクロックを1回出力
100,000,000 / 153600 = 651クロック
(結果的にPong Chuのdivisorの求め方と同じ計算方法だった)
「FPGA Prototyping by SystemVerilog Examples」ボーレートジェネレータ
divisorで指定したクロックの周期でtickが立つ
divisorの値の求め方
b = ボーレート
f = システムクロック
dvsr = f / (16 * b)
(例) システムクロックが100MHz、ボーレートが9600の場合
dvsr = 100,000,000 / (16 * 9600)
dvsr = 651
651クロックごとにtickが1になる
参考
「FPGA Prototyping by SystemVerilog Examples」 の CHAPTER 12