« SICP ambとロジックプログラミング | Main | 今日の日記 »

2007.08.30

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の実用プログラムでした。小さな一歩。

|

« SICP ambとロジックプログラミング | Main | 今日の日記 »

Comments

The comments to this entry are closed.

TrackBack


Listed below are links to weblogs that reference n bitカウンターのトグル率を求める:

« SICP ambとロジックプログラミング | Main | 今日の日記 »