ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:100.90KB ,
资源ID:16083197      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-16083197.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(2complexcpudesign.docx)为本站会员(b****7)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

2complexcpudesign.docx

1、2complexcpudesign根据上一节设计得的简单的CPU我们增加一定的指令,设计一个相对复杂一点的CPU。这个CPU的设计流程与前面相似。1定义一个CPU本章我们介绍组成这个CPU的指令体系结构的存储器模型、寄存器和指令集: 首先我们来看它的存储器M模型,这个CPU能够访问的地址空间为64Kbytes,其中1byte=8bits;这个CPU的输出输出端口用存储器的访问模式(也就是与存储器统一编址,或者叫做存储器影射IO)。 这个CPU有3个通用寄存器a、AC7:0(与simple中相同),b、R7:0通用寄存器,用于提供第二个操作数,也可以用来暂存AC的值。这个CPU还有c、一个“0”

2、标志寄存器Z(只有1bit),用于标志运算结果为0。 其他的程序员不能访问的寄存器有: 16bit的地址寄存器 AR15:0 保存16位地址。 16bit的程序计数器 PC15:0 保存下一条指令的地址。 8bit的数据寄存器 DR7:0 接受指令和存储器来的数据。 8bit的指令寄存器 IR7:0 存储指令操作码 8bit的数据暂存器 TR7:0 最后这个CPU的指令集如下:InstructionCodeOperationNOP00000000No OperationLDAC00000001 TACMTSTAC00000010 TMT ACMOVAC00000011RACMOVR000001

3、00ACRJUMP00000101 TGOTO TJMPZ00000110 TIF(Z=1) GOTO TJPNZ00000111 TIF(Z=1) GOTO TADD00001000ACAC+R,IF(AC+R=0)Z1ELSE Z0SUB00001001ACACR,IF(AC+R=0)Z1ELSE Z0INAC00001010ACAC+1,IF(AC+1=0)Z1ELSE Z0CLAC00001011AC0,Z1AND00001100ACACR,IF(ACR=0)Z1ELSE Z0OR00001101ACAC or R,IF(AC or R=0)Z1ELSE Z0XOR00001110AC

4、AC xor R,IF(AC xor R=0)Z1ELSE Z0NOT00001111AC!AC,IF(!AC=0)Z1ELSE Z02取指和译码指令 这个CPU的取指方式和前面所讲的simple相同,只是指令寄存器是8bit取值周期如下: Fetch1: ARPC 15:0 Fetch2: DRM 7:0 ,PCPC+1 15:0 Fetch3: IRDR 7:0 ,ARPC 15:0 然后我们用分析simple CPU的方法分析各个执行例程,可得状态转化图如下:3指令执行接下来我们来为状态图中的各个执行子例程进行分析:3.1NOP指令NOP指令时最容易实现的一条指令,CPU什么都不作,而只

5、是去下一条指令就可以了。我们创造一个空状态,什么都不做NOP13.2LDAC指令 LDAC指令包括三个部分:操作码、地位地址、高位地址。执行时必须从存储器取出地址然后再从相应的地址取数据到AC中。 在这里,我们注意到:在取指的执行过程中(Fetch2),存储地址T的低8位已经放入PC中,并在Fetch3的时候load到AR中,所以此时CPU要做的事情就是1 PC+1,以便取下一条指令(在这里便是T的高8位地址)2 AR+1,取T的高8位地址LDAC1:DRM,PCPC+1,ARAR+1接下来CPU可以取T的高8位地址了,同时它必须用数据暂存器暂存低8位的地址,并且PC+1:LDAC2:TRDR

6、,DRM,PCPC+1这时CPU得到了T的地址,可以进行从存储器读取数据的操作了,首先把地址复制到AR,然后把要去的数载入到DR,最后复制数据到AC中。 LDAC3:ARDR,TR LDAC4:DRM LDAC5:ACDR3.3 STAC指令 STAC指令的执行与LDAC相反,指令执行过程如下: STAC1:DRM,PCPC+1,ARAR+1 STAC2:TRDR,DRM,PCPC+1 STAC3:ARDR,TR STAC4:DRAC(仅4、5与LDAC相反) STAC5:MDR3.4 MVAC和MOVR指令 这两条指令都是比较直接明了的,CPU只是按要求进行数据传送: MVAC1:RAC M

7、OVR1:ACR3.5 JUMP指令JUMP指令执行时,CPU先按照LDAC的取址方式取出要跳转的地址,然后送PC JUMP1:DRM,ARAR+1 JUMP2:TRDR,DRM JUMP3:PCDR,TR3.6 JMPZ和JPNZ指令 JMPZ和JPNZ指令都有两种不同的可能,需要判断“0”标志寄存器来决定执行哪个子例程。如果发生跳转,CPU将执行类似于JUMP的子例程,如果不发生跳转, CPU不能简单地回到取指例程,因为此时PC中是没有发生跳转的跳转地址的低8位,如果不发生跳转CPU必须使PC+2来跳过跳转地址,然后进入取指子例程。 JMPZ执行状态如下:JMPZY标志执行跳转,JMPZN

