0%

数字电子技术小结

前言

人类拓展自身有限性的行为,由来已久。在发明了无数的工具以用来拓展四肢的有限性以后,人类终于将目光投向了拓展自身智力的有限性。这一伟大的尝试,最后催生了计算机的诞生。

事实上,虽然我们无从得知人是如何考虑到要发明延伸智力的工具的,但这背后的思想却是显而易见的:在发现了各类工具能够显著地提高人的体力劳动的效率后,意识到了许多思维劳动同样繁重的人们不免要思考这么一件事:能否发明一种思维上的机器,能够使他代替人们进行思维劳动,从而提升思维的效率?

要解决这一问题,最好的办法当然是直接发明一种拥有着人类智力的机器。这其实就是人工智能的思考方式。但是发明这样的一个机器的难度显然过高,对于连人类的大脑机能和思维本质都没有完全洞悉的人们,这样的发明无疑是天方夜谭。因此人们退后一步,人们发现,人们许多的思维活动其实是基于逻辑进行的,因此如果能够使得机器能够模拟这种逻辑行为,譬如“若A,则B”这样的架构,那么让机器完成人类思维中相当部分的逻辑操作,还是可以思议的。

在这样的思想下,人们先是使用机械结构来实现逻辑架构,然而机械的缺陷显而易见:难以维护,速度缓慢。因此在电子技术出现后,人们迅速转向了电子技术。这样的思想在电子技术上取得了巨大的成功,从而孕育出了如今的计算机。

你也许知道我想说什么了,数字电子技术就是这么一门技术,作为研究如何使用电子技术逻辑化地建构电路的一门技术,它毫无疑问是计算机最底层的基础。虽然如今计算机的抽象较为完善,程序员们不需要了解最底层的原理也同样可以编写完整的程序,而需要架构电路的硬件设计师也同样不必手撕上百万个逻辑门,而直接可以使用设计软件自动生成,但对于它一定的了解,我想,仍然是有意义的。不仅仅是因为作为计算机实现的底层基础,我们应当保有一定程度的尊敬,还因为在人们需求、欲望无限扩大,而硬件发展却日趋放缓的如今,对于硬件一定的了解绝对在未来的优化上是有必要的。

我没有十分仔细地学习数字电子技术,仅仅只是走马观花地看了些网课和知识。因此我的小结也将十分简短,也可能错漏百出,挂一漏万。还望读者不吝指出。

数字与电子

数字电子技术,可以拆解成两个词语,一个是数字,一个是电子技术。什么是数字?数字,就是离散的序列。什么是电子技术?电子技术,就是研究如何通过电路传递信息和能量的技术。

因此,数字电子技术,其实就是研究如何通过电路传递离散的数字信号的技术。

为什么计算机的底层是数字的,又为什么是0和1的二进制电压信号,而不是模拟信号、抑或是十进制?答案非常简单,因为在电路的传输中,受到外界噪音的影响,必然会产生传递的偏差。如果使用模拟信号,或者是别的进制,在传递信息的稳定性上,都是不如简单的二进制的01传递稳定的。因此,计算机采用二进制进行底层的逻辑实现。

要想用计算机处理信息,必然要先将信息存储入计算机。要想将信息存储入计算机,信息必然要有一个载体。对于现实世界的人们来说,载体可以是多种多样的,可以是语言、肢体动作、画面……,然而对于计算机而言,信息的载体有且只能有一个,那就是二进制的电压信号。我们不难意识到,一个信息的载体是多样的,而之所以多样的载体承载的信息最后能被我们理解为相同的信息,是因为我们对于不同的载体都有一套完整的编码和解码的方式。因此,我们希望使用二进制对各类信息进行编码,在这些编码的基础上对他们进行逻辑处理,并最后在输出后通过人工或机器进行解码来获得信息。

这个编码的过程完全取决于设计者,不过我们也要提醒一点,保证编码和解码在整个计算机中的一致性,是非常有价值的。恰如同语言是为人们所共识的事物才有价值一般。

最后,我们还要意识到一点,那就是对于数字电路而言,由于它所有的输出和输入事实上都是0和1的序列,这实际上就提供了一个非常良好的特性,那就是数字电路的接口是可以统一的。这就使得它具有非常强的可扩展性和可复用性,这对于大型开发和技术的发展尤为重要。

逻辑门

在我们成功地表示和存储了信息后,我们就需要对他们进行逻辑处理了。对于计算机而言,全部的逻辑处理都基于这三种运算:与、或、非。

古希腊的亚里士多德创立了人们引以为傲,作为各科学基础的逻辑学。十九世纪中叶,数学家布尔意识到逻辑本身是形式化的,因此它应当是可以数学化的。因此它创建了基于二进制的布尔代数。这成为计算机底层逻辑运算实现的数学基础。

因此,我们不难意识到,构建逻辑化的电路的关键,其实就是构建能够进行“与、或、非”运算的电子硬件。基于CMOS和TTL技术,我们得以成功构建这三种电路,我们称他们为逻辑门电路。

组合逻辑电路

