课程设计报告题目:简易CPU设计专业班级:微电子14-2班姓名(学号):Wangzhe指导教师:其他组员:完成日期:2017年10月24日Ⅰ第一章CPU概述1.1简介计算机最核心的部分叫做中央处理器,也就是我们常说的CPU,计算机所做的工作都是由CPU来完成的。当然,作为学习,我们不能够设计出类似奔腾处理器的CPU,我们用一个能够完成简单功能的简单的CPU作为讲解,麻雀虽小,五脏俱全,这个简单的CPU具有一般CPU的全部基本特征。CPU一般包括寄存器组、运算器和控制器。顾名思义,寄存器组负责存储,运算器负责进行运算,控制器则控制各个通路,使得处理流程得以进行。1.2CPU内部框架如图1-1是本设计的一个CPU内部结构框架。存储器ALU控制器指令解码器PC图1-1CPU内部结构框架我们先确定一些CPU能够执行的指令,在这里我们设定6个计算机指令,分别为:LDA指令、、ADD指令、SUB指令、MUL指令OUT指令和HLT指令。指令集Ⅰ表示的含义见下表:操作码助记符执行的功能000LDAaddr将地址为addr处的存储器中的内容装载到A寄存器001ADDaddr将A寄存器的内容加上存储器中的addr地址处的内容010SUBaddr将A寄存器的内容减去存储器中的addr地址处的内容011MULaddr将A寄存器的内容乘以存储器中的addr地址处的内容100OUT输出101HLT停止指令的执行下面是一个虚拟的rom模块modulerom16_8(dataout,addr,ce);output[7:0]dataout;input[3:0]addr;inputce;reg[7:0]dataout;always@(addrorce)beginif(!ce)case(addr)4'b0000:dataout=8'b00001001;//LDA9H4'b0001:dataout=8'b00011010;//ADDAH4'b0010:dataout=8'b00101011;//SUBBH4'b0011:dataout=8'b00111100;//MULCH4'b0100:dataout=8'b11100000;//OUT4'b0101:dataout=8'b11110000;//HLT4'b1001:dataout=8'b00010000;4'b1010:dataout=8'b00011000;4'b1011:dataout=8'b00010100;4'b1100:dataout=8'b00000010;default:dataout=8'b00000000;endcaseelsedataout=8'b00000000;endⅠEndmodule1.3设计目标设计一个简易CPU模型,能在Basys2开发板上实际验证。该模型具备5条指令:1)将内存中某一单元的内容送到累加器的指令。2)将累加器的内容和内存中某一单元相加,结果送回累加器的指令。3)将累加器的内容和内存中某一单元相减,结果送回累加器的指令。4)将累加器的内容输出至输出寄存器的指令。5)结束CPU运行的指令。第二章CPU程序的设计设计思想:分析CPU工作原理,可得如下运行流程:程序计数器PC到数据总线,通过总线到地址寄存器MAR→MAR将PC传过来的数据信息送到只读内存ROM(在具体实验中用RAM、MDR表示)→ROM通过总线将地址送入指令寄存器IR→IR将操作码送入控制器,同时再将指令地址信息送入总线,通过数据总线将指令地址信息再次送入MAR→MAR再将信息送入ROM,ROM通过总线将地址信息送入寄存器A和B→A、B再送入逻辑运算元件,通过ALU运算后将结果通过总线送入寄存器A→A再将结果通过总线送入输出接口①首先介绍一下程序里的各个变量reg[3:0]pc;reg[3:0]mar;reg[7:0]acc;reg[7:0]ir;reg[3:0]tmp;reg[7:0]breg;reg[7:0]outreg;regrun;wirecs;wire[7:0]romdata;Ⅰwire[3:0]addrbus;wire[7:0]databus;PC:(程序计数器)负责生成存储器的地址值(在下一步骤中会将对应地址的存储器中的指令取出),然后将自身+1,使其指向下一条将要执行的指令,为取下一条指令的执行做好准备。MAR:地址寄存器ACC同时充当累加器与乘法器IR、TMP:指令寄存器BREG:储存从rom中取出的值CS、RUN、F1:标志位Addrbus:地址总线Romdata、databus:数据总线②此程序中,我们分了S0、S1、S2、S3、S4、S5六个状态(组成一个机器周期),对各部分模块进行具体设计。always@(negedgecporposedgerst)beginif(rst)beginpc=4'b0000;acc=8'b00000000;run=1'b1;pstate=s0;nstate=s0;flag=1;endelsebeginif(run)begincase(pstate)s0:beginnstate=sl;f1=1;mar=pc;end//程序计数器PC到数据总线,通过总线到地址寄存器MARsl:beginnstate=s2;Ⅰif(flag)beginpc=pc+1'b1;flag=1'b0;//flag标志位防止取指令的程序执行多次endends2:beginnstate=s3;flag=1;ir=databus;end//ROM通过总线将地址送入指令寄存器IR,此时IR中为取出的指令,高4位为操作指令,低4位为数据地址。s3:beginnstate=s4;tmp=ir[7:4];endif(pstate==s3)beginif((tmp==4'b0000)||(tmp==4'b0001)||(tmp==4'b0010)||(tmp==4'b0011))mar=ir[3:0];elseif(tmp==4'b1110)outreg=acc;elseif(tmp==4'b1111)run=1'b0;end//对于IR中取出的指令进行筛选,如果tmp=0000||0001||0010||0011,进入s4状态,IR将指令地址信息再次送入MAR。如果tmp=1110,将累加器的内容输出,如果tmp=1110,结束CPU运行.s4:nstate=s5;if(tmp==4'b0000)acc=databus;elseif(tmp==4'b0001)breg=databus;elseif(tmp==4'b0010)breg=databus;elseif(tmp==4'b0011)breg=databus;endⅠ//ROM通过总线将地址信息送入寄存器ACC与BREGs5:nstate=s0;endcasepstate=nstate;endelseif(pstate==s5)beginif((tmp==4'b0001)&&(f1==1'b1))beginnum=acc+breg;acc=num;f1=1'b0;endelseif((tmp==4'b0010)&&(f1==1'b1))beginnum=acc-breg;acc=num;f1=1'b0;endelseif((tmp==4'b0011)&&(f1==1'b1))beginnum=(acc*breg);acc=num;f1=1'b0;endendendend//寄存器ACC与BREG再送入逻辑运算元件,通过ALU运算后将结果通过总线送入寄存器ACC,flag标志位防止取指令的程序执行多次,与S1中相同。然后程序又回到s0,继续执行下一条指令rom16_8ul(romdata,addrbus,cs);assignaddrbus=((pstate==s2)||(pstate==s4))?mar:4'b0000;assigndatabus=(cs==1'b0)?romdata:8'bxxxx_xxxx;assigncs=((pstate==s2)||(pstate==s4))?1'b0:1'b1;Ⅰassignoutport=outreg;endmodule第三章仿真结果Modelsim简介:Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。Ⅰ上图是将代码在Modulsim里仿真的得到的结果,可以看出,最终结果很好的符合了我们的预期:(00010000+00011000-00010100)*00000010=00101000下图是将代码下载到BASYS2开发板中的到的结果,可以看出,灯显示的数值为00101000,也与预期结果相一致,设计完成。Ⅰ