8ビットの2進数の平方根の計算


14

デジタルの組み合わせまたはシーケンシャルロジックのみを使用して、特定の8ビット数の平方根を計算する方法を探していました。それは可能ですか?

1つの方法はルックアップテーブルを使用することです。これは、小数部分をまったく考慮していないためです(したがって)。しかし、これよりも良い方法が必要です。誰かがそれを指摘できますか?103


4
範囲のある単純なルックアップテーブルを使用します。各出力の最小数と最大値を確認します。
Kortuk

6
ルックアップは非常に単純なようです。結局のところ、8ビット数の平方根に対して可能な答えは16しかありません。
オリンラスロップ

3
うーん。答えは0000から1111だけです。入力64以上の場合のみ、回答の最上位ビットが設定されるため、入力の上位2ビットのORになります。今、あなただけ減らすために8ビットの3つの機能を持っている...
JustJeff

回答:


9

ルックアップテーブルはコメントで言及されています。2つのアプローチがあります。

Fast
256バイトの長さのテーブルを作成します。次の値はすべて、対応するインデックスの平方根です。引数をインデックスとして使用して適切な値に直接アクセスするため、これは高速です。欠点は、多くの重複値を持つ長いテーブルが必要なことです。

コンパクト
前述のように、8ビット整数の値は0〜255のみであり、対応する平方根は0〜16(四捨五入)です。16番目のエントリテーブル(ゼロベース)を構築します。n番目のエントリは、平方根がnである引数の最大値です。テーブルは次のようになります。

 0  
 2  
 6  
12  
20
etc.

引数以上の値に遭遇すると、テーブルを歩いて停止します。例:18の平方根

set index to 0
value[0] = 0, is less than 18, go to the next entry  
value[1] = 2, is less than 18, go to the next entry  
value[2] = 6, is less than 18, go to the next entry  
value[3] = 12, is less than 18, go to the next entry
value[4] = 20, is greater than or equal to 18, so sqrt(18) = 4

高速ルックアップテーブルの実行時間は固定(1回のルックアップのみ)ですが、ここでは値が大きいほど実行時間が長くなります。

どちらの方法でも、テーブルに異なる値を選択することにより、平方根の値を丸めるか切り捨てるかを選択できます。


2
そのテーブルを逆さまにすると、平均で必要な反復回数が少なくなります
Federico Russo

短いテーブルでのバイナリ検索は、平均してアルゴリズムを高速化できます。ルックアップテーブルの半分(位置8)から始め、見つかった値が高すぎるか低すぎるかを判断し、4桁上または4桁下げます。完了するまで繰り返します。
ジッピー

7

8ビットで作業する場合、基本的に整数解に制約されます。Xの平方根が必要な場合、取得できる最も近いものは、平方がX以下の最大整数です。たとえば、sqrt(50)の場合、8 * 8は8 50。

だからここにそれを行うためのトリックがあります:1から始まる奇数の数をカウントし、Xから減算することができます。次のようなロジックでそれを行うことができます。 (ほとんど)奇数を保持し、4ビットカウンターR3が結果を保持します。リセット時に、R1にはXの値がロードされ、R2はゼロにクリアされ、R3はゼロにクリアされます。8ビットの減算回路には、「A」入力用にR1が供給され、「B」入力用に「プルアップ」により「1」に固定されたLSBと組み合わされたR2の値が供給されます。減算器は、8ビットの差ABとボロービットを出力します。各クロックで、借用ビットがクリアされている場合、R1に減算器出力がロードされ、R2が増分され、R3が増分されます。ボロービットが設定されている場合、R1はロードされず、R2、R3はインクリメントされません。b/ c結果はR3で準備ができました。

代替的に

可能な出力値は16個しかないため、答えは4ビットの数値です。基本的に、8入力ビットの4つのシングルビット関数があります。現在、8次元のカルノーマップを描画することはできませんが、原則として、回答の各ビットに対して組み合わせ回路を考え出すことができます。これらの4つの組み合わせ回路の出力をまとめて、4ビットの答えとして解釈します。出来上がり。クロック、レジスタ、NANDとNORの束だけで十分です。


