简单cpu(CPU ASIC)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验目的

通过实验了解CPU基本信息,运行方式

实验原理:

中央处理器的工作原理就在于在机器周期的每一个时钟周期内,完成本周期对应信号的控制。而本次设计的简单的CPU也一样,其核心的部分就在Tstep所控制对应的周期中,读入输出总线上的指令,分析输入的指令并对寄存器,数据总线以及加(减)法器的各个控制输入输出端口信号进行控制。从而达到存储寄存器,进行加减法,进行总线操作的功能。下面简述CPU的框架:

(1)寄存器

寄存器是用于存放CPU工作中所需要用到的数据的部分。它有一个16位的数据输入端口,接在总线上。一个一位控制端口,用于控制寄存器的工作与否。当控制信号为高时,寄存器从输入端口输入数据。另外有一个16位的数据输出端口。当然寄存器也需要时钟信号来驱动工作。

(2)模为4的计数器

本CPU有4条指令,经分析可知每条指令所需要的时钟周期均小于等于四,所以设计一个模为4的计数器来控制CPU的时序。它的驱动为系统统一的时钟,而它的输出则作为控制部分的时钟信号输入。

(3)38译码器

用于译码输入的指令,从而产生控制寄存器的信号。

(4)控制部分

这个部分是CPU的核心部分,它包含所有的控制逻辑,能够通过改变输出信号而达到控制周围模块的结果。本程序之中,控制部分还包括了一个加(减)法器。

二.实验程序

module proc(DIN,Resetn,clock,Run,Done,Buswires);

input[15:0] DIN;

input Resetn;

input clock;

input Run;

output Done;

output Buswires;

reg [15:0]Buswires;

reg[0:0] IRin;

reg[0:7] Rin;

reg[0:7] Rout;

reg DINout;

reg Done;

reg Ain;

reg Gin;

reg AddSub;

reg[15:0] Sum;

wire [1:0] Tstep_Q;

wire [8:0]IR;

wire [2:0]I;

wire[7:0] Xreg;

wire[7:0] Yreg;

wire[15:0] R0;

wire[15:0] R1;

wire[15:0] R2;

wire[15:0] R3;

wire[15:0] R4;

wire[15:0] R5;

wire[15:0] R6;

wire[15:0] R7;

wire[15:0] A;

wire[15:0] G;

wire[1:10] select;

wire clear=Resetn|Done|(~Run&~Tstep_Q[0]&~Tstep_Q[1]); upcount Tstep(clear,clock,Tstep_Q);

assign I=IR[8:6];

dec3to8 decX(IR[5:3],1'b1,Xreg);

dec3to8 decY(IR[2:0],1'b1,Yreg);

always @(Tstep_Q or I or Xreg or Yreg)

begin

Done=1'b0;

Ain=1'b0;

Gin=1'b0;

Gout=1'b0;

AddSub=1'b0;

DINout=1'b0;

IRin=1'b0;

Rout=8'b0;

Rin=8'b0;

case(Tstep_Q)

2'b00:

begin

IRin=1'b1;

end

2'b01:

3'b000: begin

Rout=Yreg; Rin=Xreg; Done=1'b1; end

3'b001: begin DINout=1; Rin=Xreg; Done=1'b1; end default: begin

Rout=Xreg; Ain=1'b1; end endcase

2'b10:

case(I)

3'b010: begin

Rout=Yreg; Gin=1'b1; end

3'b011: begin

Rout=Yreg; Gin=1'b1; AddSub=1'b1; end default:; endcase

2'b11:

case(I)

3'b010,3'b011: begin

Gout=1'b1; Rin=Xreg; Done=1'b1;

end

default:;

endcase

endcase

end

regn reg_o(Buswires,Rin[0],clock,R0);

regn reg_1(Buswires,Rin[1],clock,R1);

regn reg_2(Buswires,Rin[2],clock,R2);

regn reg_3(Buswires,Rin[3],clock,R3);

regn reg_4(Buswires,Rin[4],clock,R4);

regn reg_5(Buswires,Rin[5],clock,R5);

regn reg_6(Buswires,Rin[6],clock,R6);

regn reg_7(Buswires,Rin[7],clock,R7);

regn reg_A(Buswires,Ain,clock,A);

regn reg_IR(DIN[15:7],IRin,clock,IR);

always @(AddSub,A,Buswires)

begin

if(!AddSub)

Sum=A+Buswires;

else

Sum=A-Buswires;

end

regn reg_G(Sum,Gin,clock,G);

assign select={Rout,Gout,DINout};

always @(select,R0,R1,R2,R3,R4,R5,R6,R7,G,DIN) begin

if(select==10'b1000000000)

Buswires=R0;

else if(select==10'b010*******)

Buswires=R1;

else if(select==10'b0010000000)

Buswires=R2;

else if(select==10'b0001000000)

Buswires=R3;

else if(select==10'b0000100000)

Buswires=R4;

else if(select==10'b0000010000)

Buswires=R5;

else if(select==10'b0000001000)

Buswires=R6;

else if(select==10'b0000000100)

Buswires=R7;

else if(select==10'b0000000010)

相关文档
最新文档