我一直在寻找一种仅使用数字组合或顺序逻辑来计算给定8位数字的平方根的方法。那可能吗?
一种方法可能是仅使用查找表,因为我根本不考虑小数部分(因此),但必须有比这更好的方式。有人可以指出我的意思吗?
我一直在寻找一种仅使用数字组合或顺序逻辑来计算给定8位数字的平方根的方法。那可能吗?
一种方法可能是仅使用查找表,因为我根本不考虑小数部分(因此),但必须有比这更好的方式。有人可以指出我的意思吗?
Answers:
查找表已在注释中提及。有两种方法。
快速
创建一个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个可能的输出值,因此答案是4位数字。本质上,您具有8个输入位中的四个单位功能。现在,我无法绘制8维卡诺图,但原则上,您只需为答案的每一点提出一个组合电路。将这四个组合电路的输出放在一起,并将其解释为四位答案。瞧 没有时钟,没有寄存器,只需一堆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个阶段中实现它。
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;