cpu如何根据机器码光信号转换成电信号激励电光信号转换成电信号的

手把手教你用机器码编程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
手把手教你用机器码编程
上传于||文档简介
&&手​把​手​教​你​用​机​器​码​编​程
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
你可能喜欢| 时间排序
其实吧,你把三条数据线当成一条,把3个双D触发器当成一个存储单元,把三个1bit全加器当成一个1位加法器,然后你就得到了一个8进制电脑。&br&问题是这个东西有什么额外的卵用?
其实吧,你把三条数据线当成一条,把3个双D触发器当成一个存储单元,把三个1bit全加器当成一个1位加法器,然后你就得到了一个8进制电脑。问题是这个东西有什么额外的卵用?
拿我们最常用的PC的x86指令集来举例:&br&在你写下这条加法语句之后,用编译器进行编译。它能够读懂你写下的语言,并转换为计算机能看懂的机器码。在这个过程中,编译器的前端会对你写下的C语言进行词法分析和语法分析,产生一个语法树。这棵树包含了你程序的本质,也就是语义。随后,语法树被交给编译器的后端,后端可以根据语法树来生成CPU能读懂的二进制机器码。这就是机器码的产生过程。&br&&br&在x86平台上,普通的整数加法运算由add汇编指令完成。这里说的指令,只是机器码的助记符,本质依旧是机器码。试举一例:&br&(左列为机器码的十六进制表示,右列为相应的汇编语句)&br&&div class=&highlight&&&pre&&code class=&language-text&&B8 01 00 00 00
&/code&&/pre&&/div&第一条机器码将寄存器EAX的值设置为1,第二条将eax的值加1。执行之后,寄存器EAX的值为2。寄存器是CPU中的重要部件,也是珍贵的资源,寄存器参与的计算具有很快的速度。&br&&br&那么,CPU是怎么知道十六进制83 C0 01就代表“把EAX加1”呢?又是怎么计算出结果的呢?&br&CPU在得到了一条指令之后,会通过被称作指令解码器(instruction decoder)的电路来将一条“指令”变成“动作”,进而驱动其他的电路完成我们需要的工作。在这个例子中,我们的主角是算术逻辑单元(arithmetic logic unit, ALU),中的一个小小的,名为加法器(adder)的子集。&br&应该如何计算两个二进制位的加法呢?&br&&br&很容易想明白,设A、B为输入,S(和,sum)、C(进位,carry)为输出的话,运算应当会有如下的结果:&br&&div class=&highlight&&&pre&&code class=&language-text&&A B C S
&/code&&/pre&&/div&&br&稍微联想一下就会发现,异或门(nor gate)和与门(and gate)恰好合理地构成了两个二进制位的和与进位结果,于是半加器(half adder)应运而生:&br&&img src=&/527c31992afe3d1c1eaa6745cdce0d20_b.png& data-rawwidth=&220& data-rawheight=&122& class=&content_image& width=&220&&&br&但是随后我们发现,人们不可能总是满足于一位二进制数的运算。我们可能需要计算4位、10位、甚至64位。于是,就将两个半加器组装成一个可以级联(cascade)的全加器:&br&&img src=&/abd3e6cce398_b.png& data-rawwidth=&389& data-rawheight=&129& class=&content_image& width=&389&&只要把一个全加器的Cout端,与另一个全加器的Cin端连接,就完成了级联,得到多一位的加法器,进而实现更多二进制位的加法。&br&但是事实上,我们的世界的信号是模拟的(电压),而数字(一和零)只是一个美好的抽象。而晶体管因为具有开关特性,就很自然地被用来实现数字电路,相对高的电压就是1,而相对低的电压就是0。&br&这就是一条加法在计算机中的(简化)原理。
拿我们最常用的PC的x86指令集来举例:在你写下这条加法语句之后,用编译器进行编译。它能够读懂你写下的语言,并转换为计算机能看懂的机器码。在这个过程中,编译器的前端会对你写下的C语言进行词法分析和语法分析,产生一个语法树。这棵树包含了你程序的本…
实践检验真理。&br&参照知网论文:&br&三进制逻辑电路。使用的是场效应管。&br&&img src=&/160434faefaeb0a3d3ea_b.png& data-rawwidth=&349& data-rawheight=&312& class=&content_image& width=&349&&将上面的电路接几个试试,在往储存和计算方面想想设计吧,看有什么问题。
实践检验真理。参照知网论文:三进制逻辑电路。使用的是场效应管。将上面的电路接几个试试,在往储存和计算方面想想设计吧,看有什么问题。
看到很多大爷都是从硬件限制来谈,或者从e最优角度来谈……也就是说主要认为是硬件原因……&br&但是事实上你考虑一下,如果要编写代码的话,无论高层底层,大部分情况你都是“01”逻辑……哪怕你并没有在关心到底你手上的数是几进制……&br&究其原因是,在以数字电路为基础的计算机系统构建中,无论是电路实现还是程序实现,数学上都是 离散 的…&br&或者说,数字电路或者代码,本质上都是人类逻辑的形象(物理)实现,而此时因为人类逻辑最自然的就是 是-非 逻辑,所以在实现电路上,编写代码时,自然而然的也是0-1逻辑……&br&0假1真……你给我234567我拿来干嘛?&br&到最后还是会退化成二进制&br&因此自然而然的就会使用二进制……&br&而非二进制的计算机系统是如此反逻辑,想想不都觉得蛋疼么……
看到很多大爷都是从硬件限制来谈,或者从e最优角度来谈……也就是说主要认为是硬件原因……但是事实上你考虑一下,如果要编写代码的话,无论高层底层,大部分情况你都是“01”逻辑……哪怕你并没有在关心到底你手上的数是几进制……究其原因是,在以数字电…
不用电子元器件不就结了,十进制计算机不是天方夜谭。相信欧美日也正在研发,只是向外放烟幕弹——宣扬二进制的优势。十进制计算机无论在存贮还是运算都远远优于二进制计算机,并且十进制芯片将为人工神经网络的成功奠定基石。&br&题外话:《离散数学》那么难,有些人好不容易学通了。如果搞出十进制计算机,彻底废了数理逻辑的或与非,那些研究了一辈子T
F 的人得有多失落啊!
不用电子元器件不就结了,十进制计算机不是天方夜谭。相信欧美日也正在研发,只是向外放烟幕弹——宣扬二进制的优势。十进制计算机无论在存贮还是运算都远远优于二进制计算机,并且十进制芯片将为人工神经网络的成功奠定基石。题外话:《离散数学》那么难,…
真的要说最初的电子计算机eniac就是十进制的,虽然我不知道那时候是怎么实现的
真的要说最初的电子计算机eniac就是十进制的,虽然我不知道那时候是怎么实现的
根据图灵机的原理,状态的多少与计算能力是无关的,所以两种就够了。
根据图灵机的原理,状态的多少与计算能力是无关的,所以两种就够了。
如果知道有模拟计算机,应该不会觉得奇怪吧。
如果知道有模拟计算机,应该不会觉得奇怪吧。
这让人想到了量子计算机和Qbit.
这让人想到了量子计算机和Qbit.
你理解错了。。。机器码不是计算机的编号,而是计算机最底层的代码,可以由计算机直接理解的.。。。。
你理解错了。。。机器码不是计算机的编号,而是计算机最底层的代码,可以由计算机直接理解的.。。。。
多谢Kaiser Li,问题已经解决。&br&这条伪指令是IDA翻译出来的,如果要改常量表达式,在本段代码末端会有对应的值,修改即可
多谢Kaiser Li,问题已经解决。这条伪指令是IDA翻译出来的,如果要改常量表达式,在本段代码末端会有对应的值,修改即可
&a href=&///?target=http%3A///link%3Furl%3D83-XJ-2KEt4gCIeLG1Bi2oTgQXeHqDUDAJ-zXVt8nlAf_VOg7_6FyXmKCJPiB2J98u-fosB0ERlnn_53rTjnpS8dL96MdZncTzmUMpSZV7y& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&第三章 ARM指令集&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A//download.csdn.net/detail/rsmars/3176245& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ARM指令集详解(包括机器码)&i class=&icon-external&&&/i&&/a&&br&这种东西,只要你去搜搜很快就能找到了。&br&可能你不知道关键词: ARM 指令集 机器码
这种东西,只要你去搜搜很快就能找到了。可能你不知道关键词: ARM 指令集 机器码
我觉得楼上的很多答案被限制住了。确实人类之所以选择二进制作为计算机的底层码进制,是因为现在的硅基电路通断来表示1/0是一个非常理想的格式套用。但是我突然想聊聊如果假设一个平行宇宙,那里四进制 八进制 十进制 甚至奇怪的七进制 80进制 82334进制的电路可行的话,计算机会变成会变成什么样子。&br&&br&-----------------------------以下讨论的东西并非现实也不理智,请谨慎阅读---------------------------------&br&&br&首先现在的信息格式会全部重来。同样的单位存储的数据会大大增加。 现在的信息格式以二进制为基准,最小的信息格式为位(bit)只有1/0两种表示,也就是逻辑里面的true/false. 8 bit = 1字节(byte), 1024 byte = 1 KB(千字节), 1024KB = 1 MB (兆) 等等等等。&br&&br&而假设如果改成八进制。那么一个bit 将可以代表8种状态。 假设B KB MB的相对大小不变的话,那现在每一个bit都可以储存原来3bit的数据,立刻我们就可以从可以获得3^(8+) = 9.147e980 (九点一四七乘以十的九百八十次方,大概就是9后面980个0)现在MB的数据。 那相当于现在的……………………………………没法算了。。。。。&br&&br&而建立在这个数据膨胀基础上的东西,是很恐怖的。&br&&br&昨晚熬了一夜,看到这个问题很有意思,开个引子。睡一觉再补充。
我觉得楼上的很多答案被限制住了。确实人类之所以选择二进制作为计算机的底层码进制,是因为现在的硅基电路通断来表示1/0是一个非常理想的格式套用。但是我突然想聊聊如果假设一个平行宇宙,那里四进制 八进制 十进制 甚至奇怪的七进制 80进制 82334进制的…
因为电子只有正极和负极,
因为电子只有正极和负极,
我是来科普下e进制为最优的事情:&br&问题:&br&设备总共&img src=&///equation?tex=V& alt=&V& eeimg=&1&&个独立状态,则能表征出&img src=&///equation?tex=%5Cfrac%7BV%7D%7BN%7D& alt=&\frac{V}{N}& eeimg=&1&&位的&img src=&///equation?tex=N& alt=&N& eeimg=&1&&进制;&br&能表征的信息量有&br&&img src=&///equation?tex=I%3DN%5E%5Cfrac%7BV%7D%7BN%7D& alt=&I=N^\frac{V}{N}& eeimg=&1&&&br&问题变为求&img src=&///equation?tex=I& alt=&I& eeimg=&1&&的最大值&br&两侧取对数&br&&img src=&///equation?tex=lnI%3D%5Cfrac%7BV%7D%7BN%7DlnN& alt=&lnI=\frac{V}{N}lnN& eeimg=&1&&&br&求导&br&&img src=&///equation?tex=-%5Cfrac%7BV%7D%7BN%5E2%7DlnN%2B%5Cfrac%7BV%7D%7BN%5E2%7D& alt=&-\frac{V}{N^2}lnN+\frac{V}{N^2}& eeimg=&1&&&br&导数为零&br&&img src=&///equation?tex=%5Cfrac%7BV%281-lnN%29%7D%7BN%5E2%7D%3D0& alt=&\frac{V(1-lnN)}{N^2}=0& eeimg=&1&&&br&此时需要&img src=&///equation?tex=1-lnN%3D0& alt=&1-lnN=0& eeimg=&1&&&br&所以&img src=&///equation?tex=N%3De& alt=&N=e& eeimg=&1&&
我是来科普下e进制为最优的事情:问题:设备总共V个独立状态,则能表征出\frac{V}{N}位的N进制;能表征的信息量有I=N^\frac{V}{N}问题变为求I的最大值两侧取对数lnI=\frac{V}{N}lnN求导-\frac{V}{N^2}lnN+\frac{V}{N^2}导数为零\frac{V(1-lnN)}{N^2}=0此时需…
因为没有稳定的元器件,来表示三种或者多种状态,也就是0/1。就我所学,目前的二进制可以实现加减乘除,还有逻辑判断,而且可以有很高的速度。如果要实现其他的进制,不仅要有稳定的状态,还需要在算法上面做文章,底层的工程是不小的。
因为没有稳定的元器件,来表示三种或者多种状态,也就是0/1。就我所学,目前的二进制可以实现加减乘除,还有逻辑判断,而且可以有很高的速度。如果要实现其他的进制,不仅要有稳定的状态,还需要在算法上面做文章,底层的工程是不小的。
如果楼主问的是部件的一个单元能表示的状态的话,其实在计算机的某些应用上已经在应用着四进制、八进制。&br&比如在计算机网络传输上,在波特率(硬件产生的电信号变化次数)不变得基础上,可以通过多电平方式提高传输效率&img data-rawheight=&149& data-rawwidth=&311& src=&/290d07f87b8de2f3d7876fef9cfe8ca4_b.jpg& class=&content_image& width=&311&&&img data-rawheight=&147& data-rawwidth=&299& src=&/892a0f3e2d69666bf01b_b.jpg& class=&content_image& width=&299&&如图,同波特率基础上,使用两个信号电平的系统在单位时间内只能发送1个bit,但是使用两个信号电平的系统在单位时间内就能发送2个bit。比特率=波特率*[log2(电平数)]。&br&在存储方面,目前正在逐渐流行的SSD(固态硬盘)绝大多数也是使用着MLC(multi-level cell)技术,即一个存储单元存储2bit单位的数据。个别无良心厂商(我不是在说三桑- 0 -)会使用所谓的3bit MLC,即TLC技术(trinary-level cell),每个存储单元存储3bit单位的数据。市面上也有速度、可靠性上都要高上一大截的SLC(single-level cell)技术的SSD,但因为价格原因没有普及开来。&br&但要注意到,网络传输中使用的电平数越多,在传输中出错的几率也就越大,对接收方的灵敏度要求也会大大提高,要使用CRC等各种校验方式确认数据无误。数据存储中,随着单个单元状态个数的增加,传输速度和可重复擦写次数都会大大降低(slc,mlc,tlc之间传输速度相差几十倍,可重复擦写次数相差几百倍)。&br&目前使用非二位元单元的多是数据存储,传输设备。对于处理器,诚然,大于二进制可以提高其内部信息存储密度和同样波特率下的比特传输率。但cpu对数据的传输速度,传输可靠性,运算简洁性的要求都很高。目前cpu的主要部件还是各种逻辑运算器而不是存储器,而二进制下的各种逻辑运算器目前最为简洁高效可靠。二进制的高速、稳定能满足传输可靠,运算简洁的要求。而为了提高传输速度,多采用并行、多级缓存等其他方法。&br&对10进制的部件不太清楚,不过我想大部分设备的单元存储位元应该还是二的次幂的,毕竟cpu的架构摆在那,8进制、16进制还是要比10进制方便不少。
如果楼主问的是部件的一个单元能表示的状态的话,其实在计算机的某些应用上已经在应用着四进制、八进制。比如在计算机网络传输上,在波特率(硬件产生的电信号变化次数)不变得基础上,可以通过多电平方式提高传输效率如图,同波特率基础上,使用两个信号电…
已有帐号?
社交帐号登录
无法登录?
社交帐号登录21ic官方微信
您现在的位置是:&>&&>&
大师教你如何制作一个简单的16位CPU
&如何制作一个简单的16位CPU,首先我们要明确CPU是做什么的,想必各位都比我清楚,百度的资料也很全。。。。。
如果想要制作一个CPU,首先得明白下计算机的组成结构(或者计算机的替代品,因为并不是只有计算机有CPU,现在的电子产品都很先进,很多设备例如手机、洗衣机甚至电视和你家的汽车上面都得装一个CPU),数字电路基础,还最好有点编程的基础(当然,没有也没关系,这些知识都很容易获得,各种书上面都会提到,并且在接下来的过程中我会提到这些知识)
我们要实现的是一个RISC指令集的CPU,并且我们最后要自己为这个CPU设计指令并且编码。
首先我们来听个故事,关于CPU的诞生的故事:
日本客户希望英特尔帮助他们设计和生产八种专用集成电路芯片,用于实现桌面计算器。英特尔的工程师发现这样做有两个很大的问题。第一,英特尔已经在全力开发三种内存芯片了,没有人力再设计八种新的芯片。第二,用八种芯片实现计算器,将大大超出预算成本。英特尔的一个名叫特德?霍夫(Ted
Hoff)的工程师仔细分析了日本同行的设计,他发现了一个现象。这八块芯片各实现一种特定的功能。当用户使用计算器时,这些功能并不是同时都需要的。比如,如果用户需要计算100个数的和,他会重复地输入一个数,再做一次加法,一共做100次,最后再打印出来。负责输入、加法和打印的电路并不同时工作。这样,当一块芯片在工作时,其他芯片可能是空闲的。
霍夫有了一个想法:为什么不能用一块通用的芯片加上程序来实现几块芯片的功能呢?当需要某种功能时,只需要把实现该功能的一段程序代码(称为子程序)加载到通用芯片上,其功能与专用芯片会完全一样。
经过几天的思考后,霍夫画出了计算器的新的体系结构图,其中包含4块芯片:一块通用处理器芯片,实现所有的计算和控制功能;一块可读写内存(RAM)芯片,用来存放数据;一块只读内存(ROM)芯片,用来存放程序;一块输入输出芯片,实现键入数据和操作命令、打印结果等等功能。
看完这个故事后,可以总结:CPU是一种用来代替专用集成电路的器件(这只是我的理解,不同人有不同理解,这个就智者见智了,我在接下来的例子中也会说明我的想法)。
然后考虑如下这个例子:
repeat:inc eax
jmp repeat
int main()
unsigned int i = 0;
可以看到,以上三个例子都产生了一个从0不断增加的序列,而且前两个例子会一直加到溢出又从0开始(这个取决于计算机的字长也就是多少位的CPU,eax是32位寄存器所以必然是加到然后回0,而后面那个c程序则看不同编译器和不同平台不一样),后面那个例子则看你用的是什么样的加法器和多少个D触发器
那问题就来了,我假设要一个递减的序列怎么办呢?前两个例子很好解释,我直接改代码不就得了:
repeat:dec eax
jmp repeat
int main()
unsigned int i = 0;
你只需要轻轻敲击键盘,修改了代码之后,它就会如你所愿的执行。
但是后面那个例子怎么办呢?可能你已经想到办法了:如例2-3所示。
问题就来了,你在键盘上敲两下可不能改变实际电路!上面(例1-3)中是个加法器,但是跑到这里却变成了减法器(例2-3)!
这样的话,你就得再做一个电路,一个用来算加法,一个用来算减法,可是两个电路代表你得用更多的电路和芯片,你花的钱就得更多,要是你不能同时使用这两个电路你就花了两份钱却只干了一件事!
这个问题能被解决吗?答案是能!
这个例子中使用了一个加法器一个减法器,没比上面的电路省(显然。。。。难道你想用减法器做加法器的功能?不可能吧!当然,加上一个负数的补码确实就是减去一个数,但是这里先不考虑这种问题),多了一组多路器,少了一组D触发器。总的来说,优势还是明显的(两块电路板和一块电路板的差别)。
而sel信号就是用来选择的(0是递增,1是递减)。
如果我们把sel信号看做&程序&的话,这个电路就像一个&CPU&能根据&程序&执行不同的&操作&,这样的话,通过&程序&(sel信号),这个电路就能够实现复用。
根据上面的结论,我认为(仅仅是个人认为啊~):程序就是硬件电路的延伸!
而CPU的基本思想,我认为就是这样的。
接下来我们就分析CPU的结构和各个部件,然后实现这个CPU。
什么是单周期CPU,什么是多周期CPU,什么是RISC,什么是CISC
首先大家得有时钟的概念:这个问题不好解释啊。。。。。。可以理解为家里面的机械钟,上上电池之后就会滴答滴答走,而它&滴答滴答&的速度就是频率,滴答一下用的时间就是周期,而人的工作,下班,吃饭和学习娱乐都是按照时钟的指示来进行的(熬夜的网瘾少年不算),一般来说,时钟信号都是由晶体振荡器产生的,0101交替的信号(低电平和高电平)。
数字电路都需要一个&时钟&来驱动,就像演奏交响乐的时候需要一个指挥家在前面指挥一样,所有的人都会跟着指挥的拍子来演奏,就像数字电路中所有的部件都会跟着时钟节拍工作一样。
如下是一个理想的时钟信号:(注意是理想的)。
当然,实际的时钟信号可能远没有这么理想,可能上升沿是斜的,而且占空比也可能不是50%,有抖动,有偏移(相对于两个器件),可能因为导线的寄生电容效应变得走形。
上面那段如果没听懂也没关系~~~反正就是告诉你,实际的时钟信号测出来肯定没这么标准。
而cpu的工作频率,是外频与倍频的积(cpu究竟怎么算频率,其实这个我也不太清楚呵呵),因为cpu是通过外部的晶振产生一个时钟信号,然后再通过内部的电路(锁相环),倍频至需要的频率。当然,有人问,为什么要这么麻烦呢?直接在电路外边做个时钟晶振能产生那么高的时钟信号就可以了嘛,这个是可以的,在某些简单的系统上(例如51单片姬)就是这样的,但是计算姬的cpu比较复杂,因为一些原因所以必须要做到cpu内。
下面简单说一下CPU的两种指令集:CISC和RISC。
说下我的看法(个人看法,如有错误还请高手指正):
RISC是Reduced Instruction Set Computer,精简指令集计算机,典型例子是MIPS处理器。
CISC是Complex Instruction Set
Compute,复杂指令集计算机,典型例子是x86系列处理器(当然现在的x86指令还是当初cisc的指令,但是实际处理器的结构都已经变成了risc结构了,risc的结构实现流水线等特性比较容易,在计算机前的你如果用的是intel某系列的处理器,则它使用的指令集看上去还是像cisc的指令,但是实际上你的cpu的结构已经是risc的了)。
一般CISC的处理器需要用微指令配合运行,而RISC全部是通过硬连线实现的,也就是说,当cisc的处理器在执行你的程序前,还得先从另外一个rom里面读出一些数据来&指导&处理器怎么处理你的命令,所以cisc效率比较低,而risc是完全通过部件和部件之间的连接实现某种功能,极大的提高了工作效率,而且为流水线结构的出现提供了基础。cisc的寄存器数量较少,指令能够实现一些比较特殊的功能,例如8086的一些寄存器:
ax,bx,cx,dx,si,di等;段寄存器有:cs,ds,es,ss等。相对的指令功能比较特殊,例如xlat将bx中的值作为基地址,al中的值作为偏移,在内存中寻址到的数据送到al当中(以ds为段寄存器)
而risc的处理器则通用寄存器比较多,而指令的功能可以稍微弱一点,例如:
以nios嵌入式处理器来说明,nios处理器有32个通用寄存器(r0~r31),而指令功能相对x86的弱一些,而且x86进行内存访问是直接使用mov指令,nios处理器读内存用的是load,写内存用的是store,
二者响应中断的方式也不一样,举一个典型的例子,x86的处理器将中断向量表放在了内存的最低地址(0-1023,每个中断向量占四个字节),能容纳256个中断(以实模式的8086举例)响应中断时,将中断号对应的地址上的cs和ip的值装入到cs和ip寄存器而将原来的地址保存,并且保存状态寄存器然后进入中断处理,而risc则拥有一个共同的中断响应函数,这个函数会根据中断号找到程序向系统注册的函数的地址,并且调用这个函数。一般来说而是用的cisc指令的长度是不定的,例如x86的xor
ax,bx对应机器码是0x31d8、而push ax是0x50、pop cx是0x59。而risc的指令确是定长的,例如32位。
如果还有不清楚的。。。。。自行百度,要理解这些概念需要一点时间
一个CPU的基本结构以及必要组件
这个例子引用自DE2开发板套件带的光盘上的Lab Exercise
9,我们从图中可以看到,一个CPU包含了通用寄存器组R0~R7,一个ALU(算术逻辑单元),指令寄存器IR,控制器(一般这部分是一个有限状态机或者是用微指令实现),还有就是数据通路(图中的连线)。当然真正的CPU不可能只包含这么一点点组件,这是一个模型CPU,也就是说只是说明CPU的原理,真正复杂的CPU要涉及到很多复杂的结构和时序,例如虚拟模式需要使用一些特殊的寄存器、为了支持分页需要使用页表寄存器等,为了加速内存的访问需要使用TLB,加速数据和指令的访问而使用data
cache和instruction cache等等。。。。。当然,那都是后面该考虑的,所以我们先从这个简单的部分开始讲起。
例子中能实现如下指令:
mv指令将Ry的数据转移到Rx中,mvi将立即数D转移到Rx当中,add将Rx和Ry的和放到Rx中,sub同上,不过执行的是减法。
首先来说明mv指令是如何执行的:mv指令将Ry的值移入Rx寄存器当中,这两个寄存器都是由一组D触发器构成,而D触发器的个数取决于寄存器的宽度,就像32位机、64位机这样,那他们的寄存器使用的D触发器的个数就是不一样的。当执行mv
rx,ry时,中间的多路器(图中最大的那个multiplexer)选通Ry,让Ry寄存器驱动总线,这个时候Bus上的信号就是Ry的值;然后再看到R0~R7上分别有R0in~R7in信号,这个信号是使能信号,当这个信号有效时,在上升沿此触发器会将din的数据输入,所以说到这里大家一定想到了,这个时候Rx触发器上的Din信号就会变为有效,这样过了一个时钟周期后Ry的值就被送到了Rx当中。
与mv指令类似,mvi指令也将一个数据送入Rx当中,只不过这次的数据存在指令当中,是立即数,所以Rx的Din信号会变为有效,而多路器会选择IR中的数据,因为mvi指令的立即数存在指令当中。并且进行一定处理,例如扩展等。
add指令会让多路器先选择Rx,然后Ain信号有效,这样一个时钟周期后,Rx数据被送入Alu的A寄存器当中,这时多路器选择Ry,addsub信号为add以指示ALU进行加法操作,Gin有效让G寄存器存放运算结果,然后再过一个时钟周期G当中的数据就是Rx与Ry的和,这时多路器再选择Gin,Rx的Din有效,过了一个时钟周期后数据就被存放到Rx当中了。
sub的过程与add差不多,不过addsub信号是sub指示ALU进行减法。
我做的CPU模型
下面我就将我做的CPU模型的RTL网表发出来,代码我会上传的,但是这个还只能进行仿真,因为设计的时候理念有问题,出现了异步设计,而且出现了将状态机的输出作为另一个器件的时钟端的错误,所以这个模型只能用于仿真。我用的synplify
pro综合出的RTL,而状态转移图是用的Quartus的FSM Viewer截下来的。
首先是整个系统的概览:
这个比上面的那个简单模型复杂多了吧!但是别担心,其实这个只是上面的那个CPU变得稍微复杂了一点,这个和上面那个不同的地方还有:这个CPU是一个多周期CPU而上面的Lab
Exercise是一个单周期的CPU
下图是程序计数器(PC),也就是常见x86处理器里面的ip(instruction poiniter):
红色部分就是pc了,后面是一个三态桥,连接到了总线上面,这里的数据有时候是要送到地址总线,用于寻内存中的数据,以便完成Instruction
Fetch过程。有时候又要送到通用寄存器的数据端,用于将pc的值送到其他寄存器。
下面这个是IR(Instruction
Register),这个是多周期处理器的典型特征,因为处理器在第一个周期里面将机器码从内存取出,然后存放到这个寄存器里面,后面的几个状态都是通过这个寄存器里面的数据作为指示执行操作的。
下面介绍一下ALU,ALU是Arithmetic Logic
Unit,即算术逻辑单元,这个装置的作用是进行算术操作和逻辑操作。典型的算术操作例如:1+1=2,11x23=253,而典型的逻辑操作例如:1 and
1=1,0 or 0 = 0,1&&3=8这种属于逻辑操作。
而从图中大家也看得到,ALU的输出用一根很长的线连接到了后面,参考整个CPU的图的话,会发现这些线连到了通用寄存器上面,这是为了让运算的结果存放回去,例如你用add
eax,1的时候,eax的值被加上1然后放回eax,所以ALU的运算结果要用反馈送回到通用寄存器,而ALU的输入也应该有通用寄存器的输出。
下面再介绍ADDRMUX:
这个部件是用来选择地址的,右边的输出是CPU的地址总线,而CPU的地址总线就已经送出CPU了(也就是你能够在芯片的外表上看到引脚了),CPU的地址总线是送到存储器的地址端的,而现代的计算机系统实际上是相当复杂的,所以其实你家的计算机上CPU是通过北桥芯片访问内存的(当然也有将内存控制器做到CPU里面的)左边是地址的来源,地址的来源即有通用寄存器,也有程序计数器,还有一个是直接从IR里面送出,这是因为有的立即数里面也包含内存地址信息。
最后介绍通用寄存器:
通用寄存器的作用就是用来保存中间值或者用于运算,例如
相当于eax+2然后送回eax。
最后介绍一下状态机,这个部分就是CPU的&灵魂&,如果说有了上面那些部件CPU有了一副&躯体&的话,这一部分就是CPU的&灵魂&了:
状态机基本上与系统所有的组件都连接到一起了,因为上面所说的所有动作的执行,都需要状态机的控制,状态机其实就是由一部分触发器构成的记忆电路和另外一部分组合逻辑构成的次态译码电路构成,还有根据当前状态和输入进行译码的部分用于控制各个部件,下面是教科书上的典型FSM结构:
而我们用的状态机状态转移图如下:
因为这个处理器设计的很简单,所以没有出现很多状态,当处理器经历完以上的状态之后,处理器就执行完了一条指令。
有的CISC的处理器用微指令进行控制,作用和状态机相近,这种结构出现在一些比较古老的处理器上,因为那个时候的设计工具和方法没有现在的先进,所以往往改动硬件是困难的和高成本的,所以用微指令的话,做好了硬件的结构,要是需要改动只要修改微指令就好了,而现在的电子技术很发达,设计工具也很完备,所以就有很多直接通过硬连线实现的处理器。
好马配好鞍,有了处理器,我们就得给它配上一个好的程序,下面我们就用自己设计的处理器进行求和,从1加到100,因为我们没有设计编译器,也没有设计汇编器,所以程序只能用机器码写出,示例程序如下:
我们不妨先写出程序的汇编代码:
mov [ADDR],r0;r0 = 0
mov r1,100
lop:add r2,r1
jmp r4(lop)
ext:mov [ADDR],r2
先将内存中存放数据的地址清零,这样才能存放等下送来的结果,然后将r1寄存器存入循环次数(也就是求和的上限)。然后再将r1的值加到r2中来,r2其实就是放求和的寄存器,最后我们会将r2中的值送到内存中的某个地址存放的。
然后将r1减去1,看看是否为0?如果为0则说明求和结束了,如果不是0则说明还要继续,结束后程序就跳到ext部分将结果存放到内存中某个地址(例子中给的是49152也就是二进制的0000b),最后jmp
$是为了让程序停在这一行,防止程序跑飞(跑飞的程序危害很大!有可能吧数据当代码或者把代码当数据!)
转换成VerilogHDL语言如下:
module memory
input [15:0] addr,
inout [15:0] data,
reg [15:0] data_ram[0:16'b11_1111];
initial begin
for (i = 0; i &= 16'b11_1111; i = i + 1)
data_ram = $random();
data_ram[0] = 16'b0000; //mov [ADDR],r0;r0 = 0
data_ram[1] = 16'b0000; //ADDR
data_ram[2] = 16'b1000; //mov r1,100
data_ram[3] = 100; //100
//data_ram[2] = 16'b0000;
data_ram[4] = 16'b0001; //lop:add r2,r1
data_ram[5] = 16'b1000; //sub r1,1
data_ram[6] = 16'b0001; //1
data_ram[7] = 16'b1000; //cmp r1,0
data_ram[8] = 16'b0000; //0
data_ram[9] = 16'b0000; //jz ext
data_ram[10] = 16'b0011; //+3 offset(ext)
data_ram[11] = 16'b0000;//mov r4,4
data_ram[12] = 16'b0100;
data_ram[13] = 16'b0000;//jmp r4(lop)
data_ram[14] = 16'b0010;//ext:mov [ADDR],r2
data_ram[15] = 16'b0000;//ADDR
data_ram[16] = 16'b0000;//jmp $
data_ram[17] = 16'b1110;//-2 offset($)
/*data_ram[0] = 16'b0000; //mov r0,imm
data_ram[1] = 16'b1111; //imm
data_ram[2] = 16'b1000; //mov r7,r0
data_ram[3] = 16'b1000; //mov r3,0
data_ram[4] = 16'b0000;
data_ram[5] = 16'b0000; //mov r4,code of jmp r5
data_ram[6] = 16'b1000; //jmp r5
data_ram[7] = 16'b1100; //mov [r3],r4
data_ram[8] = 16'b0000; //mov r6,[0]
data_ram[9] = 16'b0000; //[0]
data_ram[10]= 16'b0110; //mov [255],r6
data_ram[11]= 16'b1111;
data_ram[12]= 16'b1000; //jmp r3
always @ (addr or rw or data)
data_ram[addr] =
assign data = rw ? 16'hzzzz : data_ram[addr];
设计中CPU外围还需要一个内存设备(Memory),我用HDL对其建模,初始化的时候每个内存地址上对应的数据都初始化为随机的,然后只有从0开始的一系列地址被初始化为我写的代码,机器码对应的汇编指令在注释中已经给出。
然后是结果,结果应该是r2从0变化到+3+......+100=5050)
而r1则从100变化到0,变化到0后程序将进入死循环,停止在jmp $那一条。这是仿真开始的时候:
大家可以看到初始化后,d0~d7都变成了0,这是r0~r7寄存器的Q端,而state_current和state_next则是状态机的现态和状态机的次态,cpu的各个部件都通过这个状态机受到控制。状态名出现的顺序和上面的FSM
Viewer的连线顺序是一样的。
而且大家可以看到,d2从0变化到了0x64也就是十进制100,说明已经执行了第一次加法了。
再来看看仿真结束:
这时候d1变化到了0而d2变化到了0x13ba(十进制的5050),说明程序已经在我们设计的处理器里面运行并且成功的得出了结果!
最后给出一些我用到的指令(跟x86的很像):
add dst,src 将src和dst相加并且送到dst寄存器中
mov [addr],src 将src的值送到以addr位地址的内存单元
sub dst,src 将dst减去src并且送到dst中去
cmp dst,src 将dst减去src 然后不送到dst中 只改变标志位
jz dst 当zf=1时(即上次的算术操作结果为0)则跳转到dst中去
最后再提一下:
我是用synplify综合的电路,然后用debussy+modelsim仿真的,
相关资料请参考:
CPU逻辑设计,朱子玉,李亚民著
Lab Exercise 9出自DE2的开发光盘
苹果iPhone 6S A9处理器中集成的PowerVR GT7600(六核心)绝对是当今最强的移动GPU,也是现今唯一一个商用的PowerVR
7系列核心,其性能轻松甩开任何竞争对手。不过,现在,它有真正的对手了。高通新发布的骁龙82......关键字:
华为大多数手机都配置由它自主设计的麒麟芯片,目的是减轻对Android的依赖。而麒麟操作系统却存在一定问题。。。......关键字:
中国航天科技集团公司九院772所所长赵元富团队研制出的国产CPU芯片,首次全部使用在新一代北斗导航卫星上。为了这一天,赵元富和他的团队走过了10年。
......关键字:
AMD 的市值虽然只有当时英特尔的一个零头,但是其存在的意义,便是让用户多一种选择,从而使英特尔无法垄断整个行业。
......关键字:
近日消息,华为大多数手机都配置由它自主设计的麒麟芯片。日前有媒体报道称,华为有意开发GPU(图形处理器)和闪存芯片。phoneArena 5月份曾刊文称过去3年华为一直在开发麒麟操作系统,目的是减轻对Android的依赖。麒麟......关键字:
国内PC端的CPU制作进展到如今已让很多对此抱有期待的网友失望不已,而手机的CPU发展速度却让人产生疑惑,为什么国内可以有很多手机的CPU制作厂商,而电脑却只有那两三家公司呢?今天小编就在此为大家简单的讲解一下这......关键字:
Intel、AMD虽然都是x86芯片厂商,但是各有自己的编译器,在对方的平台上运行肯定会有所不同。相比之下,Intel的开发实力、业界号召力都远远超出AMD,软硬件优化自然更加到位。AMD也一直在指责Intel,使用其编译器编......关键字:
在传统CPU以外,现在业界又兴起了可重构计算的风潮。......关键字:
工作原理:当K闭合,R1和C2组成延时电路,使C2的电压逐渐升高,LED慢慢发光。这就使……
电路中继电器J可用JRX13或DZ100系列的9V小型继电器。调零电位器W1用来调节FC52的输出直……

我要回帖

更多关于 电信号怎么查流量 的文章

 

随机推荐