看之前先想好,是不是要学下去,如果没这个决心,那就趁早离开吧!这些知识绝不是一下子就能理清的,如果不想坚持,那么就不要浪费时间阅读了。



如果在红石方面(活塞门,电梯等活塞机械除外)有困难的可以来找我,我的QQ和论坛帐号是一样的,加了我后请主动问问题(有很多人加了我后半天都没声音,我都不知道他们哪不懂)。




在上次的教程中我解释过double dabble算法,也介绍过BCD码,就是用4位一组2进制数来表示10进制数,1(0001),2(0010),3(0011),4(0100),5(0101),6(0110),7(0111),8(1000),9(1001)

BCD码转二进制的算法是:abcd=a*1000+b*100+c*10+d

你可能会觉得很熟悉,小学应该学过,abcd就是一个十进制数,假如是1234,那么过程就是:1234=1*1000+2*100+3*10+4    因为1在千位,所以代表有1个1000,2在百位,所以有2个100,后面的以此类推

我之前说了,BCD就是用2进制来表示的10进制,1000的2进制数是1111101000,100的2进制数是1100100,10的2进制数是1010,1234的2进制数是10011010010
所以10011010010=1*1111101000+10*1100100+11*1010+100。

当然,这种算法是最常规的,里面要用到乘法器和加法器,比较麻烦,下面才是正文

我们可以把abcd分开输入
先输入a,
然后输入b并且让a*10(十进制的10)然后把结果记作a1,
输入c时把b*10,结果记作b1,再把a1*10,结果记作a2,
最后输入d,并且把a2*10,b1*10,c*10。

那么就相当于a一共乘以了3次10,也就是乘1000
b一共乘以了2次10,就是乘100
c一共乘以了1次10,也就是乘10

这是简化步骤一,可以看到算法里只需要乘10,减少了乘法运算的难度。

接着是步骤二,彻底摆脱乘法器!

这一步骤用到的思想非常重要!很多算法可以依此来简化!

就是找出一个数字*10后的变化规律,1的二进制数是1,10的二进制数是1010,1*10=10
那么也就是说把二进制的1向左分别移动1和3次咯,这个猜想对不对呢,我们带几个数进去看看。2的二进制数是10,20的二进制数是10100,符合上文的假设。3的二进制数是11,30的二进制数是11110,我们得到了个更严谨的结论,那就是把“1”分别左移1位和3位,如果有多个“1”,那么就把多次移位的结果相加。

提到移位呢,很多人都会想到移位寄存器,不过不是什么移位都要用它的,移位寄存器一般是用来把一个数据进行连续的左或右移动,我们这里的移位是要“跨越”的,所以我们不用移位寄存器,用的是D触发器(移位寄存器由D触发器组成)。

我们用D触发器来暂时储存加法器的运算结果,然后把D触发器的输出端跨位连接(加法器的输出1连加法器的输入2和输入4),这样就相当于乘了10,记得把所有D触发器的时钟端连接在一起。

我们的操作方式是逐位输入,也就是先输入1个数,然后同时给所有D触发器的时钟端一个脉冲信号,然后那个数字就真正地被输入进去了。


最后是电路图(没加数字输入部分,输入是4位二进制数,分别就是前4个加法器的输入,第4个输入有些特殊,要与移位部分的接线分开,避免互相干扰)
蓝色的和绿色的线是一样的,不用管它;另外,线看起来比较乱,但其实都是管移位的。