软件是如何驱动硬件的,代码是怎样对计算机实现控制的?

作为啃了几年书本,烧过几块电池的工程狗,那我就来科普一下吧。

不算大神,唯手熟尔。

我们不妨从最底层开始往上走。

1. 二进制理论

众所周知,电脑,手机以及其他大量的电子设备,都是基于复杂的数字电路进行工作的。而数字电路则通过循环往复地完成一系列的指令,来输出我们想要的结果。

那究竟里面的工作原理是什么样子的呢/p>

首先,我们需要一套数字理论。

上帝说,我们需要一个理论。于是莱布尼茨诞生了。
莱布尼茨提出了二进制,这成为了现代计算机理论的基础。至于是老子启发了他,还是他自己坐而悟道想出了二进制,其实已经不重要了。有了二进制,一切变得简单起来:

我们可以只用1 和0 来代表所有数字,进行和十进制一样的代数运算。虽然对于人脑来说,二进制非常不雅观, 比如:

10001010101010101010 * 0101001101010 = 0101101001000001010011100110100。

但它对于计算机来说, 则最简洁,最直观,最高效。

1.1 二进制运算

每一位都只可能是1或者0,运算符 也就是加减乘除。虽然长,位数多,但速度极快!因为,但就每一位来说,运算之后,只会有几种情况:
1 + 1 -> 0, 进一位(, 这个)
1 + 0 -> 1.
0 + 1 -> 1.
0 + 0 -> 0.

所以说,《三体》中,刘慈欣讲到人肉计算机一说。单个运算单元只需要记住特定指令相对应的操作即可,甚至连加减乘除都不需要会。 但这个在现实里面并不可能完成。假设这个运算恒纪元的程序有10000条指令(但显然这个条件都不成立,因为这个程序必然很复杂,涉及复杂的浮点运算和逻辑算法,甚至还有平方开放积分微分,10000条机器代码都不够塞牙缝的), 每条指令需要100个逻辑单元,每个单元的运算时间1秒钟,那么整个程序就需要1000000s (11天13小时46分钟)。。。所以可能程序还没算完,乱纪元又来了,所有人来不及脱水都死了。这还不算发盒饭,上厕所时间。

1.2 二进制逻辑

而且,电脑可以理解是非对错了。计算机以1表示“对”,“是”,“正确”。以0表示“错”,‘否’,‘错误’。然后又引进了“或”,‘与’,‘否定’,等逻辑语句。

我们用 || 表示“或”,表示两者有一个成立即成立(我是学工科的(1) || 我是学计算机的(0) = 我没有女朋友(1))。
0 || 0 = 0
0 || 1 = 1
1 || 0 = 1
1 || 1 = 1
我们用&& 表示“与”,表示两者都成立方可成立。(我是学工科的(1)&& 我是男的(1) = 我没有女朋友(1))。
0 && 0 = 0
0 && 1 = 0
1 && 0 = 0
1 && 1 = 1

2. 数字电路的实现

2.1. 逻辑门
我们有了数字理论,那怎么才能做出逻辑电路呢么才能用来运算呢们引入这些理想的逻辑门,靠他们来作运算。
<img src="https://pic2.zhimg.com/97fa8547f049daa6342ffd2028928ca1_b.jpg" data-rawwidth="341" data-rawheight="221" class="content_image" width="341">

这个图例看起来很复杂,但其实是个纸老虎。首先,我们给Vdd通5V电源。

假设两个输入都是1, 即5V。对照5.3.的最后的表格
Q1: 通
Q2: 通
Q3: 断
Q4: 断 (Q1 和Q2 通导致Q5和Q6的Gate连到了5V,也即高电压上)
Q5: 通
Q6: 断
所以,输出连接到了Vdd,也即5V,也即1.
同理,其他易证。

6. 软件控制硬件实例:SD CARD
7. I2C协议详解
8. FPGA 与 ASIC

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年3月18日
下一篇 2017年3月18日

相关推荐