模型机课程设计_第1页
模型机课程设计_第2页
模型机课程设计_第3页
模型机课程设计_第4页
模型机课程设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、哈尔滨理工大学软件学院课程设计报告课 程 片上计算机系统题 目 CPU模型机设计 班 级 集成12-1班专 业 集成电路设计与集成系统 学 生 张 铭学 号 1214020130指导教师 崔林海 2014年 07 月 02日索 引:1课程设计的目的及要求32处理器的设计思想和设计内容33设计处理器的结构和实现方法34模型机的指令系统45处理器的状态跳转操作过程46. CPU的VHDL代码77. 模型机在Quartus II环境下的应用328. 仿真波形339. 课程设计的总结35一 课程设计的目的及要求:1. 目的:了解Quartus II软件的应用,学习Quartus II环境下设计CPU的

2、基本过程;掌握CPU设计代码的含义以及CPU的工作原理;了解CPU与内存RAM间的连接数据的传输过程;学习在Quartus II环境下建立模型机的具体过程。融会贯通本课程各章节的内容,通过知识的综合运用,加深对计算机系统各模块的工作原理及相互联系的认识。学习设计和调试计算机的基本步骤和方法,提高使用软件仿真工具和集成电路的基本技能。培养科学研究的独立工作能力,取得工程设计与组装调试的实践和经验。2. 要求:以计算机组成与设计书中123页的简化模型为基础,更改其指令系统,形成设计者的CPU,在Quartus II环境下与主存连接,调试程序,观察指令的执行是否达到设计构想。二 处理器的设计思想和设

3、计内容:处理器的字长为16b;包括四种指令格式,格式1、格式2、格式3的指令字长度为8b,格式4的指令字长度为16b;处理器内部的状态机包括6个状态。关于CPU:操作码5位,一共设计20条指令,主要包括空操作指令、中断指令、加法指令、减法指令、三种逻辑运算指令、循环移位操作指令,数据传输指令,转移类指令,特权指令,取反,取绝对值等等。关于RAM:地址线设置成16bits,主存空间为64words。书中原CPU的主要修改:(1) 模型机CPU指令集中的逻辑左移与逻辑右移改成逻辑循环右移与逻辑循环左移。(2) 模型机CPU指令集中的or改成not。(3) 模型机CPU指令的执行流程及状态跳转。三

4、设计处理器的结构和实现方法:(指令格式)格式1:寄存器寻址方式15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OP Rx Ry 空白格式2:立即数寻址方式15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OP I 空白格式3:无操作数寻址方式15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OP 空白 空白格式4:直接寻址方式15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OP Addr内存(2的12次方)四 模型机的指令系统CPU的指令集:操作码OPIR(15.12)指令格式指 令 的

5、 助 记 符指 令 的 内 容000003Idle无操作 PC=PC+1000012Load DataR0ßI 立即数操作000101Move Rx RyRx ß(Ry) PC=PC+1000111Add Rx RyRx ß(Rx)+(Ry) PC=PC+101001Sub Rx RyRx ß(Rx)-(Ry) PC=PC+1001011AND Rx RyRx ß(Rx) AND(Ry) PC=PC+1001101NOT Rx RyRx ß(Rx) NOT (Ry) PC=PC+1001111XOR Rx RyRx ß(Rx

6、) XOR (Ry) PC=PC+1010001Swap Rx Ry Aß(Ry) Ryß(Rx) Rxß(A) PC=PC+1010011Shr Rx Ry倒置数据PC=PC+1010101Shl Rx Ry逻辑循环左移PC=PC+1010114Jmp AddrPCßAddr PC=PC+1011004Jz AddrIf (R0)=0 then PCßAddr else PC=PC+1011014Read AddrR0ß(Addr) PC=PC+1011104Write Addr Addrß(R0) PC=PC+1 011

