0/19[EDA与VHDL实验报告][16位CPU设计]16位CPU设计16位cpu设计一、顶层系统设计1.1组成结构CPU的结构如图所示。这是一个采用单总线系统架构的复杂指令系统结构的16位CPU。处理器包含了各种基本器件模块。他们是8个16位的寄存器reg0~reg7、一个运算器ALU、一个移位寄存器Shifter、一个程序计数器PortCnt、一个指令寄存器InstrReg、一个比较器Comp、一个地址寄存器Addreg、和一个控制单元Control。这些模块公共用一组16位的三台数据总线。系统采用自顶向下的方法进行设计。顶层设计由微处理器和存储器通过一组双向数据总线连接,它们由一组地址总线和一些控制总线组成。处理器从外存储器中读取指令,并通过执行这些指令来运行程序。这些指令存储在指令寄存器中,并由控制单元译码。控制单元使得相应的信号互相作用,并使处理单元执行这些指令。1.2.指令系统设计在设计处理器时首先要确定Cpu具有哪些功能,并针对这些功能采用哪些指令,然后确定指令的格式。为了使设计的CPU具有基本的运算功能,指令将设计成以下形式,可以分为如下几类.装载指令:指令从其他寄存器或存储器装载数据或是立刻赋值。存储指令:指令存储寄存器的值写到存储器分支指令:指令使处理器转到其它地址,一些分支指令为条件转移,另外一些为无条件转移移位指令:这些指令用移位寄存器单元执行移位操作,实现数据传递16位CPU设计1.2.1指令格式所有的指令都包含五位操作码。单字节指令在低6位指令中包含两个3位寄存器,一个是源操作数寄存器,另一个是目的操作数寄存器。双字节指令中,第一个字节中包含目标寄存器的地址,第二个字节中包含了指令地址或者操作数。指令格式如下:(1)单字指令指令的高五位是操作码,低六位是源操作数寄存器和目的操作数寄存器。指令码格式如下Opcode操作码源操作数目的操作数1514131211543210(2)双字指令第一个字中包含目标寄存器的地址,第二个字中包含了指令地址或者操作数。1.2.2指令操作码操作码功能表操作码指令功能00000NOP空操作00001LOAD装载数据到寄存器00010STORE将寄存器的数据存入存储器00011MOVE在寄存器之间传送操作数00100LOAD1将立即数装入寄存器00101BRANCHI转移到由立即数指定的地址00110BRANCHGTI大于是转移到立即数指定的地址00111INC加1指令01000DEC减1指令01001AND两个寄存器与操作01010OR两个寄存器或操作01011XOR两个寄存器异或操作01100NOT寄存器求反01101ADD两个寄存器加运算01110SUB两个寄存器减运算01111ZERO寄存器清零10000BRANCHLTI小于时转移到由立即数指定的地址10001BRANCHLT小于时转移10010BRANCHNEQ不等于时转移10011BRANCHQI转移到立即数指定的地址10100BRANCHGT大于时转移10101BRANCH无条件转移10110BRANCHEQ等于时转移16位CPU设计10111BRANCHQI等于时转移到立即地址11000BRANCHELTEI小于等于时转移到立即地址11001BRANCHLTE小于等于时转移11010SHL向左逻辑移位11011SHR向右逻辑移位11100ROTR循环右移11101ROTL循环左移1.3.顶层结构的VHDL设计CPU原件的VHDL描述CPU_LIB.VHDL用来说明连接各个原件之间的信号类型。描述了多个用于规定运算器功能、移位寄存操作和用于CPU控制的状态的类型。CPU_LIB.VHDLlibraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;packagecpu_libistypet_shiftis(shftpass,shl,shr,rotl,rotr);subtypet_aluisunsigned(3downto0);constantalupass:unsigned(3downto0):0000;constantandOp:unsigned(3downto0):0001;constantorOp:unsigned(3downto0):0010;constantnotOp:unsignde(3downto0):0011;constantxorOp:unsigned(3downto0):0100;constantplus:unsignde(3downto0):0101;constantalusub:unsigned(3downto0):0110;constantinc:unsignde(3downto0):0111;constantdec:unsigned(3downto0):1000;constantzero:unsignde(3downto0):1001;typet_compis(eq,neq,gt,gte,lt,lte);typestateis(reset1,reset2,reset3,reset4,reset5,reset6,execute,nop,load,store,move,load2,load3,load4,store2,store3,store4,move2,move3,move4,incPc,bgtI3,bgtI4,bgtI5,bgtI6,bgtI7,bgtI8,bgtI9,bgtI10,braI2,braI3,braI4,braI5,braI6,loadI2,loadI3,loadI4,loadI5,loadI6,inc3,inc4);subtypebit16isstd_logic_vector(15downto0);endcpu_lib;16位CPU设计二、CPU部件设计2.1.算术逻辑单元ALUALU实体结构如下:a[15..0]b[15..0]sel[3..0]c[15..0]aluinstVHDL代码:libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_unsigned.all;usework.cpu_lib.all;entityaluisport(a,b:inbit16;sel:int_alu;c:outbit16);endalu;architecturertlofaluisbeginaluproc:process(a,b,sel)begincaseseliswhenalupass=c=aafter1ns;--0000whenandOp=c=aandbafter1ns;--0001whenorOp=c=aorbafter1ns;--0010whenxorOp=c=axorbafter1ns;whennotOp=c=notaafter1ns;whenplus=c=a+bafter1ns;whenalusub=c=a-bafter1ns;wheninc=c=a+0000000000000001after1ns;whendec=c=a-0000000000000001after1ns;whenzero=c=0000000000000000after1ns;whenothers=c=0000000000000000after1ns;endcase;endprocess;endrtl;16位CPU设计仿真结果:2.2.比较器COMP比较器的实体名为COMP。实体COMP比较两个值,输出结果为l或O,取决于比较对象的类型和值。比较器结构如图6-10所示,比较器的运算类型说明列于表6-7中。比较器的运算类型决定于选择输入控制信号sel的值。例如,欲比较输入端口A和B的值是否相等,须先将EQ传到端口sek,这时如果A和B的值相等,则COMPOUT的值为l;如果不相等,则为O。比较器实体结构:a[15..0]b[15..0]compoutcompinst1VHDL代码:libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;useIEEE.std_logic_unsigned.all;usework.cpu_lib.all;entitycompisport(a,b:inbit16;sel:int_comp;compout:outstd_logic);endcomp;architecturertlofcompisbegincompproc:process(a,b,sel)begincaseseliswheneq=ifa=bthencompout='1'after1ns;elsecompout='0'after1ns;endif;whenneq=ifa/=bthencompout='1'after1ns;16位CPU设计elsecompout='0'after1ns;endif;whengt=ifabthencompout='1'after1ns;elsecompout='0'after1ns;endif;whengte=ifa=bthencompout='1'after1ns;elsecompout='0'after1ns;endif;whenlt=ifabthencompout='1'after1ns;elsecompout='0'after1ns;endif;whenlte=ifa=bthencompout='1'after1ns;elsecompout='0'after1ns;endif;endcase;endprocess;endrtl;比较器RTL图=A[15..0]B[15..0]EQUALA[15..0]B[15..0]LESS_THANCINA[15..0]B[15..0]LESS_THAN1A[15..0]B[15..0]LESS_THANCINA[15..0]B[15..0]LESS_THAN1SEL[5..0]DATA[5..0]OUTSELECTOREqual0LessThan0LessThan1LessThan2LessThan3Selector0sel.eqsel.neqsel.gtsel.gtesel.ltsel.ltecompouta[15..0]b[15..0]图2.2.1比较器RTL图16位CPU设计仿真结果:图2.2.2比较器时序仿真结果2.3.控制器CONTROL实体控制器提供必要的信号连线,使得数据流完全通过CPU,达到预期的功能。结构体包含一个状态机,这个状态机根据当前的状态和输入的信号值,输出更新后的状态。之中,输入信号有:指令信号instrReg[15..0]、比较器输出状态、存储器就绪信号ready和CPU复位信号reset。输出信号时对指令instrReg[15..0]译码以后,对CPU所有组成部件按指令要求进行操作所需的控制信号。VHDL程序:libraryieee;useIEEE.std_logic_1164.all;usework.cpu_lib.all;entitycontrolisport(clock,reset,ready,compout:instd_logic;instrReg:inbit16;progCntrWr,progCntrRd,addrRegWr,addrRegRd,outRegWr,outRegRd:outstd_logic;shiftSel:outt_shift;aluSel:outt_alu;compSel:outt_comp;opRegRd,opRegWr,instrWr,regRd,regWr,rw,vma:outstd_logic;regSel:outt_reg);endcontrol;architecturertlofcontrolissignalcurrent_state,n