从半导体开始讲起。
半导体
半导体,就是导电性能介于导体与绝缘体之间的材料,比如二极管。
电流可以从正极流向负极,但反过来则不行。所以,可以它可以防止电流逆流。
当负极12V,正极0V,二极管断开;
当负极0V,正极12V,二极管导通。
正极的电流源源不断的流向负极,导最终达到正负极都是12V,稳定后,可将其视为导线。
有了半导体这个性能,我们可以尝试做一个【与门】。
即AB同时输入1,输出端Y才是1;AB有一个为0,输出端Y则为0。
有了这些基础的门电路,我们就可以做基础逻辑了。从最基础的加法器开始说。
加法器
S表示计算的结果,C表示是否要进位。
1 + 1 = 10,那么S就是0,C就是1。
由逻辑状态表可写出逻辑式:
(a)逻辑图
(b)逻辑符号
上面的图使用太复杂,简化一下:
(a)逻辑图
(b)逻辑符号
实现减法 在4位数中,一共可以表达16个数,需要引入‘补数'的概念,例如3的补数是13,4的补数是12,5的补数是11,当你计算7减去4的时候,可以变成7加上3的补数,即7+13。 可是7+13是20,但是7-3等于4啊? 向后退3格:7 - 3 = 4 向前进9格 :(7 + 9) mod 12 = 4 向前进21格:(7+9+12) mod 12 = 4 向前进33格:(7+9+12+12) mod 12 = 4 ..... 7-3可以换算成7+13了,如果是3-7呢? 负数的引入,使得系统变得更复杂了。首先我们得用一个标志位来表示正数还是负数。
我们又想到了前面提到的“补码”。
我们来算一下7-4。7是0111,-4是1100。注意我们把符号位也算进去了,两者相加:
再我试试4-7,4是0100,-7是1001,两者相加:
所以,补码让二进制的表示更加易于理解。
加法,减法都有了,那乘法和除法呢?
最高位的0表示正数,1表示负数,真正有效的数字只剩下3位了,正数的范围是从1到7,负数的范围从-1到-7,不过这里出现了两个零!一个正0,一个负0,这不妥吧。
乘法和除法
比如
5=101(2)
10=1010(2)
四则运算
有了前面的基础,我们就可以计算基础的四则运算了吧。
试试看。比如计算A+B*2,用前面的基础来计算,不难吧。 那如果,我再计算(A+B)*2呢?也不难,把前面加法器模块和位移模块的接线调整一下,就能实现。
没错啊,编程的过程就是把线拔过来,插过去啊。
这肯定不行吧。需要引入两个有用的模块。
两个模块
触发器的作用是存储1个bit数据。
比如RS型的FF,R是Reset,输入1则清零。S是Set,输入1则保存1。RS都输入0的时候,会一直输出刚才保存的内容。
用FF来保存计算的中间数据(也可以是中间状态),1 bit肯定是不够的。但是通过并联后,用4个或8个来保存4位或者8位数据。这种保存数据的东西,我们称之为寄存器(Register)。
选择器:MUX
有了这选择器模块以后,我们就可以给加法器和移位模块设计一个激活针脚。 这个激活针脚输入1则激活这个模块,输入0则不激活。如此,就可以控制数据是走加法器模块还是移位模块了。
指令和数据
其实,数据与寄存器相加,结果保存到寄存器,这一条执行起来,也至少需要三步,读取指令,执行指令,写寄存器。
经典的RISC设计则是分5步:读取指令(IF),解码指令(ID),执行指令(EX),内存操作(MEM),写寄存器(WB)。
下面我们用前面定义的3个指令测试下吧。以(1+4)*2+3为例。
0100 0001 ;寄存器存入1
0001 0100 ;寄存器的数字加4
0010 0000 ;乘2
0001 0011 ;再加三
01000001000101000010000000010011
0100 0001 ;寄存器存入1
0001 0100 ;寄存器的数字加4
0010 0000 ;乘2
0001 0011 ;再加三
MOV 1 ;寄存器存入1
ADD 4 ;寄存器的数字加4
SHL 0 ;乘2(介于我们设计的乘法器暂时只能乘2,这个0是占位的)
ADD 3 ;再加三
熟悉吗?没错,这就是汇编语言。汇编语言和机器语言相互紧靠的交互层。
目前比较流行的高级语言有VB、Java、C、C++、Python、PHP等。
下面是2019年最新的世界编程语言排行榜:
写在后面