7、113Stop无操作 PC保持不变100001comp 比较 pc=pc+1100011notp 取反 pc=pc+1100101clearpc=pc+1100111absppc=pc+1五 处理器的状态跳转操作过程:(1) 、模型机每一状态下的操作及状态跳转当前状态执行操作次态与读下一条指令的有关的操作St_0取指令IR(15.0)ßM_data_in(15.0)St_1Write-Readß0 PC=PC+1St_1IF OP=Load THENR0ßIR(11.8)|”000000000000”MARßPCIF(OP=Stop)THENSt_1EL

8、SE St_2END IFIF OP=Move THEN Rx ß(Ry)IF OP= Shr THEN Rx ß(Rx) 倒置数据IF OP= Shl THEN Rx ß(Rx) 逻辑循环左移IF OP= Add THEN Aß(Ry)IF OP= Sub THEN Aß(Ry)IF OP= AND THEN Aß(Ry)IF OP=NOT THEN Aß(Ry)IF OP= XOR THEN Aß(Ry)IF OP= Swap THEN Aß(Ry)IF OP=Stop THEN NULLIF OP=

9、Idle THEN NULLIF OP=Jmp THEN NULLIF OP=Jz THEN NULLIF OP=Read THEN NULLIF OP=Write THEN NULLSt_2IF OP= Load OR OP=Move OR OP=Shr OR OP=Shl OR OP=Idle THEN NULLSt_0Write-Readß0IF OP= Add THEN Rx ß(Rx)+AIF OP= Sub THEN Rx ß(Rx)-AIF OP= AND THEN Rx ß(Rx)ANDAIF OP= NOT THEN Rx ß

10、(Rx) NOT AIF OP= XOR THEN Rx ß(Rx) XORAIF OP= Swap THEN Ryß(Rx)St_3Write-Readß0IF OP= Jmp THEN(PCßIR(1.0) MARßIR(11.0)IF OP= Jz THENIF (R0)=0 THEN(PCßIR(1.0) MARßIR(11.0)ELSE MARßPCIF OP= Read THEN MARßIR(11.0)IF OP= Write THEN MARßIR(11.0) MDAß

11、R0St_3IF OP= Swap THEN Rxß(A)St_0Write-Readß0IF OP= Jmp NOT OP= Jz St_0MARßPCWrite-Readß0IF OP= Write St_4MARßPCWrite-Readß0IF OP= Read St_4MARßPCWrite-Readß0St_4IF OP= Read THENR0ßM_data_inSt_0Write-Readß0St-5IF OP=ABSP THENR0<-M_data_inSt_0IF OP

12、=NOTP THENR0<-M_data_inSt_0IF OP=CLEAR THENR0,R1,R2,R3,IR<-'0'St_0IF OP=COMP THENR0<-M_data_inR1<-M_data_inSt_0(2) 、简单指令执行状态描述读内存指令:(1) St_0:取指令执行以下操作;1)M_addressß(MAR) 把指令地址送到地址总线2)令Write-Readß0 向内存发出读命令(取指令)3)IR(15.0)ßM_data_in(15.0) 将读出的指令加载于IR(15.0)4)PC=PC+1 至此

13、指令已经全部取出,存在于IR(15.0),为取下一条指令准备地址(2) St_1:NULL 直接跳转到下一状态(3) St_2:MARßIR(11.0)将数据地址加载于MAR(4) St_3:1)M_addressß(MAR)把数据地址送到地址总线2)令Write-Readß0 向内存发出读命令(取数据)3)MARßPC 把下一条指令地址加载于MAR(5) St_4:1)R0ßM_data_in 将来自内存的数据加载于R0,本指令执行完毕2)M_addressß(MAR) 把下一条指令地址送到地址总线3)令Write-Read

14、3;0 向内存发出读命令(取下一条指令)4)下一状态跳转到St_0无条件转移指令(1) St_0:取指令执行以下操作;1)M_addressß(MAR) 把指令地址送到地址总线2)令Write-Readß0 向内存发出读命令(取指令)3)IR(15.0)ßM_data_in(15.0) 将读出的指令加载于IR(15.0)4)PC=PC+1 (此语句无用,因为程序计数器后续重新复制达到无条件转移目的)(2) St_1:NULL 直接跳转到下一状态(3) St_2:1)MARßIR(11.0) 将转移目标地址加载于MAR2)PCßIR(11.0)