我们将数字电路分为两个大的类,一个是组合逻辑电路,一个是时序逻辑电路。组合逻辑电路具有这么的特点:输出完全取决于此时此刻的输入。因此组合逻辑电路是没有记忆性的。同时,组合逻辑电路是一定要有一个或多个输入的。

这里我们利用组合逻辑电路简单描述一下电路设计的一种流程:首先是明确需求,并将需求逻辑化。然后对逻辑化中的变量进行二进制编码,然后根据需求画出真值表。然后根据真值表求出对应的最小项之和,最后对最小项之和进行化简,得到电路。

当然,这只是一种设计流程,实际的设计多种多样,未必要遵从这个规则,不过从这个流程我们确实可以得到一定的路径启发。

我们不难意识到,对于接口基本统一的数字电路而言,如果要开发大型电路,一定存在着可复用的通用模块。事实上也确实如此。一些经典的通用模块被设计出来后沿用至今。

编码器、译码器、数据选择器就是这样的器件。通过观察这些经典设计的实现,我们得到两个启发:一是在开发一个器件的时候,我们应当考虑好器件之间的交互,从而开发出一个好的对外端口。另一个是我们应当考虑该器件的现实应用场景,从而开发出一些看起来和器件本身实现并不相关,但在实际应用时有丰富意义的控制端口。与此同时,有趣的是,译码器和数据选择器并不仅仅只能作译码和数据选择的功能,它其实还有着进行逻辑运算的功能。不过在实现上各有千秋。

同时,我们还认识到一点:时间和空间、复杂度有的时候是不可兼得的。

最后,还有一个有趣的地方,我们必须意识到,理论分析的结果是要落实到现实世界的。而现实世界并没有理论分析那么完美,而是存在着诸如延迟、噪声等限制。这就由于延迟出现了“竞争-冒险现象”。这是一种在输入电平变换中导致输出电平出现毛刺的现象,往往可以通过滤波器、延长等待时间、修改电路获取。

电路设计的抽象化和定制化

我们不难意识到,在电路进行较为基础的设计的时候,手搓是完全可以的,但是在进行大规模的设计、扩展的时候,这个工程量是极其恐怖的。因此,人们开发出了对于电路设计的工具。

首先来讲讲PLD。PLD,全名Programmable Logic Device。PLD是出于怎样的思考被发明的呢?我们意识到,通用的模块电路可以被低成本、快速地制造,但是它的功能未必是我们期望的。而定制化的、专门的模块虽然在功能上符合我们的需要,但是它们制造的周期和成本是较高的。为了解决需要更快地开发电路的需求,人们发明了可编程逻辑器件,也就是PLD,PLD通过在芯片内置足够多的模块,并提供编程接口,实现了可以较低成本、较快速度地生产可供客户定制化的器件。

然后谈谈EDA设计工具。EDA作为电路的设计工具,其实来源于这样的思想:我们认识到,从功能的确认,规格的架构,到设计电路,再到最后排线落实,这些步骤都太长、太麻烦了。我们希望能够自动化这些流程,提高我们的电路设计的效率。基于这样的思想,EDA工具应运而生。

EDA,全名Electronics Design Automation,也就是电子设计自动化工具,就是出于这么的考虑。EDA的发展和电子电路的发展是相辅相成的。EDA的进步推动了电子技术的发展,而电子技术的发展又反过来推动了EDA的进一步发展。主要而言,EDA实现了这些功能:

  • 设计输入,可以对电路的功能和结构进行描述
  • 电路综合,可以进行逻辑综合、布局、布线
  • 仿真,包括功能仿真和时序仿真,验证电路功能。
  • 硬件实现:下载到可编程逻辑器件上即可使用。

我们不难发现,在EDA中,我们不再使用我们以前常用的电路描述方法对我们设计的电路进行描述。我们需要构建出一套语言,使得它能够体系性地对我们的电路进行描述,并对硬件进行控制。我们称他们为硬件描述语言,也就是HDL。

HDL,全名Hardware Description Language,也就是硬件描述语言。顾名思义,是用以对硬件进行描述的语言。这样的语言,既在人类的层面上提高了交流的效率,也使得利用一种高级语言对硬件动作进行抽象、编写成为可能。目前的主要HDL是Verilog,它是电路设计者自主开发出来的。

时序逻辑电路

我们不难发现,组合逻辑电路虽然功能丰富,可以实现我们的许多功能。但是它存在着一个巨大的缺点,那就是它的输入和输出都是即时的,这实际上意味着它没有存储和记忆的功能,也就意味着它没有办法实现需要先前的状态的功能。一个最简单的例子就是按钮开关。

基于这样的需求,人们开发了能够存储数据的器件,称之为触发器,也叫翻转器。触发器按照触发方式分为电压触发、脉冲触发和边沿触发。按照内部结构又分为了RS触发器、D触发器、JK触发器和M触发器等等。

这其中还有诸多概念,如等待时间。建立时间等。由于笔者精力时间有限,不再多述。时序逻辑电路往往是将触发器器件和组合逻辑电路相组合构成一个有记忆功能的器件。

尽管希望尽可能精炼而又不失详实完整地阐述一通数字电子技术的基本概念,但由于笔者的时间和精力俱有限,止说到此为止。还望能对读者有所帮助。