简单cpu(CPU ASIC)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)