8、表示不执行跳转: JMPZY1:DRM,ARAR+1 JMPZY2:TRDR,DRM JMPZY3:PCDR,TR JMPZN1:PCPC+1 JMPZN2:PCPC+1JPNZ的执行状态如下:JPNZY表示执行跳转,JPNZN表示不执行跳转 JPNZY1:DRM,ARAR+1 JPNZY2:TRDR,DRM JPNZY3:PCDR,TR JPNZN1:PCPC+1 JPNZN2:PCPC+13.7其余指令其余指令都是在一个状态完成的,CPU完成两件事情:计算结果送AC,置“0”标志寄存器Z。指令执行状态如下:ADD1:ACAC+R,IF(AC+R=0)Z1 ELSE Z0SUB1:ACAC-

9、R,IF(AC-R=0)Z1 ELSE Z0INAC1:ACAC+1,IF(AC+1=0)Z1 ELSE Z0CLAC1:AC0,Z1AND1:ACACR,IF(ACR=0)Z1 ELSE Z0OR1:ACAC or R,IF(AC or R=0)Z1 ELSE Z0XOR1:ACAC xor R,IF(AC xor R=0)Z1 ELSE Z0NOT1:AC!AC,IF(!AC=0)Z1 ELSE Z0完整的状态图如下:4建立数据路径 类似前面的Simple CPU,这个CPU也使用内部总线来传递数据。首先我们按照寄存器来安排数据传输如下: AR:ARPC;ARAR+1;ARDR,TR PC

10、:PCPC+1;PCDR,TR; DR:DRM;DRAC IR:IRDR R:RAC TR:TRDR AC:ACDR;ACR;ACAC+R;ACAC-R; ACAC+1;AC0;ACACR;ACAC or R; ACAC xor R;AC!AC Z:Z 1;Z 0; 由上面的这些操作我们可以定义以下组件的功能为: AR和PC:必须能够执行并行的载入(load),加一(inc),并且数据来自总线。 DR、IR、R和TR:必须能够并行的载入(load),数据来自总线。 AC和Z:与ALU相关的动作执行。ALU接受AC中的数据作为一个操作数,数据总线作为另外一个操作数,AC的输入来自ALU,Z的值是

11、由ALU根据计算结果的判断来设定的。AC寄存器设计成一个有并行载入的寄存器,他的加一功能将由ALU完成,Z是一个1位的带并行载入的寄存器。我们把这些数据路径的组件用总线连接起来,得到了这个CPU的数据路径如下: 下面我们来修改数据路径:1 AR、IR不提供任何数据给其他组件,所以可以把它们与内部总线的连接去掉。2 引脚D7:0为双向引脚,要用双向Buffer。3 内部为16位的总线,而很多寄存器是8位的。需要制定与总线的连接。4 “0”标志寄存器Z还没有连接,把ALU的输出NOR一下,如果为1则置Z=1,否则Z=0。也就是把Z接到ALU输出的NOR上。注:总线的占用情况 AR、PC是16位寄存

12、器直接连接,剩下的8bit的寄存器连接到16位总线的低8位。 Fetch3状态IRDR,ARPC,低8位总线争用,由于IR仅仅从DR接受数据,所以建立一条DR到IR的直接的数据路径,而去掉总线到IR的连接。 LDAC2状态和其他一些状态有TRDR,DRM争用总线,同样TR仅仅从DR接受数据,所以建立一条DR到TR的直接数据路径,去掉总线到TR的连接。 LDAC3和其他几个状态有DR和TR同时把数据放到总线上形成16位的地址,必须是DR为高8位TR为低8位,解决的办法就是把DR的数据同时连接到总线的高8位和低8位上,然后增加控制信号。最后我们可以得到完整的数据路径图如下:5 ALU的设计要设计A

13、LU,我们首先来看那些指令修改了AC的值: LDAC5:ACDR MOVR1:ACR ADD1:ACAC+R SUB1:ACAC-R INAC1:ACAC+1 CLAC1:AC0 AND1:ACACR OR1:ACAC or R XOR1:ACAC xor R NOT1:AC!AC首先我们来设计算数部分:LDAC5:ACBUS MOVR1:ACBUS ADD1:ACAC+BUS SUB1:ACAC-BUS INAC1:ACAC+1 CLAC1:AC0每条指令都可以用一个带进位的并行加法器实现,如下:LDAC5:AC0+BUS+0 MOVR1:AC0+BUS+0 ADD1:ACAC+BUS+0

14、SUB1:ACAC+!BUS+1 INAC1:ACAC+0+1 CLAC1:AC0+0+0然后我们来实现逻辑功能,需要一个8位的4选1逻辑。整个ALU的逻辑框图如下:6控制单元的设计 本设计中CPU共有37个状态,所以用两个寄存器来生成所需状态,一个用作指令IR译码,另一个用于指名IR译码指令的子例程在执行第几个状态。 指令译码的设计:因为操作码就存储在IR寄存器中,所以控制单元用IR寄存器的输出作为译码器的输入,由于指令格式为0000xxxx所以我么之需要译码低4位就可以了,NOR高4位用于使能译码器。 用于指名译码后执行的子例程处于第几个状态的计数器前3个状态都一定是Fetch1,fetc

