第一天:为什么图像、音乐、文字都可以用0/1两个数字来表示
我们生活在数字时代。每天扫码支付、刷视频、在社交软件上聊天无一不涉及到电子信息。“电子”意味着设备需要通电才能工作。手机没电会让人焦虑电脑关机就与世界断开了连接。“信息”是具体的内容。一段文字、一首歌曲、一张照片、一个闪烁的红灯……这些都是信息。问题来了电子设备究竟是如何处理丰富多彩的人类信息呢答案是通过“数字”。一、万物皆由数如何把现实世界塞进芯片色不异数数不异色色即是数数即是色受想行识亦复如是。——改编自《心经》在电子世界里万物皆可数字化。颜色的数字化让我们从颜色处理开始。去买油漆时设计师会给你一张色卡。每一张色卡上都有一串数字比如赤褐色的代码是 53261f其中 53代表红色强度26代表绿色强度1f代表蓝色强度。有了这组数字厂家就能完美调出你要的颜色。要是不用数字只用文字描述“我要淡黄、深黄、贼黄、贼绿……”估计师傅当场就撂挑子不干了。照片也是同理。如果我们把一张照片不断放大、放大、再放大如图从左到右你会发现它其实是由一排排极小的“小色块”像素拼出来的。对于手机屏幕来说它只需要知道两件事这张照片有多少行、多少列小色块每个小色块对应的颜色数字是什么知道了这两件事屏幕就能把照片还原出来。色块越小分辨率就越高画面就越细腻。数字化的魔力想调亮照片根本不需要重新画把每个色块的颜色数字都增加 10% 就行了。图像的处理在计算机底层变成了简单的加减乘除。声音的数字化声音的本质是空气的振动。别人贴着你耳朵说话时你能明显感觉到气流的强弱。我们要怎么记录声音呢很简单切片把一段声音按时间平分成无数个极小的时间点。记录每个时间点上的振动强度用数字表示比如 0代表静音100代表最大音量。这样一段流畅的声音就变成了一串数字。把这串数字发给扬声器喇叭声音就被还原了。声音数字化的魔力调大音量把这串数字全部乘以 2。制作合唱混音把男声和女声的两串数字在对应的时间点上相加。加点回声把原数字串复制一份延迟 0.1 秒再按比例加回到原数据上。无论是温度、速度、距离还是时间现代工业已经开发出了各种各样的电子设备。它们的工作就是把现实世界的物理量变成一串串数字再把数字变换回现实世界。电气化 数字化 信息化这就是我们身处的信息时代。二、机器怎么处理数的大道至简天下万物生于有有生于无。道生一一生二二生三三生万物。——老子十进制与二进制对比我们都很熟悉十进制计数在十进制中只有十个基本符号0, 1, 2, 3, 4, 5, 6, 7, 8, 9。跟我们的十根手指对应。当个位加到 10时个位放不下就把多出来的这个“10”记在十位上这就是“逢十进一”。位权百位十位个位权重10² 10010¹ 1010⁰ 1示例365十进制 365代表3 × 100 6 × 10 5 × 1 365而在电子世界里机器没有十根手指它只有“电路”。电路最容易实现的两个状态就是通电有电/高电压比如 3.3V→1断电没电/低电压比如 0V→0这就是二进制只有两个基本符号0, 1。当个位加到 2时个位放不下就把多出来的这个“2”记在“二”位上这就是“逢二进一”。位权八位四位二位个位权重2³ 82² 42¹ 22⁰ 1示例1001二进制 1001代表1 × 8 0 × 4 0 × 2 1 × 1 十进制 9二进制计数过程十进制二进制4位进位过程说明00000还没开始10001个位加 120010个位满 2 清零向二位进 130011个位再加 140100连续进位个位、二位均满 2向四位进 1501011 个“4” 1 个“1”601101 个“4” 1 个“2”701111 个“4” 1 个“2” 1 个“1”81000三级连续进位现在是 1 个“8”910011 个“8” 1 个“1”1010101 个“8” 1 个“2”二进制运算规则仔细观察上面的计数过程其实是不断的加1你会发现有如下的规则0 0 00 1 11 0 11 1 0 且向左进位1运算规则总结和两个输入相同则为0不同则为1进位两个输入同为1时才为1乘法也极其简单因为只有 0 和 11 x 1 11 x 0 00 x 1 0运算规则总结两个输入有 0 时则输出 0全 1 才输出 1。10进制12 x 13竖式乘法计算过程如下1 2x 1 3------------3 61 2--------------1 5 6--------------6 x 5用二进制计算过程如下1 1 0 (6)x 1 0 1 (5)------------1 1 00 0 01 1 0--------------1 1 1 1 0 (30)--------------从上面的过程可以看出如果我们设计出特殊的电路让它能符合上述运算规则那我们就能让机器处理任意数字三、逻辑门电路为了实现这些运算我们需要基础的物理元件。历史上这种元件用过继电器开关、真空管直到如今的晶体管。一个管脚或者两个管脚有电信号进去出来一个不同的信号像过了一扇门Gate一样。我们用真值表罗列所有输入输出状态组合的表格来定义这五种基本逻辑运算电路输入A输入BA AND B与门A OR B或门NOT A非门A NAND B与非A XOR B异或0000110010111110010111111000从表中可看出与门AND必须输入全部为 1输出才会是 1。或门OR只要任何一个输入为 1输出就是 1。非门NOT输出与输入完全相反。与非门NAND相当于在与门后面再接一个非门。异或门XOR输入的值不同时输出才为 1相同则为 0。与非门NAND通过自身的组合生成其它所有种类的门例如两个输入连在一起就变成了非门。这种“一种门打遍天下”的特性极大地简化了半导体生产工艺真正做到了大道至简。有了这些门电路后我们再回过头看二进制的运算。加法和Q A XOR B异或门进位C A AND B与门乘法Q A AND B与门复杂的逻辑判断基本门电路除了能做数学运算还可以进行普遍的逻辑判断。比如你每天点外卖时都在做这样的判断条件A评分 4.5B配送 30 分钟C价格 50 元D想吃的菜E配送费 5 元F朋友推荐G有优惠规则如果 (A 且 B 且 C)或 (D 且 E)或 (F 且 G)那么就下单。表达式下单 ((A AND B) AND C) OR (D AND E) OR (F AND G)无论多么复杂的条件在芯片底层都可以被拆解为由与门、或门、非门连成的巨型网络。实现这些功能的元件从早期的真空管、晶体管演变到如今集成在半导体硅片上的数以亿计的微型门电路。四、数字系统是如何运转的如上文所述无论是算 6 × 5 30还是判断要不要点外卖只要把高低电平送进逻辑门结果立刻就出来了。这种任意时刻的输出仅仅取决于当前输入的电路叫做组合逻辑电路即由各种门电路“组合”而成。但是组合逻辑有一个致命的缺点它没有记忆。它是一个“无状态”的功能模块只要输入信号一变结果就会瞬间消失。如果点外卖时配送费因为网络波动闪烁跳变了1微秒整个组合逻辑电路可能会立刻误触发“取消下单”。要想打破这个限制做连续、稳定的复杂计算数字系统必须引入两个关键设计时间时钟 和存储寄存器。时钟Clock数字系统的总指挥在现实世界中电子信号在电路里传递、逻辑门在做计算时都需要花费时间延迟。复杂的电路里有成千上万个逻辑门电子信号在不同路径上跑的速度有快有慢。如果大家各忙各的、没有统一的节奏就会导致“前面的电路还没完全算好后面的电路就急忙把错误的中间结果拿去用了”的混乱局面。古代打仗时千军万马为了行动一致需要擂鼓进军。电路也是一样我们需要引入一个最高总指挥官——时钟信号Clock简称 CLK。时钟信号不是我们手腕上戴的手表它在电路里是一股忽高忽低、极有规律的周期性电信号脉冲。它就像是龙舟赛上的鼓点或者军队齐步走时的口令“高、低、高、低……”对应二进制就是 1, 0, 1, 0...循环往复。时钟周期时钟信号从 0低电平比如 0V变到 1高电平比如 3.3V再变回 0的一个完整循环记为 T。时钟上升沿Rising Edge时钟信号从低电平0变成高电平1的那一个跳变的瞬间。时钟下降沿Falling Edge时钟信号从高电平1变成低电平0的那一个跳变的瞬间。我们可以这样设计所有的组合逻辑电路必须在下一个时钟上升沿到来之前把数据准备好。比如我们听到的处理器频率 3.0 GHz意味着这个芯片里的总指挥官一秒钟要敲30 亿次鼓点时钟就像电路里的节拍器所有部件听着这个节拍一起工作才不会乱套。D触发器D Flip-Flop芯片的记忆细胞有了时钟做总指挥那如何将上游准备好的数传给下游呢它就是D触发器简称 DFF在电路设计中也叫寄存器Register。DFF 就像一个带门卫的小仓库它有两个主要的输入端数据输入D 和时钟输入CLK一个输出端当前存储的结果Q。[图片D触发器符号示意图]它的工作规则很简单平时时钟稳定在 0 或 1 时小仓库大门紧闭。不管外面的数据端D怎么变里面的输出端Q都死守上一次的数值绝不改变。这就是记忆功能。时钟上升沿瞬间CLK 从 0 变成 1 啪哒大门瞬间打开。DFF 咔哒一声快速把这一瞬间外面的输入数据D抄下来锁进仓库变成新的输出Q完成数据向下游的传递。锁存器 vs 触发器如果一个器件不仅仅在“上升沿瞬间”抄数而是在“整个高电平期间”都开着大门随外面一起变这种器件叫锁存器Latch。初学者先记住触发器就好锁存器可以以后再了解。因为 DFF 总是要等“下一个时钟沿”才把外面的数据存进去所以它天然具有延迟一个时钟周期的特性。一个 DFF 只能存储1 位Bit 的二进制数据即只能记 0 或 1。它是构成所有存储芯片的基础积木。如果我们想要存更多的数字只需要成倍地重组它们寄存器Register把 4 个、8 个或者 16 个 DFF 并排连在一起让它们共享同一个时钟信号CLK。当时钟上升沿一响它们就能同时存入 4 位、8 位或 16 位的二进制数。内存RAM当寄存器的数量多到几亿、几十亿个时为了方便管理我们会给每个寄存器小单元编上号这个编号就叫地址Address。配合上特殊的选择电路译码器我们就能通过输入一个具体的地址精准地去读写某一个特定位置的数字。D触发器就像一个小格子能记住 1 个数字0 或 1。成千上万个小格子排在一起就是内存。数字系统的运行循环到现在为止我们已经完整建立了芯片运行的底层概念模型。在芯片内部电路的运作就像一个循环寄存器 A 牢牢记住当前的数据。逻辑门电路组合逻辑接在后面对这些数据进行拼命的加减乘除计算。计算出的最终结果送往寄存器 B 的大门口排队。时钟上升沿“啪”地一响寄存器 B 开门把正确的结果稳稳地吞进脑子里等待下一轮计算。这就是数字系统的运行原理注如果想要获取本系列教程要用到的开发板相关信息可以关注公众号“嵌入式开发之道”回复“开发板”即可。