复杂指令集(CISI)CPU设计实验

复杂指令集,也称为CISC指令集,英文名是CISC,(Complex Instruction Set Computer的缩写)。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。其实它是英特尔生产的x86系列(也就是IA-32架构)CPU及其兼容CPU,如AMD、VIA的。即使是现在新起的X86-64(也被称为AMD64)都是属于CISC的范畴。
注:本次实验设计的CPU仅仅包含六条指令
CPU的组成:
1.控制器
l程序计数器(Program Counter)
l指令寄存器(Instruction Register)
l指令译码器( Instruction Decoder)
l时序脉冲发生器( Sequential Pulse Generator)
l操作控制器(Operation Counter)
2.运算器----实现算术运算、逻辑运算
lALU(Arithmetic / logic Unit)
l累加器(accumulator)
l数据缓冲寄存器(Data Buffer Register)
l状态条件寄存器(Program Status Register,Program Status Word, Flag Register)
3.主要的寄存器(分属运算器、控制器)
IR指令寄存器
PC程序计数器
AR地址寄存器
ID指令译码器
AC累加器
状态条件寄存器(标志寄存器FR)
顶层框图:






仿真结果:




部分模块程序(verilog)
PC
module program_cnt(t4,ldpc,load,npc_bus,pc,bus);
input t4,ldpc,load,npc_bus;//nreset,clk,
output [7:0] pc;
inout [7:0] bus;
reg [7:0]q;
assign pc=q;
always @(posedge t4)
if(load)
   q<=bus;
else
   if(ldpc)    q<=q+1;
assign bus = npc_bus ? 8'bZZZZZZZZ : q;
endmodule
微程序控制器
module mpcu(ad,iro,p1,nclr,t2,t4,iri,swe,srd,s,m,ncn,load,ce,we,ldr0,lddr1,lddr2,ldir,ldpc,ldar,nalu_bus,npc_bus,nr0_bus,nsw_bus,out,clk); 
output [3:0] s;
output m,ncn,ce,we,ldr0,lddr1,lddr2,ldir,ldpc,ldar;
output nalu_bus,npc_bus,nr0_bus,nsw_bus,load;
output [4:0] ad;
output [7:5] iro;
output p1;
output[23:5]out;
input swe,srd,nclr,clk;
input [7:5] iri;
input t4,t2;
wire [23:0] q;
reg [23:5] out;
reg [4:0]  ad;
wire [7:5]  iro;
assign iro[7]=!(p1&&t4&&iri[7]);
assign iro[6]=!(p1&&t4&&iri[6]);
assign iro[5]=!(p1&&t4&&iri[5]);
assign s[3:0]=out[23:20];
assign m=out[19];
assign ncn=out[18];
assign load=out[17];
assign ce=out[16];
assign we=out[15];
assign ldr0=out[14];
assign lddr1=out[13];
assign lddr2=out[12];
assign ldir=out[11];
assign ldpc=out[10];
assign ldar=out[9];
assign nalu_bus=out[8];
assign p1=out[5];
assign nsw_bus=!((!out[7]) && out[6]);//01
assign nr0_bus=!(out[7] && (!out[6]));//10
assign npc_bus=!(out[7] && out[6]);//11
always @(posedge t2 or posedge !nclr   or  posedge !iro[5])
if(!nclr==1)
     ad[0]=0;
else
     begin
         if(iro[5]==0) ad[0]=1; else ad[0]=q[0];
     end
always @(posedge t2 or posedge !nclr   or  posedge !iro[6])
if(!nclr==1)
     ad[1]=0;
else
     begin
        if(iro[6]==0) ad[1]=1; else ad[1]=q[1];
     end
always @(posedge t2 or posedge !nclr   or  posedge !iro[7])
if(!nclr==1)
   ad[2]=0;
else
   begin
      if(iro[7]==0) 
          ad[2]=1; 
    else 
          ad[2]=q[2];
   end
always @(posedge t2 or posedge !nclr   or  posedge !srd)
if(!nclr==1)
   ad[3]=0;
else
   begin
       if(srd==0) 
          ad[3]=1; 
      else 
          ad[3]=q[3];
   end
always @(posedge t2 or posedge !nclr   or  posedge !swe)
if(!nclr==1)
   ad[4]=0;
else
   begin
      if(swe==0) 
          ad[4]=1; 
      else 
          ad[4]=q[4];
   end
always @(posedge t2  or posedge !nclr)
if (nclr==0)
   out[23:5]=0;
else 
   out[23:5]=q[23:5];
rom1 rom0(ad[4:0],clk,q[23:0]);   //memory of microinstruction
endmodule
展开阅读全文

没有更多推荐了,返回首页