AoiSaya が 2025年12月22日09時21分17秒 に編集
コメント無し
本文の変更
# はじめに GreenPAK(SLG46826) 1個で作るALUを紹介します。 このALUは4ビット同士の加減算を実行できます。 # 基本的な考え方 ## 半加算器と全加算器
2つの1ビットの信号を加算する回路を半加算器、桁上がり信号も足す回路を全加算器と呼びます。半加算器は、ANDとXORで作ることが出来ます。全加算器は、半加算器2個とORで作ることが出来ます。
2つの1ビットの信号を加算する回路を半加算器、桁上がり信号も足す回路を全加算器と呼びます。半加算器は、ANDとXORで作ることが出来ます。全加算器は、半加算器2個とORで作ることが出来ます。GreenPAKでは、3入力のLUT(Look Up Table) 2個で構成できます。
この様子を図1に示します。 
半加算器で、A,Bは入力、Sは加算結果、Cは桁上がりです。
半加算器で、A,Bは入力、Sは加算結果、Cは桁上がり(キャリーと呼びます)です。
全加算器では、A,Bは入力、CIは桁上がり入力、Sは加算結果、COは桁上がり出力です。 真理値表は、入力と出力の関係を表にしたものです。 ## 2の補数表現 2進数でマイナスの数を表現する方法を表に示します。これは2の補数表現と呼ばれるもので、簡易な回路で加減算しやすいことからよく使われている表記法です。 - **特徴** 1. 先頭ビットで正負を判定できる 2. そのまま足すだけで加算が出来る 3. すべてのビットの0/1を反転して1を足すだけで、正負を反転できる |2進数|10進数| |---|---| |1000|-8| |1001|-7| |1010|-6| |1011|-5| |1100|-4| |1101|-3| |1110|-2| |1111|-1| |0000| 0| |0001| 1| |0010| 2| |0011| 3| |0100| 4| |0101| 5| |0110| 6| |0111| 7| ## 4ビットの加算器と減算器 全加算器を4個使うと4ビットの加算器を作ることが出来ます。全加算器を ⊕で表したときの4ビット加算器を図2左側に示します。また、2の補数表現の特徴を生かして、引く数のビットを反転して引かれる数に加算して更に1を足すことで減算器を作ることが出来ます。4ビット減算器を図2の右側に示します。  ## 4ビットの加減算器と最長経路 加算器と減算器を応用して、AS信号が0のときは加算、1のときは減算をする加減算器は図3の左側のようになります。
この加減算器の高速化について考えてみましょう。もっとも多くの素子を通過する経路(最長パス)を図3の右側に赤線で示しました。この線が意味するのは、ASやB0が変化してからS3やCOが確定するまでに5素子分の遅延があるということです。そこでこの経路を短くする方法を紹介します。
この加減算器の高速化について考えてみましょう。もっとも多くの素子を通過する経路(最長パス)を図3の右側に赤線で示しました。この線が意味するのは、ASやBI0が変化してからS3やCOが確定するまでに5素子分の遅延があるということです。そこでこの経路を短くする方法を紹介します。
 ## Carry Select Adder
通過する素子を減らす方法としてCarry Select Adder(CSA)を採用しました。これはAI2とBI2を足した時のキャリア(CO2)が1のときと0のときのS3とCOを計算しておいてCO2が確定したときに正しい方を選択して出力する方法です。いわゆる投機的実行の一種です。図4にこの時の回路図を示します。青色の回路がCO2が0のとき、赤線の回路がCO2が1のときの計算に対応します。このようにすることで最長パスを4素子に減らすことが出来ます。通常はもっとビット数が大きいときに威力を発揮します。GreenPAKではこの工夫により最長パスを3素子に減らすことが出来ました。
通過する素子を減らす方法としてCarry Select Adder(CSA)を採用しました。これはAI1とBI1を足した時の桁上がり出力(CO1)が1のときと0のときのS3とCOを計算しておいてCO1が確定したときに正しい方を選択して出力する方法です。いわゆる投機的実行の一種です。図4にこの時の回路図を示します。青色の回路がCO1が0のとき、赤線の回路がCO1が1のときの計算に対応します。このようにすることで最長パスを4素子に減らすことが出来ます。通常はもっとビット数が大きいときに威力を発揮します。GreenPAKではこの工夫により最長パスをLUT 3個に減らすことが出来ました。
 # SLG46826によるALUの実装
図5にGreenPAKで書いたALUの回路図を示します。少し素子が余ったので、おまけとしてS3=S2=S1=S0=0のときに1となるZERO出力を設けています。この出力が最長パスになります。 右側のConponentsでわかるように、これで素子を使い切ってしまいました。あまり入りませんね。
図5にGreenPAKで書いたALUの回路図を示します。少しLUTが余ったので、おまけとしてS3=S2=S1=S0=0のときに1となるZERO出力を設けています。この出力が最長パスになります。 右側のConponentsでわかるように、これでLUTを使い切ってしまいました。あまり入りませんね。
 外部端子から外部端子へのSimilationを実施しました。条件は、3V, 25度です。 おそらく最長遅延になるB0からの遅延時間[ns]の例を示します。最長パスは調べてないので参考値です。だいぶ遅いですが、10MHz程度で動きそうなことがわかりました。 |A|B|B0|S3|CO|ZERO| |---|---|---|---|---|---| |1|6|↑|63.1|61.1|82.8| |1|6|↓|63.1|61.2|70.4| |7|0|↑|63.3|61.4|82.3| |7|0|↓|62.8|61.4|78.4| # おわりに GreenPAKに入るALUの作り方をご紹介しました。 SLG46826 1個には、4ビットのALUしか入りませんでした。マイコンを作るには複数個必要ですね。また、動作速度もそれほど高速ではありません。GreenPAKで演算回路を作る際の動作速度のご参考になれば幸いです。 # 免責事項 本記事の正確性については努力しておりますが、当方は利用者が当記事の情報を用いて行う一切の行為について何ら責任を負うものではありません。本記事の情報の利用、内容によって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ご自身の責任においてご利用いただきますようお願いいたします。 # Author [GitHub/AoiSaya](https://github.com/AoiSaya) [Twitter ID @La_zlo](https://twitter.com/La_zlo)