用Hutton32玩转数字电路(二):逻辑器件

上篇文章介绍了怎样在Hutton32中搭建与或非门,下面我们就用它们的组合来做一些有趣的事情吧。(比如一个完全平方数计算器!)

异或、同或门

A异或B就是不同为1,相同为0。逻辑表达式为 (A & ~B) | (~A & B)。但注意这里需要两个非门,而非门的体积大和延迟长,所以我们化简一下表达式得到只用一个非门实现异或:(A | B) & ~(A & B);同或也类似:~(A | B) | (A & B)。

有基本的逻辑门我们就能够制作各种组合逻辑、时序逻辑电路了!下面是我做的一些器件:

锁存器

锁存器要用到两个非门,为了减少延迟,内部我们直接用离散信号,因为非门必须要离散信号。

RS锁存器:

用D锁存器构成一个存储单元:(R、W是读写使能端)

加/减法器

加法器原理图网上都有。做减法就是去反(非门)再加一(给加法器最低位进位信号即可)

由于内部全用连续信号,导致非门需要转换,占用整个体积很大,我太懒没做离散优化处理(离散要考虑相位多麻烦)。

计数器

这里的计数器不是一般数字电路里的那种。这是Hutton32中很重要的一种用于分频或延迟的部件。CFY的文章里对它的原理有详细描述。
分频:

单信号延迟或产生一段长脉冲:

长脉冲从上面输出,延迟信号从右边输出。改变计数器周期可以改变延迟时间,但注意改变后保证相位一致!不然无法正确关闭信号发生器。

二进制转BCD码译码器

数字电路是2进制运算,要转为10进制显示就必须要二进制转BCD码译码器。我在minecraft吧的一个红石教程中看到的构造方法,核心是Double Dabble算法,算法请见前面红石教程的链接。
首先我们需要制作一个基本部件满5加3器,即相当于输入4位二进制数,若大于等于5则加三(也输出4位,进位不管),否则不变: y = ( x >= 5 ) ? x+3 : x;。构造这个部分先要检测是否大于5,还要有加法器。我最终用了5个非门来实现整个器件。

然后我们把满5加3器作为一个整体不断复制。其实这个机器的运转速度很低,体积也很庞大。我们还是优化为全用离散信号,因为非门必须要离散信号,就只用输入输出转换一下信号就是了。但这对相位是很敏感的。所以我们要保证整个系统工作在同样的相位下这对布线是一个考验。相位错位是我们可以用一进一出棱形延迟器来做相位补偿。
本来我很懒,不想用离散信号,因为要调相位,但满5加3器是基本的单元,要复制粘贴这些单元才能得到最终的译码器,所以改善它的性能显得很有必要。离散化的满5加3器如下:

最后复制粘贴得成品:

这是个16位2进制转bcd码转换器,总共用了35个满5加3器

完全平方数显示器

虽然现有的知识水平还造不出质数计算器,但完全平方数是可以的了。计算完全平方数不需要乘法器。因为数列1,4,9,16,25..可以看作等差数列1,3,5,7,9..的和。下面是实现完全平方数计算器的框图:
其中,绿色存储器初值为1,蓝色为0,时钟控制写入操作。(存储器一直处于可读出状态)最后译码部分通过2进制转bcd码转换器再转换成10进制再通过七段译码器显示出来。

我做出的成品:


能做到这一步就离计算器不远了!要做计算器计算器但我们还差一个器件:BCD转2进制转换器。我们人输入的肯定是十进制数,所以要做10进制转2进制的部分。这个部分我们可以反过来做:做一个’’’逆满5加3器’’’:

输入 满5加3器 逆满5加3器
0 0 0/13
1 1 1/14
2 2 2/15
3 3 3
4 4 4
5 8 x
6 9 x
7 10 x
8 11 5
12 15 9
13 0 10
14 1 11
15 2 12

这样逆过来有个问题就是逆满5加3器存在一对多的状态(0/1/2可能对应0/1/2或对应13/14/15),感觉无法逆推回去。但幸好事实证明13/14/15这些状态是不会出现的,所以我们可以大胆地让0/1/2对应0/1/2。所以逆满5加3器就是满8减3器
满8减3器我只做了连续的,离散优化还没做。(因为明天就要数字电路期末考试了,还是要复习一下。。。。。。。。。)