15、将转移目标地址加载于PC(4) St_3:1) M_addressß(MAR) 把下一条指令地址送到地址总线2)令Write-Readß0 向内存发出读命令(取下一条指令)3)下一状态跳转到St_0六 CPU的VHDL代码:LIBRARY ieee;USE ieee.std_logic_1164.ALL;PACKAGE namespack IS CONSTANT idle : std_logic_vector(4 DOWNTO 0) :="00000"CONSTANT load : std_logic_vector(4 DOWNTO 0) :="

16、;00001"CONSTANT move : std_logic_vector(4 DOWNTO 0) :="00010"CONSTANT addP : std_logic_vector(4 DOWNTO 0) :="00011"CONSTANT subp : std_logic_vector(4 DOWNTO 0) :="00100"CONSTANT andp : std_logic_vector(4 DOWNTO 0) :="00101"CONSTANT orp : std_logic_vector(

17、4 DOWNTO 0) :="00110"CONSTANT xorp : std_logic_vector(4 DOWNTO 0) :="00111"CONSTANT shrp : std_logic_vector(4 DOWNTO 0) :="01000"CONSTANT shlp : std_logic_vector(4 DOWNTO 0) :="01001"CONSTANT swap : std_logic_vector(4 DOWNTO 0) :="01010"CONSTANT jmp

18、: std_logic_vector(4 DOWNTO 0) :="01011"CONSTANT jz : std_logic_vector(4 DOWNTO 0) :="01100"CONSTANT read : std_logic_vector(4 DOWNTO 0) :="01101"CONSTANT write : std_logic_vector(4 DOWNTO 0) :="01110"CONSTANT stop : std_logic_vector(4 DOWNTO 0) :="01111&

19、quot; CONSTANT comp : std_logic_vector(4 DOWNTO 0) :="10000" CONSTANT notp : std_logic_vector(4 DOWNTO 0) :="10001" CONSTANT clear : std_logic_vector(4 DOWNTO 0) :="10010" CONSTANT absp : std_logic_vector(4 DOWNTO 0) :="10011" CONSTANT modp : std_logic_vector(

20、4 DOWNTO 0) :="10100"END namespack;LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;USE WORK.namespack.ALL;ENTITY cpu ISPORT( reset : IN std_logic; -清零信号低有效 clock : IN std_logic; -时钟信号 Write_Read: OUT std_logic; -读写信号,'1'为写 M_address: OUT std_logic_vector(10

21、 DOWNTO 0); -地址线 M_data_in: IN std_logic_vector(7 DOWNTO 0); -数据输入线 M_data_out: OUT std_logic_vector(7 DOWNTO 0); -数据输出线 overflow: OUT std_logic -溢出标志 );END cpu;ARCHITECTURE RTL OF cpu IS SIGNAL IR: std_logic_vector(15 DOWNTO 0); -指令寄存器 SIGNAL MDR: std_logic_vector(7 DOWNTO 0); -数据寄存器 SIGNAL MAR: st

22、d_logic_vector(10 DOWNTO 0); -地址寄存器 SIGNAL status: integer RANGE 0 TO 6; -状态寄存器 BEGIN status_change: PROCESS(reset, clock, status ) BEGINIF reset = '0' THEN status <= 0 ;- 进入初始状态 ELSIF clock'EVENT AND clock = '0' THEN CASE status IS WHEN 0 => status <= 1; WHEN 1 => IF

23、 IR(15 DOWNTO 11)= Stop THEN status <= 1; ELSE status <= 2; END IF; WHEN 2 => CASE IR(15 DOWNTO 11) ISWHEN Swap|Jmp|Jz|Read|Write =>status <= 3;WHEN OTHERS => status <= 0;END CASE; WHEN 3 => IF IR(15 DOWNTO 11)= Swap THEN status <= 0; ELSE status <= 4; END IF; WHEN 4 =&