私は一晩中これを熟考してきました。出力の8のビットは、明らかに2つの最上位入力ビットの関数です。同様に、出力の4のビットは、上位4つの入力ビットのみの機能であると考えられます。00x1、001x、1xx1、および11x1が設定されているようです。後で確認します。
ジャストジェフ

1
FPGAでこれを行っている場合は、大きなcaseステートメントにそれをスローし、合成ツールにすべての作業を任せることができます。一方で、分散RAM(ROMとして使用)で大きなルックアップテーブルを実行するようなものです。一方、ツールは、コメントで言及したような最適化を見つける必要があります。
光子

5

これが助けになるかどうかはわかりませんが、平方根を計算するための独創的な簡単な方法があります:

unsigned char sqrt(unsigned char num)
{
    unsigned char op  = num;
    unsigned char res = 0;
    unsigned char one = 0x40;

    while (one > op)
        one >>= 2;

    while (one != 0)
    {
        if (op >= res + one)
        {
            op -= res + one;
            res = (res >> 1) + one;
        }
        else
        {
            res >>= 1;
        }

        one >>= 2;
    }
    return res;
}

シーケンシャルロジックでできることとできないことについてはあまり知りませんが、このアルゴリズムは4つのループで終了するため、4段階で実装できる場合があります。


4

0〜255の整数平方根の真理値表をQuine-McCluskeyロジックミニマイザーで実行しました。整数平方根は、組み合わせロジックだけで実行できますが、そのような比較的小さな入力サイズでも28可能な値、答えは気弱な人向けではありません。以下は、入力としてのabcdefgh、MSBからLSBに関して、出力のMSB AからLSB Dの順に並べられています。

    A =     a
     or     b;

    B =     a and     b
     or not b and     c
     or not b and     d;

    C =     a and     b and     c
     or     a and     b and     d
     or     a and not b and not c and not d
     or     a and not c and not d and     e
     or     a and not c and not d and     f
     or not a and     c and     d
     or not a and     c and     e
     or not a and     c and     f
     or not a and not b and not d and     e
     or not a and not b and not d and     f;

     D =     a and     b and     c and     e
     or     a and     b and     c and     f
     or     a and     c and     d
     or     a and not b and not c and not d
     or     a and not b and not d and     e and     f
     or     a and not b and not d and     e and     g
     or     a and not b and not d and     e and     h
     or     a and not c and not d and not e and not f
     or     b and     c and not d and not e and not f and     g
     or     b and     c and not d and not e and not f and     h
     or not a and     b and not c and     d and     e
     or not a and     b and not c and     d and     f
     or not a and     b and not c and     d and     g
     or not a and     b and not c and     d and     h
     or not a and     c and not d and not e and not f
     or not a and     d and     e and     f
     or not a and     d and     e and     g
     or not a and     d and     e and     h
     or not a and not b and     c and not e and not f and     g
     or not a and not b and     c and not e and not f and     h
     or not a and not b and not c and     e and     f
     or not b and     c and     d and     e
     or not b and     c and     d and     f
     or not b and not c and not d and not f and     g
     or not b and not c and not d and not f and     h;

1
うわー、それはどのソフトウェアですか?任意の大きさのディメンションに対して機能しますか?これらのSOPフォームから実際に構築するために、最小限の数のゲートをどのように導出しますか?この時点では、cpld以上が間違いなく最も実用的なビルド方法のようです。
captncraig

@CMP返信が遅れて申し訳ありません。ここで入手可能なプログラムを使用しました: 真理値表を受け入れることができるhome.roadrunner.com/~ssolver-単純なPythonスクリプトを使用して、整数平方根の各桁の真理値表を生成しました。上記のSOPは実際に最小限の形式であり、プログラムがそれらを最小化するために使用するアルゴリズムの能力の限界まであります。
-Bitrex

1
@CMP言うように、ルックアップテーブルを使用するか、整数平方根のアルゴリズムの1つをコーディングして、選択したHDL言語で合成できるため、整数平方根をこの方法で実装するのはクレイジーです。
-Bitrex
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.