n bitカウンターのトグル率を求める
久しぶりに仕事ネタです。
FPGAのピンに、8bitのカウンターの出力を割り当てた場合のピンのトグル率が欲しくなった。せっかくだから8bitだけじゃなくて、16bitとか、32 bitとかも欲しい。
ルールを説明すると、1bitのカウンターだと、0→1→0→1に変化するからトグル率は100%。2bitのカウンターだと、最下位bitが常に変化するからトグル率が100%、2ビット目は、0→0→1→1→0の順に変化するからトグル率50%。全体として、(100 + 50) / 2で75%がトグル率。カウンターって再帰的に定義されていると思いながら、Schemeで書いてみた。
(define calc-toggle-rate-counter
(lambda (bit_width)
(/ (sum-of-toggle bit_width) bit_width)))
(define sum-of-toggle
(lambda (bit_width)
(let ((toggle_rate (/ 1 bit_width)))
(if (= bit_width 1)
toggle_rate
(+ toggle_rate (sum-of-toggle (- bit_width 1)))))))
(calc-toggle-rate-counter 8)
gosh> 0.3397321428571428
なので、だいたい34%のトグル率。
嫌なところ:あるbitのトグル率は、常に下位bitの半分なのに、(/ 1 bit_width)と毎回計算しているのが頭悪い。(0.625 0.125 0.25 0.5 1)という各ピンのトグル率のlistを作って、平均取った方が一般的に使い回しができる。全ピントグルなら、(1.0 1.0 1.0 1.0 1.0 ・・・)みたいに表現できてうれしい。
良い所:gauche+Meadowで適当に書いてすぐ動く。頭の良いやり方を考える前に、適当に書いたら動くのはうれしい。Cで書くと、常に上を押さえないといけない気がするけど、shcemeだとむしろ下を押さえているような感じ。for(i=0;i 初めて書いたschemeの実用プログラムでした。小さな一歩。
The comments to this entry are closed.
Comments