打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
计算机基础从模拟电路到计算机软件(一条机器指令就是一段定长的二进制数CPU的电路在出厂之前就写死了)(逻辑门的输出可以往回跑形成一个回路就是时序逻辑把多个门组合在一起并不形成循环的回路就是组合逻辑电路了)

    (一条机器指令就是一段定长的二进制数CPU的电路在出厂之前就写死了)



  (逻辑门的输出可以往回跑形成一个回路就是时序逻辑把多个门组合在一起并不形成循环的回路就是组合逻辑电路了)


https://m.toutiao.com/is/D1KLhn3/ 


初中的时候就在想,电脑这种东西怎么可以这么神奇,怎么可能能用电路堆出这么复杂的、可交互的设备,还能干这么多事,上网听歌玩游戏,内涵开车看萝莉,简直无所不能。听别人说了几万年,电脑无非就是101010,我的哥啊,我也知道啊,然而并没有什么卵用啊,还是不知道为什么有造出电脑的可能性。

然后上了大学学习了一波,上了几门课,发现还真有可能:)

初中的时候,以前以为电路是这样的

上了电子电路以后发现电路也可以是这样的

很重要的不同的不止是电路拓补复杂了,还有就是多了很多迷之器件。然后构成计算机的一个很重要的电路元件,就是晶体管(Transistor)。而晶体管是实现数字电路很重要的一类器件,初中只知道一些最基础的模拟电路肯定是想不懂了。

晶体管(Transistor)

严格意义上讲,晶体管泛指一切以半导体材料为基础的单一元件,包括各种半导体材料制成的二极管、三极管、场效应管、可控硅等。就拿三极管来说事

1947年12月23日,美国新泽西州墨累山的贝尔实验室里,3位科学家——巴丁博士、布莱顿博士和肖克莱博士在紧张而又有条不紊地做着实验。他们在导体电路中正在进行用半导体晶体把声音信号放大的实验。3位科学家惊奇地发现,在他们发明的器件中通过的一部分微量电流,竟然可以控制另一部分流过的大得多的电流,因而产生了放大效应。这个器件,就是在科技史上具有划时代意义的成果——晶体管。因它是在圣诞节前夕发明的,而且对人们未来的生活发生如此巨大的影响,所以被称为“献给世界的圣诞节礼物”。这3位科学家因此共同荣获了1956年诺贝尔物理学奖。

反正三极管是可以用小电流控制大电流,类似的还有场效应管(FET,Field Effect Transistor),这个就是用小电压控制大电流,而且功耗低,易集成。有些场效应管可以作为一个开关——这就有点关键了,因为开和闭就对应着0和1,让这些101010有了比较实在的电气化载体。

上图,栅极G(Gate)就是小电压,这个小电压可以控制漏极D(Drain)→源极S(Source)的电流,半导体这么神奇的性质,简直黑科技啊!

逻辑门(Logic Gate)

讲道理的话,把模拟电路进行一下抽象的话,我们就可以站在数字电路的角度看问题。

无论是三极管还是场效应管,都需要一个大电压VDD来驱动。然后一般情况下,我们把 小于0.35VDD的输出电压叫做0,大于0.65VDD的晶体管输出电压叫做1,中间的碍手碍脚尽量躲开,这样一来我们的世界里就剩下010101要考虑了,电压电流什么的再见吧。这个剩下1010要考虑的就是数字电路了,电压电流什么的是属于还未进行抽象的模拟电路的范畴。

所以讲道理,这些能看作开关的晶体管如果做一些非常巧妙的迷之组合的话,是不是有机会实现一些逻辑功能呢?

是!(微笑脸)

可能各位学c/c++的时候也有接触过一些位操作,什么bitwise and &,bitwise or |,bitwise xor ^ ,bitwise not ~,等等。偷偷跟你们说,这些神奇布尔代数操作,是可以用晶体管的迷之组合来实现的。(当然也可以不用晶体管,不展开讲,略略略)

随便看看下图的常见逻辑门

A,B都是输入信号,然后经过一个“逻辑门”的黑箱操作,得到相应的输出,想要补补课的童鞋请百度布尔代数,逻辑门等关键词。

然后po几个黑箱的内部情况:

上图是NOR---或非门

上图是NAND---与非门

