计算 8 位二进制数的平方根

电器工程 数字逻辑 计算机算术
2022-01-23 12:40:48

我正在寻找一种仅使用数字组合或时序逻辑来计算给定 8 位数字的平方根的方法。这可能吗?

一种方法可能是只使用查找表,因为我根本不考虑小数部分(所以\$ \sqrt{10} \simeq 3\$),但必须有比这更好的方法。

有人可以指出我吗?

4个回答

评论中提到了查找表。有两种方法。

快速
创建一个 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;