15、h2,Fetch3,接下来的状态才是执行子例程的状态。 指令的执行状态要靠译码器和计数器两者组合才能得知。结构如下图:控制单元把两者的输出进行AND操作,来选择正确的指令执行。例如:LDAC的执行子例程如下: LDAC1=ILDACT3 LDAC2=ILDACT4 LDAC3=ILDACT5 LDAC4=ILDACT6 LDAC5=ILDACT7完整的状态如下表:StateFunctionStateFunctionFetch1T0JMPZY1IJMPZT3Fetch2T1JMPZY2IJMPZT4Fetch3T2JMPZY3IJMPZT5NOP1INOPT3JMPZN1IJMPZT3LDAC1

16、ILDACT3JMPZN2IJMPZT4LDAC2ILDACT4JPNZY1IJPNZT3LDAC3ILDACT5JPNZY2IJPNZT4LDAC4ILDACT6JPNZY3IJPNZYT5LDAC5ILDACT7JPNZN1IJPNZNT3STAC1ISTACT3JPNZN2IJPNZNT4STAC2ISTACT4ADD1IADDT3STAC3ISTACT5SUB1ISUBT3STAC4ISTACT6INAC1IINACT3STAC5ISTACT7CLAC1ICLACT3MVAC1IMVACT3AND1IANDT3MOVR1IMOVRT3OR1IORT3JUMP1IJUMP1T3XOR1I

17、XORT3JUMP2IJUMPT4NOT1INOTT3JUMP3IJUMPT5生成这些状态之后,我们必须要生成计数器的CLR和INC信号。我们把每个执行子例程的最后一个状态进行OR得到了CLR信号,再把CLR信号取反得到了INC信号。接下来我们需要产生数据路径中的所有的寄存器以及Buffer的载入信号及其他控制信号。下表给出了数据路径中Buffer以及AR的控制信号:SignalValuePCBUSFetch1 or Fetch3DRHBUSLDAC3 or STAC3 or JUMP3 or JMPZY3 or JPNZY3DRLBUSLDAC5 or STAC5TRBUSLDAC3 or

18、STAC3 or JUMP3 or JMPZY3 or JPNZY3RBUSMOVR1 or ADD1 or SUB1 or AND1 or OR1 or XOR1ACBUSSTAC4 or MVAC1MEMBUSFetch2 or LDAC1 or LDAC2 or LDAC4 or STAC1 or STAC2 or JUMP1 or JUMP2 or JMPZY1 or JMPZY2 or JPNZY1 or JPNZY2BUSMEMSTAC5ARLOADFetch1 or Fetch3 or LDAC3 or STAC3ARINC LDAC1 or STAC1 or JUMP1 or

19、JMPZY1 or JPNZY1其他的寄存器的控制信号自己推导:SignalValuePCLOADJUMP3 or JMPZY3 or JPNZY3PCINCFetch2 or LDAC1or LDAC2 or STAC1 or STAC2 or JMPZN1 or JMPZN2 or JPNZN1 or JPNZN2 DRLOADFetch2 or LDAC1 or LDAC2 or LDAC4 or STAC1 or STAC2 or STAC4 or JUMP1 or JUMP2 or JMPZY1 or JMPZY2 or JPNZY1 or JPNZY2TRLOADLDAC2 or

20、STAC2 or JUMP2 or JMPZY2 or JPNZY2 IRLOADFetch3RLOADMVAC1ACLOADLDAC5 or MOVR1 or ADD1 or SUB1 or INAC1 or CLAC1 or AND1or OR1 or XOR1 or NOT1ZLOADADD1 or SUB1 or INAC1 or CLAC1 or AND1 or OR1 or XOR1 or NOT1READFetch2 or LDAC1 or LDAC2 or LDAC4 or STAC1 or STAC2 or JUMP1 or JUMP2 or JMPZY1 or JMPZY2

21、 or JPNZY1 or JPNZY2WRITESTAC5最后我们生成ALU的控制信号:ALUS1=ADD1 or SUB1 or INAC1 ALUS2=SUB1 ALUS3=LDAC5 or MOVR1 or ADD1 ALUS4=SUB1 or INAC1ALUS5=XOR1 or NOT1ALUS6=OR1 or NOT1ALUS7=AND1 or OR1 or XOR1 or NOT17设计验证我们设计如下的测试指令: 0:LDAC 1:00000000 2:00000011 3:27H 4:ADD 5:INAC 6:JMP 7:00000000 8:00001001 9:JMPZ 10:00000000 11:00001100 12:CLAC 13:JPNZ 14:00000000 15:00101111 16:AND 17:NOT 18:NOP8需要改进的地方 更多的内部寄存器和Cache 多条内部总线 流水线 更大的指令集 子程序和中断

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2