看不懂吗?没事,随便看看就好,我也不明觉厉,但是聪明的读者们,你们一定也能feel到确实有可能这么实现逻辑门的,是吧

组合逻辑(Combination Logic)

用上面实现的神奇逻辑门的组合,我们可以构成一个组合逻辑电路 。像下图一样,把多个门组合在一起,并不形成循环的回路(cyclic path),就是组合逻辑电路了。

虽然可能有多个输入,但是由于逻辑电路的特点,所以输入是一定可以穷举的而且确定的输入就有确定的输出,于是就可画出真值表(Truth Table)。

例如上图甲是单一个与门的真值表,把输入的1010排列组合穷举以后,一定能写出对应的所有输出。

真值表这种东西是在说,无论多复杂的组合逻辑电路,穷举输出硬爆就好了:)

至于逻辑式化简、布尔代数、卡诺图 等就不展开讲了。

时序逻辑(Sequential Logic)

这个东西有区别于组合逻辑,就是逻辑门的输出可以往回跑,形成一个回路(cyclic path),主要实现了数据的储存(或者说数据当前状态的保持)。这个也是挺重要的,时序电路可以实现SR锁存器(SR Latch),D锁存器(D Latch),D触发器(D Flip Flop)等用做保持电平当前状态的时序电路,最终还能用于实现寄存器(Register)。不过这里也是一笔带过=。=

加法器(Adder)

这东西感觉很好很强大啊?我第一次听的时候,有点被吓尿了的赶脚,逻辑门能做算数运算这么厉害?于是赶紧学习一波。

半加器(Half Adder)

前面不是说了吗,复杂的逻辑,穷举就好了啊。

如果我们只考虑1bit的加法,那么我们就有2个操作数的输入,1个结果输出,还有一个进位的输出,一共4根线。

看上图的1bit加法器的黑箱表示,左边两根线A,B就是输入,S是结果,C是进位

真值表可以写出S和C关于A,B的布尔表达式:

论1bit的加法,两位输入X,Y的组合只有四种情况,可以全部枚举出来。S是当前位的运算结果,C是要滚到下一位的进位 (Carry Out)。

具体地用逻辑门实现,可以像下图一样

那———为什么叫半加器呢?直接叫加法器不就好了么

全加器(Full Adder)

那讲道理的话,实用的加法器不可能只能算1bit的加法吧,怎么也搞个4bit 8bit 16bit什么的。那就有个小问题了,从第二位开始往后要接受多一个前一位的进位(Carry In),要把当前位的两个操作数和上一位滚下来的CarryOut——一共3个bit都综合一下才靠谱。所以下面的组合电路可以搞一个1bit全加器(也可以用两个半加器加其他逻辑门实现一个全加器)

然后把全加器串联(呃或者说串接吧)在一起,就可以做一个行波进位加法器(Ripple Carry Adder),反正就是,把n个全加器插在一根竹签上,就可以实现n bit数字的加法了。

当然这个n bit加法器是延迟比较高的,虽然是纳秒级别,但是作为一个这么简单和重要的基础功能,还是需要更快的优化。这就有了超前进位加法器(Carry Lookahead Adder,CLA)等,名字和技术很厉害,但其实只是优化过的延迟更低的加法器而已。

