今天搞了搞那个XNOR门,也就是同或门。说起来它的逻辑挺直接的,就是两个输入一样的时候,结果就输出1,要是两个输入不一样,那就输出0。很简单对?
实际动手琢磨
听起来好像挺简单的,两个一样就给1,不一样就给0。但真要去弄明白它怎么搭出来的,或者说用别的基础玩意儿凑出来,就得琢磨琢磨了。我就想着直接用现成的逻辑门模块或者芯片,那当然省事儿。
后来觉得不行,光知道用不行,得自己试试看能不能用那些更基础的门,比如与非门(NAND)或者或非门(NOR)给它凑出来。毕竟很多复杂的电路,底层都是这些基础单元搭起来的。
我就翻了翻资料,主要是回忆一下大学那会儿学的数字电路知识。先搞明白了异或(XOR)是怎么回事,因为XNOR嘛字面上看就跟XOR有点关系。XOR是输入不同时输出1,相同的时候输出0,正好跟XNOR反过来。
那思路就来了,一个简单的法子就是先实现一个XOR门,然后在它的输出后面再加一个非门(NOT),把结果反一下,不就得到XNOR了吗?说干就干,我先用与门、或门、非门这些基本的搭了个XOR出来,试了试逻辑,确实是输入不同输出1。然后在这个输出后面连个非门,再测,果然,输入相同的时候输出1了,输入不同的时候输出0。成了!这就是XNOR了。
但这还不算完,我记得老师以前说过,理论上只用与非门(NAND)或者只用或非门(NOR)就能搭出所有的逻辑门。我就想挑战一下,试试只用NAND门搭个XNOR出来。
这个就绕一点了,得把逻辑关系想清楚,一步步转换。我拿出纸笔画了画逻辑图,根据布尔代数的那些规则,比如德摩根定律啥的,硬是把XNOR的表达式全换成用NAND运算来表示。这个过程有点烧脑,得确保每一步转换都没错。
- 先把XNOR的逻辑表达式写出来。
- 然后利用 NOT A = A NAND A, A AND B = (A NAND B) NAND (A NAND B), A OR B = (A NAND A) NAND (B NAND B) 这些关系去替换。
- 一步步替换,化简,就得到一个只用NAND门表示的等效电路。
对着图,我小心翼翼地把几个NAND门按照画的连接方式接起来(当然是在模拟软件里试的,手头没那么多真实门电路)。接完之后,输入00,输出1;输入01,输出0;输入10,输出0;输入11,输出1。又搞定了!完全用NAND搭出来了。
一点感想
搞这个让我想起以前上学那会儿,老师在台上讲这些逻辑门,什么与或非、异或、同或,还有一堆0和1变来变去的真值表。那时候听得云里雾里的,觉得这些抽象的0和1变来变去有啥用,考试背背公式就完事了。
现在自己动手搞一搞,从最基本的定义出发,尝试用不同的基础模块去实现同一个功能,才发现这里面挺有意思的。尤其是只用一种门(比如NAND)就能搭出所有逻辑,感觉很神奇。这些基础的东西才是构成复杂数字世界的根本。虽然现在很多东西都集成好了,直接调用库或者用现成芯片就行,但偶尔回过头来,亲手搭一搭这些基础逻辑,感觉对理解整个体系还是挺有帮助的。
反正不管是用哪种方法,比如先XOR再NOT,或者直接用一堆NAND兜兜转转,最终都把这个XNOR给弄出来了。效果就是那样:俩输入一样,就亮灯(输出1),不一样,就灭灯(输出0)。搞定收工!
还没有评论,来说两句吧...