« 謹賀新年 | Main | SystemC on FreeBSD その2 »

2006.01.06

popcount続き

最初に謝っておきます。今日もぐだぐだです。

電車の中で気になった点が有り、ちょっと調べてみる。
popcountの回路って、adderが7つも使われたが、もしかして全部LUTで
生成した方が速くね。

というわけで実験してみようとおもったけど、8bit幅じゃハードマクロの
DSP48にアサインされていない。しょうがないので、32bitに拡張。
これでも、アサインされていない。ちなみ回路は、Virtex4 lx25-12。
あと、ピンのsetupとか入ってくると話がそれるので、入力で一段FF追加。

(この辺りからぐだぐだ)

回路はこんな感じ

まずは、assignでローテートのデータを作る。
assign rot0 = data_reg[31:0];
assign rot1 = {data_reg[30:0], data_reg[31]};
assign rot2 = {data_reg[29:0], data_reg[31:30]};
assign rot3 = {data_reg[28:0], data_reg[31:29]};

で、1CLKでこれだけの演算をさせる。
popcount <= -(
rot0 + rot1 + rot2 + rot3 + rot4 + rot5 + rot6 + rot7 + rot8 + rot9 +
rot10 + rot11 + rot12 + rot13 + rot14 + rot15 + rot16 + rot17 + rot18 + rot19 +
rot20 + rot21 + rot22 + rot23 + rot24 + rot25 + rot26 + rot27 + rot28 + rot29 +
rot30 + rot31);

ローテートを全部足し込んで、最後に反転。
無理矢理、DSP48を使わせるために、論理合成のoptionでDSP48をONにする。

で結果。
DSP48 option ON にしたとき、 26.504ns 37MHz
DSP48 option AUTO にしたとき 13.652ns 73MHz

何がしたかったかというと、「意味も分からずに、いろんなオプションをONに
するな」という話にまとめたかった。正直にAdderを作って重ねるよりも
LUTで組み合わせ回路を作ったほうが、良くなる場合もある。
回路はここ

そんな事よりも、上のように思うがままに書いた素人回路が、73MHzで動く
事の方が驚きですよ。

|

« 謹賀新年 | Main | SystemC on FreeBSD その2 »

Comments

The comments to this entry are closed.

TrackBack


Listed below are links to weblogs that reference popcount続き:

« 謹賀新年 | Main | SystemC on FreeBSD その2 »