我正在寻找一种仅使用数字组合或时序逻辑来计算给定 8 位数字的平方根的方法。这可能吗?
一种方法可能是只使用查找表,因为我根本不考虑小数部分(所以\$ \sqrt{10} \simeq 3\$),但必须有比这更好的方法。
有人可以指出我吗?
我正在寻找一种仅使用数字组合或时序逻辑来计算给定 8 位数字的平方根的方法。这可能吗?
一种方法可能是只使用查找表,因为我根本不考虑小数部分(所以\$ \sqrt{10} \simeq 3\$),但必须有比这更好的方法。
有人可以指出我吗?
评论中提到了查找表。有两种方法。
快速
创建一个 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
虽然快速查找表具有固定的执行时间(仅一次查找),但这里的执行时间对于更高值的参数更长。
对于这两种方法,通过为表选择不同的值,您可以在平方根的舍入值或截断值之间进行选择。
以 8 位工作,您基本上受限于整数解决方案。如果你需要 X 的平方根,你能得到的最接近的是平方小于或等于 X 的最大整数。例如,对于 sqrt(50),你会得到 7,因为 8*8 会大于50.
所以这里有一个技巧:计算有多少奇数,从 1 开始,你可以从 X 中减去。你可以用这样的逻辑来做:一个 8 位寄存器 R1 保存工作值,一个 7 位计数器 R2保存(大部分)奇数,一个 4 位计数器 R3 保存结果。复位时,R1 加载 X 的值,R2 清零,R3 清零。一个 8 位减法器电路被馈入 R1 用于“A”输入,R2 的值与固定为“1”的 LSB(通过上拉)组合用于“B”输入。减法器输出 8 位差 AB 和借位。在每个时钟,如果借位清零,R1 加载减法器输出,R2 递增,R3 递增。如果借位被设置,R1 不加载,R2,R3 不递增,b/c 结果现在在 R3 中准备好。
或者
只有 16 个可能的输出值,所以答案是一个四位数。本质上,您有 8 个输入位的四个单位函数。现在,我无法绘制 8 维卡诺图,但原则上你可以为答案的每一位想出一个组合电路。将这四个组合电路的输出放在一起,并将它们解释为四位答案。瞧。没有时钟,没有寄存器,只有一堆 NAND 和 NOR 就足够了。
我不知道这是否有帮助,但有一种巧妙简单的方法来计算平方根:
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 个阶段来实现它。
我通过 Quine-McCluskey 逻辑最小化器运行了 0-255 整数平方根的真值表。整数平方根可以只用组合逻辑来完成,但即使对于 \$2^8\$ 可能值这样一个相对较小的输入大小,答案也不适合胆小的人。以下从输出的 MSB A 到 LSB D 排序,以 abcdefgh 作为输入,MSB 到 LSB:
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;