晶体管到门电路

二极管的工作

相信大家都知道二极管的工作特性,那如何使用二极管去构建一个门电路呢?

二极管的与门:上拉电阻,只有AB同时为高电平,输出为高电平

二极管的或门:下拉电阻,只要AB任一一个为高电平,输出为高电平

MOS管的工作

        在高频处理时,我们一般使用的是MOS管而不是三极管。那为什么要使用MOS管呢?使用MOS管可以达到更高的开关频率以及更低的功耗。但是MOS管的成本也相对更高。

以下是使用MOS管构建门电路:

MOS管的与门电路 

MOS管的或门电路

MOS管的非门电路

 

门电路到运算单元

加法器的实现

半加器

二进制数相加,结果为取“异或门(两个值不相同才为1)”,进位取“与门” 

全加器

当要接收进位时,需要两个半加器实现

 脉动进位加法器与超前进位加法器

         如果使用全加器来实现二进制的加法的话,那实现的结果为右图的脉动进位加法器,它的特点是由四个全加器来实现,设计比较简单,但是要运算四位二进制数时,需要四个周期才能完成运算。而超前进位加法器设计比较复杂,但它能在一个周期就能完成四位二进制数的计算。这种设计思路其实可以让我们明白,为什么FPGA的主频低,但是它还是能给我们通用计算器加速。当我们算法比较复杂时,可能通用计算单元要好几十个周期完成的工作,而FPGA可以通过设计在一个周期内完成。

乘法器

乘法器可以通过多个加法器来实现:

控制单元的构成

程控思想

       
在上一节,我们已经掌握了通过晶体管来实现两种计算方式:加法与乘法。意味着我们已经有了一个计算器。那如何从一个计算器变为一个计算机呢?这里就需要我们能够掌握程控思想了。例如我们要计算
(3+1)×
3时,那么我们会分解为加法和乘法两个步骤。然后人通过操作计算器上的按钮完成该运算。最后得出结果为12。那么要让计算机完成该计算,首先要构建一个控制单元。而我们希望通过该控制单元完成该内容的计算。

 

选择器

       
 相信对计算机比较感兴趣的,对”指令集“不会很陌生,甚至还能立马想起:X86指令集、ARM指令集等。那到底什么是指令集呢?在这里我们可以简单的理解为,指令集是对电路的选择,例如我们的乘法电路、加法电路同时对我们寄存器里面的数进行了运算,那我们该选择哪个电路的输出,我们便可以通过选择器来实现。

 晶振

        晶振是给系统提供基本的时钟信号的。没有晶振的电路就是一个静止的电路,就像时间被冻结了,并不会进行运算。因此我们也可以将其理解为时间信号。

指令定义

       
有了计算单元以及控制单元,那我们可以明白指令及数据的区别了,指令代码是给控制单元进行控制的,数据是给运算器进行计算的。接下来我设计一个简单的哈佛结构的CPU,为了让控制单元能够进行加乘的计算,定义了以下三个指令:

§0100,将数据写入寄存器

§0001,将数据与寄存器相加,结果保存到寄存器

§0010,将数据与寄存器相乘

        我们可以分析,指令的第一位(从右到左)表示加法电路,指令的第二位表示乘法电路,指令的第三位表示寄存器写入操作,指令的第四位无作用。

电路设计

        C1到C4表示控制指令,D1到D4表示数据指令。根据分析,C1和C2用于加法和乘法输出结果的选择。C3表示寄存器的数据是由外部输入还是由运算器输出。用开关表示晶振。

计算

有了刚才的3个指令,那我们就可以用来做个计算题!(3+1)×3

0100  0011  ;将3写入寄存器

0001  0001  ;将1与寄存器相加

0010  0011  ;将3与寄存器相乘

 

 汇编语言

将前面的程序整理一下成为: 010000110001000100100011

这么多零和一可比密码还复杂,相信大家还没来得及将它输入到电脑里,都已经能够口算完了。

哪有什么办法可以改进一下这个程序呢?

MOV 3 ;寄存器存入3

ADD 1 ;寄存器的数字加1

MUL 3 ;乘3

总结

        对于汇编语言来说,每个指令与芯片一一对应,直接指挥CPU
进行工作,但是对于人来说还是晦涩了许多。同时不同公司设计的芯片不相同,我们在一款芯片上开发的程序到了另一款芯片上可能就无法运行。因此出现了高级语言。通常有C++
,Java,Python。那么这三种语言有什么区别呢?

        在前面的介绍中,我们知道指令集这种东西,常见的指令集有X86和ARM指令集。

        C++作为典型的编译型语言,我们可以将其编译为不同的平台,但是对应的X86程序和ARM程序是无法相互兼容运行的。这也是源码的重要性。

        Java同样是编译型语言,但是Java编译出来的程序是自己定义的字节码指令。那么在X86和ARM上实现对这些字节码的虚拟机,就能运行Java
程序了。随着java越来越重要。很多芯片从硬件上实现了java虚拟机 。例如诺基亚的塞班系统和我们熟知的安卓系统,便是在arm上运行的java程序,arm芯片带
java硬件解析。

        那同样是定义自己的字节码的Python和Java又有什么区别呢?
Python作为一个解释型语言,虚拟机自带解释器,在运行的时候,不断读取字符串,然后通过解释器完成。

技术
©2019-2020 Toolsou All rights reserved,
Python学习笔记(一)Linux【shell】 shell编程创建一个线程——— Javaweb (3)evo工具使用问题——Degenerate covariance rank, Umeyama alignment is not possibleVMware 16安装centos 7详细教程C语言做一个简易的登陆验证(功能)界面C语言——qsort函数Spring Boot面试必问:自动配置原理Android EditText密码显示隐藏Qt入门教程【基础控件篇】QCalendarWidget日历控件