デジタルの組み合わせまたはシーケンシャルロジックのみを使用して、特定の8ビット数の平方根を計算する方法を探していました。それは可能ですか?
1つの方法はルックアップテーブルを使用することです。これは、小数部分をまったく考慮していないためです(したがって)。しかし、これよりも良い方法が必要です。誰かがそれを指摘できますか?
デジタルの組み合わせまたはシーケンシャルロジックのみを使用して、特定の8ビット数の平方根を計算する方法を探していました。それは可能ですか?
1つの方法はルックアップテーブルを使用することです。これは、小数部分をまったく考慮していないためです(したがって)。しかし、これよりも良い方法が必要です。誰かがそれを指摘できますか?
回答:
ルックアップテーブルはコメントで言及されています。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回のルックアップのみ)ですが、ここでは値が大きいほど実行時間が長くなります。
どちらの方法でも、テーブルに異なる値を選択することにより、平方根の値を丸めるか切り捨てるかを選択できます。
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の束だけで十分です。
case
ステートメントにそれをスローし、合成ツールにすべての作業を任せることができます。一方で、分散RAM(ROMとして使用)で大きなルックアップテーブルを実行するようなものです。一方、ツールは、コメントで言及したような最適化を見つける必要があります。
これが助けになるかどうかはわかりませんが、平方根を計算するための独創的な簡単な方法があります:
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段階で実装できる場合があります。
0〜255の整数平方根の真理値表をQuine-McCluskeyロジックミニマイザーで実行しました。整数平方根は、組み合わせロジックだけで実行できますが、そのような比較的小さな入力サイズでも可能な値、答えは気弱な人向けではありません。以下は、入力としての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;