2017年 10月 23日 ( 1 )

少ない資源を繰り返し使って乗算結果を得る話です。
今時こんなケチな設計はあまりやらないと思うのですが、V-Scaleに使った乗算器は結構しょぼいのでその説明の前哨戦です。
verilog 上ではちゃんと記述していませんが、X+Y+Z=S+C*2 となるような計算を桁上げなしで計算する回路をCarrySaveAdderと呼びます。ちなみに*2はただの1ビットシフトなので、回路上は何もないようなものです。
贅沢な乗算器ではこのCSAをたくさん使い、部分積が2個になるまで計算してから最後にキャリー伝搬のある加算器で積を求めます。
ここでは、CSA1段に加算器を付けて3入力の加算器として使います。
V-Scaleでは3入力加算器を64bit幅のものを1個と32bit幅のものを1個使っていますが、まずは簡単な64bitの3入力加算器1個のバージョンです。
まぁ、最初の1回は3個の部分積を足す。2回目以降はその加算結果に2個づつ部分積を足しこんでいく。というだけなのですが…
f0054075_22525223.png
32bit乗算では上のような感じにたくさんの部分積ができるのですが、最初の1回は最下位3個、つまり上の3行を足しこんで、
f0054075_22550229.png
2回目以降はその結果を4bitシフトしてさらに2個の部分積を足しこみます。
f0054075_22572798.png
ちなみに下にはみ出ているSと上位に拡張しているSは意味が違って(ややこしくてすみません)、はみ出ているのは×-1の時のインクリメントの意味で、上位に拡張しているのは前回説明した符号拡張の省略形です。
そして、一番下にはみ出している赤字のSですが、符号なしの場合は最上位が×-1倍のわけないので必要ないし、符号付きの場合はそもそも最上位の部分積が必要ないことがわかります。
あまり面白くないですが、Github 更新しました。


[PR]
by tom01h | 2017-10-23 23:52 | 論理設計の話 | Trackback | Comments(0)