24、gt; status <= 5; WHEN 5 => CASE IR(15 DOWNTO 11) ISWHEN Read|Write =>status <= 6;WHEN OTHERS => status <= 0;END CASE; WHEN 6=> CASE IR(15 DOWNTO 11) IS WHEN Comp=> status<=0; WHEN NotP=> status<=0; WHEN Clear=> status<=0; WHEN AbsP=> status<=0; WHEN ModP=

25、> status<=0; WHEN OTHERS=> status <= 0; END CASE; END CASE;END IF; END PROCESS status_change; seq: PROCESS(reset,clock) VARIABLE PC:std_logic_vector(10 DOWNTO 0); -程序计数器 VARIABLE R0,R1,R2,R3: std_logic_vector(7 DOWNTO 0); -通用寄存器 VARIABLE A: std_logic_vector(7 DOWNTO 0); -临时寄存器 VARIABLE R

26、C: std_logic_vector(7 DOWNTO 0); -比较结果寄存器 VARIABLE RM: std_logic_vector(7 DOWNTO 0); -取模结果寄存器 VARIABLE temp: std_logic_vector(8 DOWNTO 0); -临时变量 BEGIN IF(reset='0') THEN- 进入初始状态 IR <= (OTHERS=>'0'); PC := (OTHERS=>'0'); R0 := (OTHERS=>'0'); R1 := (OTHERS=&

27、gt;'0'); R2 := (OTHERS=>'0'); R3 := (OTHERS=>'0'); A := (OTHERS=>'0'); MAR <= (OTHERS=>'0'); MDR <= (OTHERS=>'0'); ELSIF(clock'event AND clock='1') THEN overflow <= '0' CASE status IS WHEN 0=> -状态0 IR <

28、= M_data_in & "00000000" -取指令 PC := PC+1; -程序计数器加1 WHEN 1=> -状态1 IF (IR(15 DOWNTO 11) /= Stop) THEN MAR <= PC; END IF; CASE IR(15 DOWNTO 11) IS WHEN Load => R0:="0000" & IR(10 DOWNTO 7); WHEN Move => -Move Rx,Ry; CASE IR(10 DOWNTO 7) IS WHEN "0001"=&

29、gt; R0:=R1; WHEN "0010"=> R0:=R2; WHEN "0011"=> R0:=R3; WHEN "0100"=> R1:=R0; WHEN "0110"=> R1:=R2; WHEN "0111"=> R1:=R3; WHEN "1000"=> R2:=R0; WHEN "1001"=> R2:=R1; WHEN "1011"=> R2:=R3; WHEN &qu

30、ot;1100"=> R3:=R0; WHEN "1101"=> R3:=R1; WHEN "1110"=> R3:=R2; WHEN OTHERS=> NULL; END CASE; WHEN Shrp => -逻辑右移1位; CASE IR(10 DOWNTO 9) IS WHEN "00"=> R0:='0'&R0(7 DOWNTO 1); WHEN "01"=> R1:='0'&R1(7 DOWNTO 1);

31、 WHEN "10"=> R2:='0'&R2(7 DOWNTO 1); WHEN OTHERS=> R3:='0'&R3(7 DOWNTO 1); END CASE; WHEN Shlp => -逻辑左移1位; CASE IR(10 DOWNTO 9) IS WHEN "00"=> R0:=R0(6 DOWNTO 0)&'0' WHEN "01"=> R1:=R1(6 DOWNTO 0)&'0' WHEN &

32、quot;10"=> R2:=R2(6 DOWNTO 0)&'0' WHEN OTHERS=> R3:=R3(6 DOWNTO 0)&'0' END CASE; WHEN Addp|Subp|Andp|Orp|Xorp|Swap => CASE IR(8 DOWNTO 7) IS WHEN "00"=> A:=R0; WHEN "01"=> A:=R1; WHEN "10"=> A:=R2; WHEN OTHERS=> A:=R3; E

33、ND CASE; WHEN OTHERS => NULL; END CASE; WHEN 2=> -状态2 CASE IR(15 DOWNTO 11) IS WHEN Addp => -Rx:= Rx+A; CASE IR(10 DOWNTO 9) IS WHEN "00"=> temp := (R0(7) & R0(7 DOWNTO 0) + (A(7) & A(7 DOWNTO 0); R0:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); WHEN "01&q

34、uot;=> temp :=(R1(7) & R1(7 DOWNTO 0) + (A(7) & A(7 DOWNTO 0); R1:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); WHEN "10"=> temp :=(R2(7) & R2(7 DOWNTO 0) + (A(7) & A(7 DOWNTO 0); R2:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); WHEN OTHERS=> temp

35、 :=(R3(7) & R3(7 DOWNTO 0) + (A(7) & A(7 DOWNTO 0); R3:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); END CASE; WHEN Subp => -Rx:= Rx-A; CASE IR(10 DOWNTO 9) IS WHEN "00"=> temp :=(R0(7) & R0(7 DOWNTO 0) + NOT(A(7) & A(7 DOWNTO 0) + 1; R0:=temp(7 DOWNTO 0); ov

36、erflow <= temp(8) XOR temp(7); WHEN "01"=> temp :=(R1(7) & R1(7 DOWNTO 0) + NOT(A(7) & A(7 DOWNTO 0) + 1; R1:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); WHEN "10"=> temp :=(R2(7) & R2(7 DOWNTO 0) + NOT(A(7) & A(7 DOWNTO 0) + 1; R2:=temp(7 DOWNT

37、O 0); overflow <= temp(8) XOR temp(7); WHEN OTHERS=> temp :=(R3(7) & R3(7 DOWNTO 0) + NOT(A(7) & A(7 DOWNTO 0) + 1; R3:=temp(7 DOWNTO 0); overflow <= temp(8) XOR temp(7); END CASE; WHEN Andp => - Rx:= Rx AND A; CASE IR(10 DOWNTO 9) IS WHEN "00"=> R0:=R0 and A; WHEN &

38、quot;01"=> R1:=R1 and A; WHEN "10"=> R2:=R2 and A; WHEN OTHERS=> R3:=R3 and A; END CASE; WHEN Orp => - Rx := Rx OR A; CASE IR(10 DOWNTO 9) IS WHEN "00"=> R0:=R0 or A; WHEN "01"=> R1:=R1 or A; WHEN "10"=> R2:=R2 or A; WHEN OTHERS=>

39、R3:=R3 or A; END CASE; WHEN Xorp => -Rx=Rx XOR A; CASE IR(10 DOWNTO 9) IS WHEN "00"=> R0:=R0 XOR A; WHEN "01"=> R1:=R1 XOR A; WHEN "10"=> R2:=R2 XOR A; WHEN OTHERS=> R3:=R3 XOR A; END CASE; WHEN Swap => -Swap: Rx to Ry; CASE IR(10 DOWNTO 7) IS WHEN &qu

40、ot;0100"=> R0:=R1; WHEN "1000"=> R0:=R2; WHEN "1100"=> R0:=R3; WHEN "0001"=> R1:=R0; WHEN "1001"=> R1:=R2; WHEN "1101"=> R1:=R3; WHEN "0010"=> R2:=R0; WHEN "0110"=> R2:=R1; WHEN "1110"=> R

41、2:=R3; WHEN "0111"=> R3:=R1; WHEN "1011"=> R3:=R2; WHEN "0011"=> R3:=R0; WHEN OTHERS=> NULL; END CASE; WHEN OTHERS => NULL; END CASE; WHEN 3=> -状态3 CASE IR(15 DOWNTO 11) IS WHEN "01010"=> -Swap CASE IR(10 DOWNTO 9) IS WHEN "00"=> R0:=A; WHEN "01"=> R1:=A; WHEN "10"=> R2:=A; WHEN OTHERS=> R3:=A; END CASE; WHEN Jmp|Jz|Read|Write =&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论