普通算术运算这里就只说加法器了,因为减法同理,其实就是加一个负数。在2的补码(2's complement)的二进制数字系统下(这种数字系统统一了整数的加减法,有兴趣建议百度一波),正数+正数/ 正数+负数 / 负数+负数 都可以用上面的加法器实现。 这里之所以只说加法器,是因为乘法和除法的硬件实现,还真有点厉害和玄学的,n位乘除法需要n个pass来实现,而且也要用到加法器,所以加法器很关键啊 >_<

所以呢,经过巧妙设计,我们还可以实现乘法器,除法器,位移器(Shifter,就是c艹里的<<和>>),比较器,甚至浮点运算的模块.................

算术逻辑单元(Arithmetic Logic Unit,ALU)

把加减乘除,比较,位移,“旋转”,位运算等等各种集成好的模块再集成一个大模块,我们就可以把它称作算术逻辑单元ALU了。可以通过向ALU输入一个k bit的二进制电平组合来选择执行哪个内置好的操作/运算。

就像这样,ALU会提供几个口让外部选择ALU要执行的操作。总之,作为CPU里面的一个核心部件,ALU是要执行计算机指令的一个非常重要的模块。

计算机指令(Instruction)

其实到这里已经离最底层很远了,但是才快到了我们经常听到的机器语言

所谓的机器语言,外表看似是不知道在讲什么的101010,但其实是有规则可言的。一条机器指令就是一段定长的二进制数,例如32位的机器上用的指令就是32bit长度的什么的。CPU的电路在出厂之前就写死了,所以你能使用的就是CPU厂商提供的接口,或者说是使用规定好的指令集(Instruction Set)。简单点理解,指令集就是给出了一系列指令的规则,哪一部分的二进制表示着执行哪一个写死的操作,哪一部分的二进制对应着寄存器的选择,etc....指令集可以有很多,有精简指令集,和复杂指令集,讲道理cpu生厂商都可以自己定义。下面看看MIPS的精简指令集的部分示例(MIPS好像是个科技公司来着=。=?)

MIPS的精简指令集里一共有31条指令,每条32bit的指令里面,虽然可能有些部分被浪费了,但是每个部分的定义还是很清晰的,可以看下图

MIPS指令也有几种类型和不同的规定,具体详细的规定其实翻翻文档或者百度一下就有了

上面只是一个示例,用以说明计算机指令是有各种各样规定的。实际生活中PC电脑用的Intel等高端芯片都是复杂指令集的,规定会更多更繁琐。总之,通过进行人为地对一段二进制各部分组成及含义进行规定,一段二进制可以被看作一个操作的执行信息

然后一段二进制程序被加载到内存以后,通过程序计数器(Program Counter)的自增和跳转实现逐条执行二进制计算机指令。每当一个指令要被执行时,首先就会从内存里获取指令的二进制(上面的例子的话就是把那个32bit的东西拿过来),存放在指令寄存器(IR,Instruction Register),然后被处理器控制模块解码,这个控制电路取到几个块里有用的信息,然后配合ALU,寄存器,内存等设备进行指令的执行(instruction execution)。

汇编语言(Assembly Language)

据说上世纪50年代的时候,编程这种东西是要在纸带上打孔孔,用来表示101010,写程序是真心的简单粗暴得直接写二进制的,别说算法错误了,万一手抖了下打多打少个都会gg。打好孔的纸条过机子执行。想想都觉得反人类??(黑人问号.jpg)

简单粗暴硬爆1010的时代的基础积累得久了,人们终于有机会开始写点不那么反人类的语言——汇编语言。

其实就是终于可以写点字母数字了,虽然某些指令的助记符(Mnemonics) 还是比较反人类,但是比看得眼花的1010好多了。上面的MOV,LEA等就是指令的操作,可以翻译成二进制机器指令的op-code操作码的部分,其他部分也可以被翻译成对应的二进制bit。这个把汇编翻译和组装汇编程序变成一系列二进制指令的东西,叫汇编器(Assembler)。因为有种直接翻译的赶脚,所以汇编语言还是被归为了低级语言。

高级编程语言(High-Level Programming Language)

很多理工科都要顺手学的C/C++就是高级语言,其他各种Java,C#,PHP,JS,Python,Perl,Swift等各种黑科技都算是高级语言了。高级语言的存在是因为要低级语言太反人类,为了加快人类创造的脚步,就有了高级语言。高级语言的可读性、可维护性和开发效率高的不知道到哪去了。但是其实高级语言是需要设计的,有很多复杂而又要自洽的规则,所以把高级语言翻译成汇编语言的编译器(Compiler)还是不容易实现的,而且就算是看着语言设计好的标准把这个语言“实现出来”就够逆天了。

ps:第一个高级语言的编译器应该是用汇编语言写出来的,写出来以后就可以幸福开心地过上美好的日子了。

配合上具体的操作系统,程序员们开发出各种有用有趣的程序和软件来,人们开心地用着,偶尔骂骂软件有bug,人类幸福地生活着,程序员也在加班的道路上越走越远 ,而我也在惦记着计算机组成课挂科的风险。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
编码:隐匿在计算机软硬件背后的语言 笔记
代码是如何控制硬件的? |
计算机是怎么运行的?为什么它可以自动化的工作?这和时钟信号又有什么关系?
CPU中的程序是怎么运行起来的
你管这破玩意叫 CPU ?
可编程逻辑在数字信号处理系统中的应用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服