您好、欢迎来到现金彩票网!
当前位置:大发体育在线 > 指令译码器 >

代码是如何控制硬件的?

发布时间:2019-06-27 07:43 来源:未知 编辑:admin

  一般它都会告诉你,三极管/场效应管类似继电器(一种通过线圈产生磁场、然后用磁场控制物理开关的通断与否的设备);在它一个管脚上输入/切断电压信号,另一个管脚就会出现高/低电平。

  PS:继电器是一种利用电磁铁控制的开关;当向电磁铁通电时就产生磁场,而这个磁场就会吸合或者分离开关,从而实现“以微弱电流控制另一条电路的通断”这个功能。

  其中,平常触点接触使得被控制电路导通、给控制它的电磁铁通电后就使得开关断开的那种继电器,就等效于非门。三极管拿来当开关使用时,和这种继电器效果几乎一样。

  你敲入的任何东西,最终就是通过类似的东西/机制储存的;所谓“指令”,其实就是“某个命令码“(一般叫机器码),这个”命令码”会改变CPU内部一堆“开关”的状态,以激活不同的电路;然后数据(前面提到过,它也是用三极管/场效应管的导通与否“记忆”的)利用类似的机制,被送入这个被“指令”激活的电路——这些电路是工程师们利用最最基础的三极管控制原理,用一大堆三极管组合出来的:当数据(某种高低电平的组合)经过这些电路后,就会变成另外一组高低电平的组合:这个组合刚好和“指令”代表的功能所应该给出的结果一致。

  这段话可能有点难以理解。那么,看下最简单的与门吧:数据有两个,分别通过两条不同的线路进入与门;输出只有一个,必须给它输入两个高电平,它才会输出高电平;否则就输出低电平(这一般简化表述为:只有输入两个1,它才输出1,否则输出0)。

  ——这就是所谓的“与”逻辑;一组这样的“与”逻辑就与计算机指令/高级语言里的“按位与”直接对应。

  ——而按位与这个指令,意思就是选择一组线路,把数据导通到这组“与”逻辑电路之上;然后这组与逻辑电路就会输出两组数据的按位与的结果。

  ——类似的,二进制加法,1+1=0(同时进位);1+0=1;0+1=1;0+0=0:这可以用一个异或电路来模拟(因为异或电路的规则就是1+1=0、1+0=1、0+1=1、0+0=0);但这样(同时进位)这个说明就会丢失了,所以需要同时用一个与门模拟高位进位(前面说过,与门就是只有两个1才会输出1,其它输出0;综合异或的说明:这是不是就和二进制加法的规则刚好一致了呢?)

  然后更高一位就成了两根输入线上的数据相加、再加上进位数据……依此类推:这就是用开关做加法的思路。

  更多位数的数字的加法,只不过是对应位的二进制加法再加上前一位的进位位罢了,没什么特别的——这样堆起来的一组开关,就叫加法器。

  ——add指令呢,就是选中上面做的那一堆用来做加法的开关们;然后给它们输入数据(不要忘了,两组高低电平而已),这些数据就驱动着构成加法器的那些开关们,噼里啪啦一阵乱响之后(嗯,如果是老掉牙的继电器计算机的话:还记得BUG的故事吗?),电路就稳定在某个状态了:此时,加法器的输出,恰恰就是输入数据的和(当然是这样了。前面讲过,我们是刻意用异或门和与门精心组合,让它们刚好和加法的效果一致)。

  ——其它种种指令,莫不大同小异(更复杂/高级的时钟、流水线啥的……暂时就无视吧)

  而加法器和另外一些逻辑电路加起来,就是所谓的ALU(算术逻辑单元,一下子就高大上了有木有)。(当然了,实际上没这么简单。比如至少还要加上时钟信号来打拍子协调开关们的动作、加上锁存器来暂存数据之类——前面提到过,给加法器输入数据,构成加法器的一堆开关需要噼里啪啦一阵才能进入稳定态,然后就可以读出答案:时钟信号就是用来协调这些开关,保证它们都能得到足以达到稳定态的时间用的)

  简而言之,代码在计算机内部,本身就是一组特定的高低电平组合;而计算机是精心设计的、海量的、用高低电平控制通断的开关组;当给这个开关组输入不同的电平组合时,就会导致它内部出现复杂的开关动作,最终产生另外一组高低电平的组合作为输出;这些开关动作经过精心设计,使得它的行为是可解释、可预测的——解释/预测的规则,就是CPU的指令集。

  ——反而是键盘/鼠标/mic的输入要经过机械过程到数字信号的转换;而视频、音频之类的输出,要经过数模转换再通过其它机制才能变成人可辨识的信息

  我知道,很多人困惑的,可能并不是开关的原理;而是:如果CPU不过是一堆开关的话,它为什么能“听懂”类似“加法”“do...while”这类高大上的复杂指令、甚至做出office、photoshop甚至人工智能这样神奇的东西呢?这些高大上的语义,是怎么被电路所理解的呢?

  加法之类简单指令,前面已经介绍过了;而提到更复杂的东西……这就不得不说说图灵的贡献了。

  还是从最小儿科的题目开始。假设你从来没听说过乘法表;那么,你怎么算8×9呢?

  我们知道,A x B就是B个A相加或A个B相加的意思。那么,要算8×9,我们只要把8个9加起来就够了:7次加法而已。

  换句话说,这里有个很好的思想,即: 很多“高级”数学计算(如乘法),其实用“低级”方法(如加法)一样是可以算的。

  图灵的贡献就是,他证明了,如果一台机器,可以接受一系列的输入、并按输入指示完成运算;那么,当这台机器可支持的操作满足“图灵完备”的要求时,它就可以模拟任何其它数学/逻辑运算!

  这实在是太关键了。要知道,人类早就想利用机械装置代替一些脑力工作了。比如说,算盘,按照口诀机械的一阵摆弄,答案就出来了;还有老外的各种机械计算器,比如手摇计算机到炮兵用的弹道计算机、再到德军的机械加/解密机等等,这种尝试可以说是数不胜数。

  但,再怎么的,这些东西也只能解决特定的问题。想做能解决全部问题的通用机?天哪,那得有多复杂。

  ——一台只会做加法的机器,只要能想办法让它实现“连续做指定次数加法”,那它就可以模拟一台乘法机(模拟二进制乘法会更容易一些)。而能够模拟任何数学/逻辑运算的机器,并不比加法机复杂太多。

  换句话说,要搞出一台“无所不能”的计算机器,并不需要穷尽一切可能,而是只要支持程序输入、再支持少的令人发指的几条指令,就可以办到了。

  与就是全为真,则输出真;或是只要一个为真,则输出真;非则是输入真它就输出假、输入假就输出真——所谓的线,在计算机内部就是高低电平。

  别看CPU只会这三板斧;可当它们巧妙的组合起来后(构造成计数器、指令寄存器等等等等再组合成CPU),就达到了图灵完备的要求,产生了质变——比如,前面提到过的加法器,就是“如何用这类基本逻辑模拟多位二进制数的加法”的一个实例。

  更具体是怎么做的,这就不是三言两语能说清楚的了。还是仔细看看自己的数字电路这本书吧。

  ——数字电路研究的,就是如何用与或非这三板斧,来实现各种高级运算甚至CPU指令集这么复杂的事物(甚至是直接实现某些算法,如加密、视频编码等等)

  ——而CPU指令集呢,则形成了另外一个强大得多的图灵机(体现在能够支持更多比原始的与或非更”高阶“的操作上):这就是机器码(和汇编指令几乎一一对应)

  ——然后呢,诸如c/c++、java等高级语言,就是利用CPU指令集形成的、另一个更加强大的图灵机(编译器/解释器负责两种图灵机之间的翻译工作)。

  ——而程序员们研究的,就是如何用编程语言这样一个强大的图灵机,去实现office、photoshop、wow甚至人工智能这样复杂的事物。

  总之,开关的通断是基础;而各种神奇的功能是如何用这么简单的东西组合出来的呢,那就必须理解“程序”原理(也就是图灵机原理)了。

  如果说,计算机是一个人,那么,软件就是他掌握的知识。这个知识使得他不仅能掰着手指头数数(相当于硬件直接提供的基础功能),甚至还可以去洞悉宇宙的奥秘(相当于利用软件“模拟”出来的、无穷无尽的扩展功能)。

  首先,他要知道车的控制原理(知识/软件);然后,基于这些知识,大脑向他的四肢肌肉发出神经冲动,驱使他完成转方向盘、挂挡、踩离合器/油门等种种动作,最终达到开车这个目的。

  前面说过,程序本身就是高低电平的组合;它通过在CPU上执行来模拟各种决策过程;同时,计算机就是一堆开关;那么,通过指令向某些地址写出数据(访问特定地址是通过各种寻址机制/指令完成的,归根结底也可以说是通过开关切换,改变了电路拓扑),就等于开启/关闭了对应地址上的某个开关;这个开关可以是类似CPU内部那样的一组三极管,也可以是通向另外一个继电器的信号线——这个信号就促使继电器闭合,于是电机导通……

  就好象人开汽车一样,神经发出的微不足道的电脉冲经过肌肉放大,影响了涉及数百甚至数千马力的能量洪流的发动机/变速箱的运转,然后汽车就开走了。

  计算机也一样:它通过向控制特定地址上的开关输出0/1(高低电平),就可以通过事先准备的物理设施驱动诸如航模电机、舵机等等机构,这就完成了航模控制。

  航模上的传感器采集飞行姿态、地形、位置等等数据(最终转换成高低电平构成的信号)----信号通过某些端口送到CPU-----CPU执行程序,程序读取传感器发来的信号,决定下一步的行动-----经过程序的智能判断后,通过控制特定地址上的开关(前面提过,向这个地址发一组高低电平构成的数据就行了),驱动诸如航模电机、舵机等等机构,完成航模控制。

  右边是有两个装置的,上边的装置是用来保持内部输出到引脚的电平不会被外部的信号所干扰。下边的装置会把从外部收集来的信号临时存储起来,这里存的不是0就是1。怎么判断?大于某一电压就是1,小于某一电压就是0。这两个装置互不干扰。

  第七行的代码就是将某一引脚输出低电平并用上边的保持元件将其维持到低电平。

  那么,就有人想问了,为什么写成这样单片机就会认识呢?还会奇怪为什么单片机认识的语言和程序员认识的语言一样呢?

  首先,我写的这段代码会在一个软件里运行,这个软件会编译我的代码形成枯燥难懂但是70年代时会被人认为高大上的汇编语言,类似这样的(除绿色字部分,解释用的):

  这还不够,形成这样的语言会让计算机中的低等编译器认识,低等编译器会将代码翻译成如下图所示的东东

  注意,这是16进制的数,具体怎么转化为二进制我就不详细展开了。为什么要编译成图3的语言再编译呢?说白了我感觉就是跟水厂一样,水厂把我制作的水放到一个通用的大水管里然后通到不同单片机的家里,单片机按照自己家的情况把水引到厨房等地。(就是这样吧 - -)

  最下面的就是运算器,运算器能够进行加减乘除逻辑运算,控制器会从存储器中读取数据放到上图运算器上边的框框里,一个框框放一个数据。

  看到左右的两条道道了吗?数据会在控制器的控制下被放到这些框框里,当然控制器会控制最下面的运算器做出各种运算然后放回到上边的框框里

  让我们来解释一下最开始楼主说的输出低电平,上边的框框有一些是不能随便放数据的,这些框框用来引出引脚,即有些框框里的数据连接着引脚啊亲

  如果哪些地方没讲明白,大家可以交流一下,我会再详细讲讲我理解的一些内容。

  我们是用电脑的键盘来输入的指令,每一个指令都对应一个ASCII码,而这里的ASCII码就是有序的电压的高低(或电流的有无,下面只提电压的高低),即我们输入的是电压的高低,你所看到代码是这些电压的高低控制显示器所显示的图像,其实电脑也不知道它是什么,只知道这样显示。

  代码其实就是存储在存储器(内存、硬盘或者闪存等等)中有序的电压的高低。

  编译是一个有序的电压的高低向另一种有序的电压高低的一种转换过程,下面以52单片机为例,我们编译是从表示ASCII码的那种有序电压高低转换为52单片机能够识别的另一种规定好的有序电压高低,即表示HEX文件的电压高低。

  接下俩就是烧录,理解了上面两点就很容易理解下面的内容,烧录就是电脑中的有序电压高低通过数据线传输到单片机中的ROM中。

  总结:从代码的编辑到最后对电路的控制都是电压在起作用,只是为了方面我们而给我们展现的形式不一样而已,而其本质都是电压,这样也就不存在转换。

  世界上没有软件,软件只是对硬件的一种反映,就像意识是对世界的一种反映是一样的!

  只要你提到0/1,提到软件,这个问题就没法理解...因为软件【包括0/1】和硬件始终存在一道无法跨越的鸿沟;

  你说你在单片机中写0,请问你是如何写0的?在键盘上敲个0?实际还是电平【和我们理解的数字没关系】,那个0只是你在电脑显示器上电平的呈现形式,那个所谓的0【实质是电平】可以传输到单片机中的ROM中,电平控制电平没什么疑问吧,这样就输出低电平了...

  说再多也太抽象,直接看图。从高级语言网下到晶体管开关都有直接的映射关系,于是代码就这样控制硬件了。

  详细说一下,高级语言可以通过编译器转换成汇编语言。汇编语言就是硬件的指令,可以直接转换成0101010101。而这些010101就是电路中的低电平和高电平。这些电平控制开关的打开关断,于是各种组合就产生了复杂的逻辑电路。

  你的问题跨度很大。要想线;代码是如何控制硬件的,按前后顺序需要学习如下课程。

  你的问题可以分解为如下。1.计算机中什么是0?什么是1?2.什么是与门、或门和非门?3.冯.诺依曼计算机模型是什么?4.计算机中是如何编码的?这个很重要!!!5.计算机只有一种机器语言是可以执行的,其它高级语言如何变成机器语言?6.CPU的结构什么样?存储器什么样?输入输出接口什么样?特别是CPU中的控制器是干什么的?7.指令是怎么执行的?

  我们看到I/O的部分链接在APB(peripheral bus 外围总线)上。

  不难知道,所有数据的调度都来自STM32的核心--Cortex-M3.

  STM32是使用3级流水线,可以看到,最开始的一级是“取指”环节,那么执行的指令从哪里来呢?

  实际上,每一段程序都被保存在ROM里,这个ROM里保存的就是我们软件传达下来所赋予的“

  ”,微处理器通过总线在ROM里提取所需要的指令,然后再一定的时钟调配下,最后执行指令的。

  没有错,mem[]里表述的是地址,而右边的二进制码“16‘hd000”就是本质的0和1的组合,是能够被机器识别的,故称机器码。

  具体起来,这段机器码的不同位置的01排序代表不同的含义

  这样我们知道了,其实在储存器里保存的01序列,我们通过机器识别即取指令,可以了解到不同含义,进而执行不同的操作。

  一般就储存原理来说,每一个ROM都是一个个小房间,而房间的排列组合就是信息,他们是有序的。是通过一定模式或者条件下“烧写进去”的。即使没有外部触发,依旧能保持原有电位。

  EEPROM基本存储单元电路的工作原理如下图所示。与EPROM相似,它是在EPROM基本单元电路的浮空栅的上面再生成一个浮空栅,前者称为第一级浮空栅,后者称为第二级浮空栅。可给第二级浮空栅引出一个电极,使第二级浮空栅极接某一电压VG。若VG为正电压,第一浮空栅极与漏极之间产生隧道效应,使电子注入第一浮空栅极,即编程写入。若使VG为负电压,强使第一级浮空栅极的电子散失,即擦除。擦除后可重新写入。

  隧道效应: 量子力学则认为,即使粒子能量小于阈值能量,很多粒子冲向势垒,一部分粒子反弹,还会有一些粒子能过去,好象有一个隧道,称作“量子隧道(quantum tunneling)”。

  这个序列如何烧写进单片机,当然是有外围电路啦,具体就是通过一定的时序打开单片机的储存通路,然后把信息烧写进去。

  JTAG(Joint Test Action Group;联合测试工作组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如DSP、FPGA器件等。标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。

  我们写的软件都是高级语言,离机器很远,但是很容易被人的逻辑所理解,聪明的我们由一些翻译官完成更繁杂的工作:

  这些翻译官就是编译器,比如KEIL,就是把C语言翻译成汇编语言,再通过汇编器,把汇编语言变成机器码,然后把机器码烧写进单片机的ROM,单片机上电之后,运行程序,读取指令也就是那些信息,然后执行,控制IO口的寄存器,最后使IO口接地,哈哈,低电平就这样完成了。

  这个类似的问题也曾极度且“深隧”地困扰过我,现在好像是有了那么一点点茅塞顿开的感觉。试着把我以前的认识也是现在的认识直接贴上来,“分享”自己对这个东西的理解和认识,望各位多指导和指正。 批判我也不是太介意的。

  计算机代表了当代信息技术的最高水平之一。关于计算机它让我感觉太神秘,太神奇,有时它让我莫名心塞(很想试图大概脉络搞清楚它到底是个怎么个来龙去脉)!它太“强大”了!为此,我最近也看了一些相关书籍和相关文章……以下是我试图把我大脑里我概念里对计算机理解认识[民科 思维的式]的描述出来,有很多认识不足(甚至是错误认识描述)的地方,(如果可以)我真诚希望可以得到更多人一些权威专业的引导、指导和指正(非常非常地感谢):“模型,是工程师们“想象的共同体.”“运行在云端服务器上的一个软件,大约要调动10^24个晶体管。”――《柏拉图和技术呆子:人与科技的创造性伙伴关系》(Plato and the: The Creative Partnership of Humans and Technology),作者是加州大学伯克利分校电子工程与计算机科学教授爱德华·阿什福德·李(EdwardAshford Lee)。以上这两句话对我认识计算机,非常有启迪启发性!从[大自然物质的物理、化学、生物、特性、规律、规则]基础上来构建各种[心智模型],科学家从大自然中实践探索活动中发现 物理、化学、生物、特性、规律、规则,工程师利用这些特性、规律、规则,在实践应用活动中优化完善建立这些特性、规律、规则之间各种转换、联系、关系。以为人类更高效、更安全、更经济各种实践使用运用服务。所以从头到尾从一开始人手动输入(通常是健盘+鼠标输入)电信号开始,计算里面都是各种物理硬件模块、元件模块在工作,没有实质真正意义上的‘软件’,所谓的软件只是方便与人交互的电信号转换而来的展示出的效果图像。在敲击键盘编程的过程中,‘程序’实际上是通过键盘转换翻译成电信号存储到内存了,所谓的编译,是通过鼠标来操作可视化工具平台[模型-工程师们“想象的共同体”-方便人机交互人能更好理解的图像显示给人{ 因为人不能看见‘电压、电流、电场、磁场’,用身体去感知电压、电流、电场、磁场也不太现实,而最好的感知方式就是把那些各种不同的电压、电流、电场、磁场状态特征关系(信号)直接或间转换成为光线(图像)和相关物理硬件振动(声音)}。人所看到的图像和听到的声音本质上都只是计算机所有的底层物理硬件在工作转换各种不同的电流、电压、电场、磁场特征、状态关系。人在输入设备键盘、鼠标里每个、每步机械操作,最终都是在改变物理硬件里面的各种模块、各种元部件的物理电流、电压、电场、磁场等特征、状态关系。也就是显示器输出投射光线到人的视网膜里和扬声器振动空气通过声波传播到人的耳膜里,大脑再把这些光线信号和振动耳膜的信号转换成相应的大脑神经网络里的电信号和化学信号-交由人的大脑神网络做相关的分析、运算、判断、执行———其背后对应的是各种物理硬件上的电压、电流、电场、磁场状态特征关系{比如开关导通(1)或断开(0)}。而各种软件(抽象符号系统)模型-想象共同体,最后都可以且一定必须层层对应下去,最后都对应着最底层各个硬件模块、各个元件(晶体管)里物理层的电的各种特征状态和他们之间的关系。不同操作启动了硬件设备各个模块元件不同的规则(启动改变转换电的各种特征状态关系或相关连接)。所有的一切都是对电的各种状态特征关系运用和控制。所有的输入输出都只是在运用和控制电压、电流、电场、磁场特征状态关系。图像的输出(显示器):通过主机输出的的各种电压、电流、电场、磁场特征状态来驱动显示器(当前主流的TFT液晶显示屏)里IC的电压改变,使液晶分子排排站立或呈扭转状,形成闸门来选择背光源光线穿透与否,控制显示器里的成千上万液晶材料在时空上的偏转来选择来自显示器里发出的光线发射到由红(R)、绿(G)、蓝(B)三种彩色层组成的彩色滤光片上,通过彩色小光片的光线再投射输入我们的视网膜里,视网膜把相关光信号转换电信号输入大脑神经网络里,我们眼睛就看到丰富多彩的“世界”(“光”真是个伟大的存在)……声音的输出(扬声器):通过主机输出的的各种电压、电流、电场、磁场特征状态来驱动改变扬声器的线圈中的交变电流,线圈切割磁力线(杨声器由磁铁等构成的恒磁场),线圈将产生运动,运动的方向和大小根据输入的电信号的方向和大小而变化。线圈运动,就带着鼓膜振动,鼓膜振动压缩或拉伸空气(振动空气),从而传播声波,所以我们的耳膜就收到相应传来的振动声波。耳膜把相关振动声波信号转换电信号输入大脑神经网络里……半导体的物理规律,启动改变转换电的各种特征状态关系或相关连接(计算)是非常非常快的。计算机只做唯一的工作-就是加法运算,就这个用加法计算的方式来实现减法、乘法和除法,以及填写我们的话费账单,计算按揭付款,编写各种软件、程序应用APP、制作各种图表、文档、PPT、打各种游戏,下围棋、引导火箭到火星……人的感知有个天然的生理机理上的局限,就是我们很难更加深刻或更加清淅感知呈现超越人体感知极限的那些很小非常小的微观时空事物和很大超极大的宏观时空事物(比如,微观时空事物:据说—美国IBM最新研发的一款超级计算机Summit交付美国橡树岭国家实验室,宣布其浮点运算速度峰值达到每秒20亿亿次(200PFlops),比如一个2平方厘米面积大的硅片上装载着近百亿个晶体管;宏观时空事物 太阳系 银河系 星系的空间大小,光的传播速度约为为3x10⑻米/秒 )。任何所有生产资料、工具、应用设备、工具都可以分解到:每个各大模块之间的关系,每个各大模块中的各个子模块之间的关系,一直分解到每个元部件(或元器件),每个元部件(或元器件)再分解到每个构成的材料、化合物、分子、电子、直到每个粒子的关系。冰山一角

  实际上要回答这个问题需要从数字电路和组成原理讲起...我试着把CPU中的这条通路简化出来..

  ↑也就是说,在下面的段落,我会设计一个能够运行以上代码的CPU(并非图灵完备),以回答代码是如何控制硬件这个问题...

  CPU中任何一条指令最后都是体现在硬件上的。所谓硬件,就是指数字逻辑。任意数值与常数之间相等的判断的类似于译码,可以用如下结构完成。

  其实讲起来很简单的,0在计算机上用ASCII码表示,数值为16进制的7h30或者2进制的7b0110000.使用数字电路判断输入是否为0x30最直观的办法就是将其中不为1的二进制位反相,这样输入是0x30的时候,与门的输入全为1,与门也就输出1了。MC上使用了相反的办法,因为NOR门更容易使用红石电路实现。

  现实中,指令的载体是存储器。日常使用的存储器通常使用更为复杂的接口,例如USB,NVMe。我们只讨论原理,因此选择最简单的形式:地址/数据接口。这样的存储器拥有一个译码阵列和或阵列。译码阵列翻译输入的地址,用于选通或阵列中的行列,而数据就保存在或阵列中。

  如图就是一个典型的ROM,拥有3位地址线位数据线位的译码阵列。右侧的火把构成或阵列。这个ROM可以储存8字节数据。图中可以看出地址0处的数据是ASCII的1,地址1上的数据是9,现在选中的地址是2,输出为ASCII的2

  Minecraft,退出!后面的部分有点大大,皮不动了。(赞数多我就考虑下

  时钟用于产生一个节拍,控制后续的取指/执行。程序计数器(PC)其实就是一个普通的计数器,当然在这里要实现跳转功能,因此这个计数器需要带预置位。而指令译码器则是翻译ROM中取出的指令,将其转换为CPU中相关电路的控制信号。

  如图是程序计数器与时钟电路。输出ADDRESS直接驱动ROM的地址线。跳转指令的实现实际上就是使用计数器的预置位功能,当Load为高时,PC的值被设为JUMP TO。Load信号由指令译码器产生。

  合计一下,实现本文开头处的C代码大概需要三条指令,分别是强制跳转,条件跳转和写IO。于是可以这样规划一下。

  注意下面的MUX,在这里用于在条件跳转指令中选择条件....其他条件省略....当MUX输入2b11时可以选中比较器的输出....就相当于等于0x30时跳转....

  其实就是个带使能的D触发器.....DFF在时钟的上升沿锁存数据,其他情况下保持输出不变...输入挂在总线上...而使能由指令译码器控制...

  就是本文开头的C代码...现在要将其转换为可以在这个CPU上运行的汇编..不对....机器码....讲道理这个程序还是很简单的,总共三条指令的CPU就不用助记符了....脑补吧...

  完整电路图如下。左上与CLK相连的长方形框框是keybroad,用于产生输入。

  知乎上问具体专业问题果然不是好选择。前面的回答不能说是错的,至少也是不准确的。

  我们写的软件经过这几个步骤 高级语言--汇编语言---机器语言。机器语言是二进制的,每一种指令操作都有对应的二进制编码,比如我们执行 ADD R1,R2 指令, ADD有一个唯一的二进制编码假设为编码1 ,R1 R2是CPU寄存器地址也有唯一的编码设为编码2 编码3.这些编码的具体格式和数值是根据指令格式和具体cpu架构确定的。比如arm的指令字长就固定为32位,特定的位代表着条件码操作码等。arm的指令可参考《arm 体系结构与编程》杜春雷编

  有了这几个唯一编码之后呢?cpu就开始译码操作,进行一些数字电路的组合运算,假设编码1是 0x10(只是假设,实际各个指令集编号不同),当译码电路发现指令的操作码是0x10时就知道是进行加法运算,此时会输出一个有效信号选通加法器;同时也对编码2和编码3进行译码,选通对应的寄存器(哪一个是源寄存器哪一个是目标寄存器是由指令集格式规定的),然后就将寄存器输出的数据通过CPU内部的数据线送入加法器进行加法运算,运算的结果送入目标寄存器。这就运行了一个加法运算。

  直接回答题主的问题,当你在程序中对IO管脚的寄存器写0时,单片机将通过类似上述的步骤对指令进行译码,然后将0这个数据写入到IO管脚寄存器中。寄存器的数值如何送到对应的IO管脚?一般是通过D 触发器(如图):

  在单片机内部IO寄存器的数据口连接到D触发器的D管脚(实际上还有其他电路,用来增大驱动能力等),D管脚下面有小三角的管脚是时钟信号管脚,当时钟信号上升沿来临时,D触发器D端口的数据将输出到Q端口,Q端口是连接着外部的管脚的。所以只要IO寄存器不改变,Q管脚将一直保持着高电平或者低电平,即你程序表现出来的写0就使管脚输出低电平。

  总结一下:你的程序编写完后通过编译器将变成一堆二进制的机器编码-----单片机对这些编码进行译码,知道你要对哪一个寄存器进行什么样的操作-----对应的寄存器被写入正确的值,如果是IO管脚的话将根据时钟将寄存器的值输出到外部IO管脚。所以实际上单片机也就是一堆数字电路的组合,只不过我们人为的规定什么样的编码要进行什么样的操作而已。

  那怎么让它导通呢?用电压让它导通,你可以认为这个电压是一个能量,用能量驱动这个道理很通俗了吧;

  那你可能又要说了,那电压导通那它输出是一个具体的电压啊它也不是1呀,这个就是数电和模电之间的联系和区别了:

  ,而模电才是想得到一个电压输出,这就是模电和数电的天壤之别。那什么又是逻辑实现?简单的说其实也就是数学实现,所谓编程就是把我们的需求变成数学问题,用编程语言编辑出来,给到cpu,让它计算并驱动终端,最终把我们的逻辑显示出来。

  至于数模之间的联系,它们之间的联系就是器件都是靠电压驱动,那你又要问了,那么电压为什么可以驱动半导体器件?well,这个你要去看电磁场+半导体物理,可能还得看一点量子力学,我也都没看呢Orz;

  我们制造数字电路,就是想得到一个能让我们自由表达逻辑,并能让我们眼睁睁看见我们的逻辑实现了的一个工具

  ,至于这个工具是数字电路,还是量子路,还是光路,只要你低功耗性能好,是啥都无所谓,最好是真空才好呢,对人类来说,空气都智能了才好呢。

  我们说所谓数字系统,其实很简单,你给我输入,我就给你输出;你想要什么样的输出,那你就要分析分析你要给到我什么样的输入我才能输出你想要看到的输出,编程也就是这个过程;可是问题来了,你随随便便给我什么输入我都hold住吗?很明显是hold不住的,这个例子,我就不举了。。。。

  给这段下个结论就是:所谓指令集,其实就是给cpu这个数字系统一套驱动编码

  说到这其实大的框架就差不多了,剩下的比较重要的部分就是布尔代数和数学之间的联系,数学和实际需求之间的联系,然后就是显示这一部分,慢慢来吧

  凡是你们赞同的我都要反对,凡是你们反对的我都要赞同,优先处理积压的邀请问题,

  我来努力写一个让外行人也能看懂的答案。但前提是你得知道啥是多米诺骨牌。

  首先,硬件是由各种“门”组成,“门”是个术语,不懂没关系,可以把一个“门”看成是一个多米诺骨牌,它被推倒后能把下一张骨牌推倒。

  看过多米诺骨牌视频的都知道,骨牌的巧妙摆放再配合各种机关的话,在推倒后是可以实现许多种功能的,比如演奏音乐,控制灯光甚至开动汽车啦等等。

  假设在一个大房间里,已经摆放了这样一堆堆的多米诺骨牌,每一堆骨牌被推倒后,都能实现出特定的功能,但人是不能进来这个房间的,这些骨牌只能靠房间里的一个机械手来推倒。

  然后,在房间外面,摆放着有限的几块骨牌,人可以按照不同的排列组合推倒这些骨牌,然后房间里面就会有个机械手按照人的想法来推倒不同的骨牌,实现各种功能。

  但是,有时候,人想实现的功能太复杂了,光靠控制机械手推倒骨牌的话,要推倒成千上万块骨牌,太累,那么一种思路是:在房间里事先摆放更多,更复杂的骨牌,这叫增加硬件,但这样很不灵活,只能解决部分问题。

  另一种思路是:人每次都临时控制机械手在房间里摆放新的骨牌,然后这些骨牌被推倒后,就可以一次性触发更多的骨牌被推倒。

  但实际上房间里并没有新的骨牌,房间里已经摆放了一大堆专用的骨牌,然后机械手只是重新修改了这些骨牌摆放的位置而已。

  这个房间,就是一台电脑,那些已经摆放好的骨牌,就是硬件,按照你的意愿推倒一张骨牌,造成连锁反应,实现你想要的功能,叫做控制,通过机械手重新摆放的骨牌,就是软件。那一堆控制机械手的多米诺骨牌,就是你的鼠标键盘。

  非专业人士,以自己对于问题的理解来回答这个问题。抛砖引玉,欢迎专业人士指正。

  电子技术中有个叫做脉冲触发器的东西专门用来产生开闭信号,也就是你说的1、0。这个信号用来控制电路的导通与关闭,导通的电路参与到整个电路的运作中,关闭的电路不参与运作。与之对应的有很多各种各样的触发器,这些触发器的组合可以形成逻辑里的最基本的两种逻辑:与、非。与非两种逻辑又可以构成或、且、异或等。这就构成了基本的逻辑。

  为什么要说纺织机,其实现在的CPU的运行原理和纺织机是一样的。所以你的个人电脑也好手机也好都可以看做是一个高级的纺织机。

  纺织衣服的时候有两种状态,一种状态是线在上面,另一种是线在下面。通过这种综合交错的上上下下的线,衣服上就形成了图案。我们把线,线。把整个衣服看做是在一个xy平面上进行纺织的。那么纺衣服的过程就可以以如下步骤进行(以(0,0)点为例):

  如果再细分,选线这个步骤也可以细分为很多个由是否组成的问题,其他问题同理。也就是说,纺织机的原理其实就是把纺织这整套过程细分,分为一个个只有是非两种选项的问题。

  代码其实就是一整套是非指令的集合。CPU的厂商把一些常用的处理过程(是非指令的集合)比如说:移动、增加、减少编制成代码,你运行一次代码,就相当于完成了很多步的是非指令。这些指令的作用结果就是你可以看到的单片机的各种动作。最简单的就是算数了。前段时间有人问数学有什么用,这里就体现出来了数学的作用。正是有了数学这个工具,我们现在的处理器才能给我们展示如此丰富多彩的多媒体技术,你听到的声音、图像都是由1、0这样最基本的形式经过各种数学运算所展现出来的。

  。这个小游戏很好的展示了怎么通过一系列的是否问题来完成猜人名这个过程。玩儿完了你就会对整个计算机的运算过程有个初步的了解。

  1.数字电路基础,在这门课程里面你将会学习最重要的3块知识,组合逻辑电路,时序逻辑电路,SRAM存储器结构。

  2.计算机组成原理,在这门课程里面你将会学习到CPU的组成(包括各种寄存器,译码器,ALU)。

  组合逻辑电路是最基本的门电路,如下图(不必理解这个图,只是为了回答不会太抽象而引入的),特点是给定输入马上产生输出,比如最简单的与门,同时输入高电平,会立即输出高电平。如果撤去输入的信号,则输出也立马消失。组合逻辑的这种无时延的特性,适用于作为控制结构,比如机器人手臂的控制。

  时序逻辑电路是在组合逻辑电路的基础上,引入反馈,即将输出信号接入到输入信号中,这样做的结果就是当电路中输入信号消失后,电路的输出状态还能保持一段时间。最基本的时序逻辑电路叫做触发器,如下图所示(不必理解这个图,只是为了回答不会太抽象而引入的),通常会利用时序逻辑电路的延迟输出特性,来锁存数据,也就是所谓的寄存器。

  SRAM存储器,是最简单,最快速,同时成本也最高的存储器。基本上SRAM存储器就是由单个1bit的寄存器排列起来形成的大容量结构。在早期的电脑中,内存就是SRAM,CPU直接从里面读取所需要的指令和数据。

  CPU的组成,CPU是一个在统一时钟脉冲下,时序电路和组合逻辑电路组成的,复杂的数字电路系统。CPU中的ALU(逻辑运算单元)是一个典型的组合逻辑电路,ALU两端的输入是寄存器,寄存器和译码器是典型的时序逻辑电路。时钟脉冲的波形如下图所示(不必理解这个图,只是为了回答不会太抽象而引入的),简而言之就是一个按照固定时间输出高低电平的装置:

  理解了上述知识,下面以51单片机亮灯的例子来讲解软件控制硬件的流程,假定51的输出端口P0.0 ~ P0.7。代码要做的事情是完成2+3的运算,并且通过P0口亮灯来显示二进制5.

  写入软件二进制代码到SRAM - CPU加电后,在第一个高电平会自动从SRAM的零地址处读取第一条指令,这是一条ADD操作,用组合逻辑电路进行进行译码工作,CPU立即理解了这条指令是要进行加操作,随后会设置一个标志寄存器,指示在接下来的2个高电平处分别取接下来的2个操作数2和3,同时指示ALU做好ADD计算的准备 - 第二个高电平到来后CPU译码器按照标志寄存器的指示,读取第一个操作数2,并存入寄存器B - 第三个高电平到来后CPU译码器接着按照标志寄存器的指示,读取第二个操作数3,并存入寄存器ACC - 第四个高电平到来后ALU执行ADD运算,并将结果存入P0寄存器,P0寄存器被设置后,发光二极管立即按照高低电平的不同或明或暗,显示出5的二进制。

  在这里一个2+3的操作被硬生生的分成了4个时钟周期,可能大家会觉得这个太繁琐了,为何不能一次性搞定呢?首先CPU的位数有限,一次只能读取8位的代码,而刚才的2+3这个指令存储在SRAM中必然不止8位,因此CPU至少要分2次读取。

  为啥不能在第二次读取后立即进行ALU运算,而是需要单独给一个时钟周期让ALU进行运算呢?这个就涉及到组合逻辑电路的延迟问题,延迟是指组合逻辑电路从开始输入,到产生稳定的输出,需要一个极短的时间t,如果时钟脉冲低于这个时间t,那么就会造成组合逻辑电路输出到寄存器中的值是错误的,比如本来要输出1,但因为在电路输出还没到1的时候,就让寄存器锁定了数据,因此寄存器实际存储的是0.

  要做到第二次读取后就进行ALU运算,要求将译码器的输出作为ALU的输入进行运算,假设译码器输出延迟为n,ALU的输出延迟为m,则n+m加起来可能超过一个时钟周期,这样子会造成CPU内部的输出不稳定。

  由此联系到CPU的超频,为何CPU不能任意时钟频率进行超频,实际上也是因为内部组合逻辑电路的速度是有限的,当时钟频率越高,留给组合逻辑电路达到稳定态的时间越短,等到超出某一频率的时候,CPU内部的工作就将是不可预测的。

http://cajonbrush.com/zhilingyimaqi/148.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有