微处理器系统设计(设计方案)版本v1.0专业:集成电路设计与集成系统班级:电路1201姓名:韩喆学号:05126030日期:2015年6月25日目录一、实验设计目的...................................................................................................................1二、设计实现方案...................................................................................................................11微处理器系统设计方案一、实验设计目的基于前期课程中已掌握的CPU基本部件的设计方法、仿MIPS处理器指令集设计一个带简单I/O接口电路的多周期RISC处理器,采用自顶向下的全正向设计方法,并选用Verilog_HDL语言为设计输入工具,在FPGA上进行验证。先完成多周期微处理器指令系统设计,多周期微处理器数据通路以及系统结构设计。然后验证设计,设计实现一个简单的总线控制模块和8255并口芯片功能,并驱动LED灯,设计简单的流水灯变化,其变化样式如下:1)001100-11001100,切换间隔为0.5秒;2)11100111-00011000,切换间隔为0.5秒。两种样式之间自动切换,切换间隔为10秒。二、设计实现方案1.总体设计方案1)指令及其功能表(1)R型指令:指令指令格式功能oprsrtrdshamefuncadd000000sj1Sj2jgxx100000Jg=sj1+sj2sub000000sj1Sj2jgjg100010Jg=sj1-sj2or000000Sj1Sj2jgxx000010Jg=sj1|sj2and000000Sj1xxjgxx000011Jg=sj1&sj2sll000000Sj1xxjg移位数000100Jgsj(2)I型指令:指令指令格式功能oprsrtImmediateaddiu101011sj1Sj2ImmSj2=sj1+immandi001100sj1Sj2ImmSj2=sj1&immLw100011basertoffsetoffsetMemory[base+imm]sw001001basertoffsetMemory[base+imm]offset(3)J型指令:指令指令格式功能2oprsrtoffsetBeq000100sj1Sj2offsetIfsj1=sj2thenbranchBnq000101sj1Sj2offsetIfsj1≠sj2thenbranchj1010002)总体结构设计主控制器寄存器逻辑运算器程序计数器地址多路器数据控制器累加器时钟发生器存储器clk1clkIR_addropcodePC_addrALU_outaccumaddrClk_out注:将一个外来时钟信号clk_out生成一系列时钟信号clk1、clk送往CPU内部的其他部件。clk1信号用作状态控制器的时钟信号。clk则用于触发每一个状态的进行。3)该MIPSCPU的顶层原理图3处理器存储器BERWWDataCSAClkBECSDataInAddrDataOUTDataReadyRWrst2.子模块详细设计该多周期CPU内部主要包括九个基本模块,即时钟发生器,指令寄存器,累加器,算术逻辑单元,数据控制器,状态控制器,取指模块,地址多路器和立即数扩展等模块。各模块具体功能及相关主要端口说明如下:1)时钟发生器根据功能单元所需进行的操作,将一条指令执行分解为一系列步骤,指令的每一个步骤占用一个时钟周期。因此利用时钟发生器模块将一个外来时钟信号Clk_out生成一系列不同的时钟信号clk1、clk送往CPU内部的其他部件。利用clk的上升沿来触发CPU控制器开始执行一条指令。clk1信号用作状态控制器的时钟信号。端口定义:序号接口信号名称方向(I/O)说明1Clk_outI外部输入时钟2rstI复位信号,低有效3clk1O状态控制器的时钟信号4clkOALU的时钟信号2)指令寄存器指令存储器用于存放CPU运算的程序指令和数据等,采用单端口存储器设计,设计最大为64个存储单元,每个存储单元数据宽度为32bit。指令寄存器的触发时钟是clk,在clk的正沿触发下,寄存器将数据总线送来的指令寄存器中。但并不是每个clk的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。什么时候寄存,什么时候不寄存由CPU状态控制器的load_ir信号控制。load_ir信号通过ena口输入到指令寄存器。复位后,指令寄存器被清为零。序号接口信号名称方向(I/O)说明5clkI存储器工作时钟,频率为50Mhz6rstI存储器片选信号,低有效7ExtMem_Adr[5:0]I存储器地址线4序号接口信号名称方向(I/O)说明8ExtMem_WRI存储器读写信号,1为写反之读9ExtMem_Din[31:0]I存储器输入数据线10ExtMem32[31:0]O存储器输出数据线11enaI加载指令寄存器3)累加器累加器用于存放当前的结果。复位后,累加器的值是零。当累加器通过ena使能端口收到来自CPU状态控制器load_acc信号时,在clk时钟正跳沿时就收到来自于数据总线的数据。序号接口信号名称方向(I/O)说明1clkI时钟信号2enaI使能信号3Data[31:0]I来自数据总线的数据4rstI复位信号,低有效5accum[31:0]O输出总线上的数据4)RISCCPU算术逻辑运算单元算术逻辑运算单元根据输入的8种不同操作码分别实现相应的加、减、与、异或、跳转等多种基本操作运算。利用这几种基本运算可以实现很多种其它运算以及逻辑判断等操作。同时利用该算术逻辑部件的部分功能实现下载之后的流水灯简单变化功能,用以验证设计结果。(1).端口说明(2).具体ALU实现如下图所示序号接口信号名称方向(I/O)说明1ALU_DA[31:0]I参与运算的第一个输入数据2ALU_DB[31:0]I参与运算的第二个输入数据3alu_clt[3:0]I运算功能编码4alu_shift[4:0]I偏移量5ALU_ZeroO零标志位6Alu_OverflowO溢出标志位7ALU_Dout[31:0]O运算结果输出位5ALU操作控制信号O101201异或门异或门ALU_DA[31:0]ALU_DB[31:0]加减法运算器异或门阵列位扩展或门阵列01SUBctrOPctrOVctrSIGctrCinAdd_carryAdd_SignAdd_ResultAdd_OverflowZeroOverflowResult5)数据控制器数据控制器的作用是控制累加器数据输出,由于数据总线是各种操作时传送数据的公共通道,不同的情况下传送不同的内容。有时要传输指令,有时要传送RAM区或接口的数据。计算单元的数据只有在需要往RAM区或端口写时才允许输出,否则应呈现高阻态,以允许其它部件使用数据总线。所以任何部件往总线上输出数据时,都需要一控制信号。而此控制信号的启、停,则由CPU状态控制器输出的各信号控制决定。数据控制器何时输出ALU的数据则由状态控制器输出的控制信号Data_ena决定。序号接口信号名称方向(I/O)说明1InIALU的数据输入口2Data_enaI是否输出ALU的数据的控制信号3Data[31:0]O来自数据总线的数据6)状态控制器状态控制器由两部分组成:1.状态机2.状态机控制器状态机控制器接受复位信号RST,当RST有效时通过信号ena使其为0,输入到状态机中停止状态机的工作。状态机是CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件。CPU对指令和数据的读写都是由状态机来控制的。状态机的当前状态,由变量state记录,state的值就是当前这个指令周期中已经过的时钟数。6PCWr=IRWr=1Memwr=RegWr=0Aluop=00Extop=1PCWr=IRWr=MemWr=RegWr=0Aluop=00Extop=MemtoReg=1Aluop=00Aluop=01RegWr=1Extop=1Aluop=01Extop=1PCwriteMemReadMemwriteRegDst=1RegWriteMemtoReg=0RegDst=0RegWriteMemtoReg=1分支完成存储访问SW取指令指令译码/寄存器取跳转完成执行存储器地址计算存储访问LWR型完成存储读完成01567894类指令的有限状态机图一条指令的执行分为若干个周期,包括取指令周期,指令译码周期,指令执行周期,存储器访问周期以及结果回写周期。本次实验利用有限状态机实现多周期CPU的控制。在执行指令过程中:(1).LW等指令的执行包括5个周期:a)根据程序计数器取指令,并且PC+1;b)指令译码,读出rs寄存器的内容;c)计算存储器地址;d)访问存储器,读出数据;e)将结果写入寄存器堆中的rt寄存器。(2).跳转指令的执行需要3个周期:a)根据PC取指令;b)指令译码,选择要跳转的目标地址;c)把跳转地址写入PC中。(3).R型指令执行需要4个周期:a)根据程序计数器取指令,并且PC+1;b)读出rs和rt寄存器的内容;c)由ALU完成两个输入数据的计算;d)将结果写入寄存器堆中。(4).转移指令执行需要3个周期:a)根据程序计数器取指令;b)读出rs和rt寄存器的内容,ALU计算转移地址;7c)由ALU比较两个寄存器内的数据,决定是否要把转移地址写入PC中。7)取指模块由程序计数器,取出指令以及译码三个子模块构成总的取指模块。程序计数器用于提供指令地址。以便读取指令,指令按地址顺序存放在存储器中。当指令顺序执行时,pc_addr每次自动加1,如果遇到要改变顺序执行程序的情况,即分支或跳转指令时,需要形成新的指令地址,这时CPU状态控制器将会输出load_pc信号,通过load口进入程序计数器。程序计数器(pc_addr)将装入目标地址(ir_addr),而不是增1。如果执行复位,则复位后,指令指针为零,即每次CPU重新启动将从存储器的零地址开始读取指令并执行。(1).端口说明:序号信号名方向(I/O)端口说明1clkI2rstI3ALU_DAI算术逻辑单元数据A4BranchI分支信号使能端5JumpI跳转信号使能端6opO指令操作码7rsO8rtO9rdO10funcOR指令的功能操作码11shamtO偏移量12imm16O立即数13ALU_DBO算术逻辑单元数据B14Pc_outO程序计数器输出(2).电路内部基本构成如下图所示:PCFetchdecodeclkrstALU_DAJumpBranchPc_outALU_DBinstruct3232op[5:0]rs[4:0]rt[4:0]rd[4:0]func[5:0]shamt[4:0]Imm16[15:0]88)地址多路器地址多路器用于选择输出的地址是PC(程序计数)地址还是数据/端口地址。每个指令周期的前4个时钟周期用于从ROM中读取指令,输出的应是PC地址。后4个时钟周期用于对RAM或端口的读写,该地址由指令中给出。地址的选择输出信号由时钟信号的fetch提供。端口定义:序号接口信号名称方向(I/O)说明1PC_addrIPC地址2IR_addrI指令地址3FetchI时钟信号4addrO选择地址的输出9)立即数扩展设计一个32位MIPS符号扩展单元SE,用于将16位的数据转换为32位数据。端口说明:序号信号名方向(I/O)说明1Imm16[15:0]I来自指令寄存器的16位立即数2ExtopI立即数扩展信号的使能端3bus[31:0]I4ExtImm32[31:0]O符号扩展后的32位立即数3.设计过程中部分重要代码1)利用状态机实现CPU内部信号控制,主要控制信号:ALUSrcA,ALUSrcB,Load_Mem,MemtoReg,R