强模(2)除法器讲解
异形龙虾
编辑于 2019年05月26日 00:12
收录于文集
共25篇

  上期我们讲到任意乘数1与任意乘数2的乘法运算,最后我们发现需要将其中一个乘数的每一位都提取出来,这个时候我们就需要使用除法器。

  仿照乘法器的思路,你应该就能想到除法器的思路,针对N/n的运算,我们想到的是用N作为被减数不断减去n,每减去一次n检测结果是否大于0,如果检测到强度还有,就给商+1,如果结果为0(无信号强度),我们就将这时候的商作为最终值,同时将上一次的减法结果输出作为余数。

  看起来似乎不错,算法上也很不错,但这样是有一个小问题的:

  在上述算法中,+1的操作是要检测到这一次减法操作的结果大于0才能执行,而对于N正好能被n整除的情况,例如63/9,当63第7次减去9时,最终的减法结果为0,所以这个时候+1操作不会被执行,商最终为6,同时返回上一次减法的结果为9,最终的结果就会变成63/9=6...9,计算没错,但显然这不符合除法结果的规定。

  那要如何解决这个问题呢?其实很简单,在输入被除数N之前,先对N进行+1操作,等待算法完成输出商和余数时,对余数进行-1操作。

  这样就可以解决?我们不妨来重新演算一下63/9。63先进行+1操作变成64,64可以减去7次9,输出商9和余数1,余数1进行-1操作,最终结果是商9余数0。

  这就解决了???是啊。。。数学有时候就是这么神奇。

  

N/n除法器,商为(0~9)

  跟单个乘法器单元一样,单个除法器单元也是有限制的,商的值不能大于减法运算最大允许的次数。又有人会问了,那我要计算例如456/32,商大于9了,这可咋办?

  请回想一下,在现实中遇到456/32,你是怎么做的?

  先计算45/32,得到这位上的商1和余数13,13跟6结合就是136,136/32=4...8,最终结果就是商14余数8。到这里,聪明的你应该知道了,我们可以先运算456/(32*10)=1...136,然后运算136/32=4...8,商的结果为1*10+4=14,余数为8。

  那就很明显了,我们需要一组除法器的排列来执行上述运算。同时我们需要有一个模块对32执行*10操作,并将32和320这两个值输出作为除数。大家可以翻阅相关资料,进行尝试练习。

  我们可以看到在除法器中我们使用了连续减法的思想来代替实际的除法运算,这也是强模中的一个比较重要的算法思想,在下期专栏中,up会针对此思想给大家介绍几个题型。