实验目的
通过实验了解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)
Buswires=G;
else
Buswires=DIN;
end
endmodule
实验图像
1.第一个时钟周期,Resetn为0,故整个计算机为清零。
2.第二个时钟周期,也就是第一个机器周期,Resetn为1,Run为1,计算机开始工作,
DIN输入为2000,IR中读入指令为八进制的100,左边第一位为1,表示执行mvi 指令,这个指令的意思就是把下一周期内DIN上的16位数据读入寄存器0中。
Done 为1,表示完成了该指令。
3.第三个时钟,即第二个机器周期。
DIN上出现的数据是0005,可见BusWires上出
现了0005,并且编号为0的寄存器也存入了数据0005。
4.DIN变为0400,IR中读入的指令为八进制的010,意思就是把编号为0的寄存器里
面的数据通过总线存放到寄存器1中。
而且其本身的数值不变。
5.执行010指令,所以寄存器1的数据更新为0005。
Done变为1.
6.DIN变为4080,IR读入201,意思就是把寄存器0与1中的数据相加之后存如寄存
器0中。
由信号图可以看出寄存器G,A都有更新数据。
并且寄存器0中的数据变为000A。
7.DIN变为6000,IR读入300,意即寄存器0中的数据与本身相减,由后可看到寄存
器0,G,A中的数据均更新为0了。
实验过程及分析
出2000。
符合波形图上RUN第一个高电平的波形图。
输出如图所示为0005。
符合波形图上Run第二个低电平波形图。
出如图所示为0005。
符合波形图上Run第三个高电平波形图。
出如图所示为000A。
符合波形图Run第4个较长低电平波形图。
如图所示为8080。
符合波形图上Run第4个较长低电平第二个clock波形图。
如图所示为000A。
符合波形图上Run第四个高电平波形图。
最后结束演示的2张示意图。