哈尔滨理工大学
软件学院
课程设计报告
课 程 片上计算机系统 题 目 CPU模型机设计 班 级 集成14-2班
专 业 集成电路设计与集成系统 学 生 宋鸿飞 学 号
指导教师 崔林海
2016年 07 月 8日
索 引:
1.课程设计的目的及要求………………………………………3 2.处理器的设计思想和设计内容………………………………3 3.设计处理器的结构和实现方法………………………………3 4.模型机的指令系统……………………………………………4 5.处理器的状态跳转操作过程…………………………………4 6. CPU的Verilog代码……………………………………………7 7. 模型机在Quartus II环境下的应用…………………………16 8. 仿真波形………………………………………………………16 9. 课程设计的总结………………………………………………18
一. 课程设计的目:
目的:了解Quartus II软件的应用,学习Quartus II环境下设计CPU的基本过程;掌握CPU设计代码的含义以及CPU的工作原理;了解CPU与内存RAM间的连接数据的传输过程;学习在Quartus II环境下建立模型机的具体过程。融会贯通本课程各章节的内容,通过知识的综合运用,加深对计算机系统各模块的工作原理及相互联系的认识。学习设计和调试计算机的基本步骤和方法,提高使用软件仿真工具和集成电路的基本技能。培养科学研究的独立工作能力,取得工程设计与组装调试的实践和经验。
二. 处理器的设计思想和设计内容:
我设计的是16位cpu,5位的操作码,18条指令,其中包含了4种寻址方式。内存容量为2k。
这个CPU是参考学姐的程序,在学姐的程序的基础上增加了一些指令得到的。
三. 设计处理器的结构和实现方法:
(指令格式)
格式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的11次方) 四. 模型机的指令系统
CPU的指令集: 操作码指令 OP 格式 IR(15..12) 00000 00001 00010 00011 00100 00101 00110 00111 3 2 1 1 1 1 1 1 指 令 的 助 记 符 Idle Load Data Move Rx Ry Add Rx Ry Sub Rx Ry AND Rx Ry OR Rx Ry XOR Rx Ry 无操作 PC=PC+1 R0?I 立即数操作 Rx ?(Ry) PC=PC+1 Rx ?(Rx)+(Ry) PC=PC+1 Rx ?(Rx)-(Ry) PC=PC+1 Rx ?(Rx) AND(Ry) PC=PC+1 Rx ?(Rx) OR (Ry) PC=PC+1 Rx ?(Rx) XOR (Ry)
PC=PC+1 指 令 的 内 容 01000 01001 01010 01011 01100 01101 01110 01111 10000 10001 1 1 1 1 1 4 4 4 4 3 NAND Rx Ry NOT Rx SHR Rx Ry SHL Rx Ry SWAP Rx Ry JMP Addr JZ Addr READ WRITE STOP Rx ?(Rx)NAND(Ry) PC=PC+1 Rx ?NOT (Rx) PC=PC+1 逻辑循环右移PC=PC+1 逻辑循环左移PC=PC+1 A?(Ry) Ry?(Rx) Rx?(A) PC=PC+1 PC?Addr PC=PC+1 If (R0)=0 then PC?Addr else PC=PC+1 R0?(Addr) PC=PC+1 Addr?(R0) PC=PC+1 无操作 PC保持不变 五. 处理器的状态跳转操作过程:
(一)、模型机每一状态下的操作及状态跳转 当前状执行操作 态 St_0 取指令 IR(15..0)?M_data_in(15..0) St_1 IF OP=Load THEN R0?”000000000000”||IR(10..7) IF OP=Move THEN Rx ?(Ry) IF OP= Shr THEN Rx ?(Ry) 逻辑循环右移 IF OP= Shl THEN Rx ?(Ry) 逻辑循环左移 IF OP= Add THEN A?(Ry) IF OP= Sub THEN A?(Ry) IF OP=NAND THEN A?(Ry) IF OP=OR 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 NULL IF OP=Idle THEN NULL IF OP=Jmp THEN NULL IF OP=Jz THEN NULL IF OP=Read THEN NULL 次态与读下一条指令的有关的操作 St_1 Write-Read?’0’ PC=PC+1 MAR?PC IF(OP=Stop)THEN St_1 ELSE St_2 END IF St_2 St_3 IF OP=Write THEN NULL IF OP= Load OR OP=Move OR OP=Shr OR OP=Shl OR OP=Idle THEN NULL IF OP= Add THEN Rx ?(Rx)+A IF OP= Sub THEN Rx ?(Rx)-A IF OP= AND THEN Rx ?(Rx)ANDA IF OP= NOT THEN Rx ?(Rx) NOT A IF OP= NAND THEN Rx ?(Rx)NANDA IF OP= OR THEN Rx ?(Rx)ORA IF OP= XOR THEN Rx ?(Rx) XORA IF OP= Swap THEN Ry?(Rx) IF (OP= Jmp OR OP=Jz) THEN NULL IF( OP=ReadOROP=Write ) THEN NULL IF OP= Swap THEN Ry?(Rx) St_0 Write-Read?’0’ St_3 Write-Read?’0’ St_4 St_0 Write-Read?’0’ IF OPE= Read OR OPE= Write OR St_4 OPE=Jump OR OPE=Jz) THEN PC:=PC+1; IR?Data_in Write-Read?’0’ IF OP= Jz THEN St_5 IF (R0)=0 THEN Write-Read?’0’ (PC?IR(10..0) MAR?IR(10..0)) ELSE MAR?PC IF OP= Jmp THEN (PC?IR(10..0) MAR?IR(10..0)) IF OP= Read THEN MAR?IR(10..0) IF OP= Write THEN MAR?IR(10..0) MDA?R0 IF(OPE=Jump)OR(OPE=Jz) St_0;MAR?PC; Write-Read?’0’ IF(OPE=Read) St_6;MAR?PC; Write-Read?’0’ St_6;MAR?PC; Write-Read?’0’ St_5 St_6 IF OP=Read THEN R0=M_data_in; St_0 Write-Read?’1’ 6. CPU的代码
module cpu(reset, clock, Write_Read, M_address, M_data_in, M_data_out, overflow); input reset; input clock;
output Write_Read; output [10:0] M_address; input [15:0] M_data_in; output [15:0] M_data_out; output overflow; reg overflow; reg [15:0] IR; reg [15:0] MDR; reg [10:0] MAR; reg [2:0] status;
parameter [4:0] Idle=5'd0, load=5'd1,
move=5'd2, addp=5'd3, subp=5'd4, andp=5'd5, orp=5'd6, xorp=5'd7, nandp=5'd8, notp=5'd9, shrp=5'd10, shlp=5'd11, swap=5'd12, jmp=5'd13, jz=5'd14, read=5'd15, write=5'd16, stop=5'd17; always @(negedge reset or negedge clock ) begin: status_change if (reset == 1'b0) status <= 0; else
case (status) 0 :
status <= 1; 1 :
相关推荐: