西南交通大学计算机组成原理实验课程设计
一、CPU 模块 Verilog HDL 代码
module CPU
(
// 清零信号
// 时钟信号
// 指令
input reset,
input clock,
input [7:0] M_data_in,
output reg [7:0] M_data_out,
// 运算溢出信号
output reg overflow,
output reg Write_Read,
// 读写信号
output reg [11:0] M_address, // 指令地址
output reg [7:0] R_0,R_1,R_2,R_3
// 输出到内存单元的数据
);
// 通用寄存器组
reg [7:0] R0;
reg [7:0] R1;
reg [7:0] R2;
reg [7:0] R3;
// 指令寄存器
reg [15:0] IR;
// 程序计数器
reg [11:0] PC;
// 内存数据寄存器
reg [7:0] MDR;
// 内存地址寄存器
reg [11:0] MAR;
// 操作数和被操作数寄存器
reg [7:0] A;
// 操作码寄存器
reg [3:0] OP;
// 状态寄存器
reg [3:0] state;
// 临时寄存器
reg [8:0] Temp;
always @ (reset or state)
begin
M_address = MAR;
M_data_out = MDR;
end
always @ (posedge clock)
begin
R_0=R0;
R_1=R1;
R_2=R2;
R_3=R3;
end
// 指令读取分析执行
always @ (posedge clock)
begin
if(reset==0) // PC,IR,MDR,MAR 寄存器清零
begin
PC=0;
IR=0;
MAR=0;
MDR=0;
R0=0;
R1=0;
R2=0;
R3=0;
state=0;
OP=0;
end
begin
case(state)
// 0 状态取指令,提取操作码
0: begin
Write_Read=1'b0;
PC=PC+1;
MAR=PC;
IR={M_data_in,8'b00000000};
OP=IR[15:12];
case(IR[9:8])
0:A=R0;
1:A=R1;
2:A=R2;
3:A=R3;
endcase
state=1;
end
// 1 状态分析操作码
1: begin
Write_Read=1'b0;
case(OP)
0:begin state=0; end
1:begin R0={4'b0000,IR[11:8]}; state=0; end // 立即数寻址
2:begin
// Move
// PC+1
case(IR[11:10])
0:R0=A;
1:R1=A;
2:R2=A;
3:R3=A;
endcase
state=0;
end
3:begin // ADD
case(IR[11:10])
0:begin Temp={R0[7],R0}+{A[7],A}; R0=Temp[7:0]; end
1:begin Temp={R1[7],R1}+{A[7],A}; R1=Temp[7:0]; end
2:begin Temp={R2[7],R2}+{A[7],A}; R2=Temp[7:0]; end
3:begin Temp={R3[7],R3}+{A[7],A}; R3=Temp[7:0]; end
endcase
if(Temp[8]^Temp[7]) // 判断溢出
else
overflow=1;
overflow=0;
state=0;
end
4:begin
// Sub
case(IR[11:10])
0:begin Temp={R0[7],R0}-{A[7],A}; R0=Temp[7:0]; end
1:begin Temp={R1[7],R1}-{A[7],A}; R1=Temp[7:0]; end
2:begin Temp={R2[7],R2}-{A[7],A}; R2=Temp[7:0]; end
3:begin Temp={R3[7],R3}-{A[7],A}; R3=Temp[7:0]; end
endcase
if(Temp[8]^Temp[7]) // 判断溢出
else
overflow=1;
overflow=0;
state=0;
end
5:begin // AND
case(IR[11:10])
0:R0=R0&A;
1:R1=R1&A;
2:R2=R2&A;
3:R3=R3&A;
endcase
state=0;
end
6:begin // OR
case(IR[11:10])
0:R0=R0|A;
1:R1=R1|A;
2:R2=R2|A;
3:R3=R3|A;
endcase
state=0;
end
7:begin // XOR
case(IR[11:10])
0:R0=R0^A;
1:R1=R1^A;
2:R2=R2^A;
3:R3=R3^A;
endcase
state=0;
end
8:begin // Shr
case(IR[11:10])
0:R0={1'b0,R0[7:1]};
1:R1={1'b0,R1[7:1]};
2:R2={1'b0,R2[7:1]};
3:R3={1'b0,R3[7:1]};
endcase
state=0;
end
9:begin //Shl
case(IR[11:10])
0:R0={R0[6:0],1'b0};
1:R1={R1[6:0],1'b0};
2:R2={R2[6:0],1'b0};
3:R3={R3[6:0],1'b0};
endcase
state=0;
end
10:begin // Swap
case(IR[11:8])
0:R0=R0;
1:R1=R0;
2:R2=R0;
3:R3=R0;
4:R0=R1;
5:R1=R1;
6:R2=R1;
7:R3=R1;
8:R0=R2;
9:R1=R2;
10:R2=R2;
11:R3=R2;
12:R0=R3;
13:R1=R3;
14:R2=R3;
15:R3=R3;
endcase
case(IR[11:10])
0:R0=A;
1:R1=A;
2:R2=A;
3:R3=A;
endcase
state=0;
end
11:begin
// Jmp
state=2;
end
12:begin
end
13:begin
end
14:begin
end
15:begin
// Jz
state=2;
// Read
state=2;
// Write
state=2;
// Stop
state=1;
end
endcase
end
2:begin
Write_Read=1'b0;
MDR=R0;
PC=PC+1;
state=3;
case(OP)
11:begin // Jmp
IR[7:0]=M_data_in;
MAR=IR;
end
12:begin // Jz
if(R0==0)
begin
IR[7:0]=M_data_in;
MAR[11:0]=IR[11:0];
end
else
MAR[11:0]=PC;
end
13:begin // Read
IR[7:0]=M_data_in;
MAR=IR;
end
14:begin // Write
PC=MAR;
IR[7:0]=M_data_in[7:0];
MAR[11:0]=IR[11:0];
end
endcase
end
3:begin
Write_Read=1'b0;
case(OP)
11:begin // Jmp
PC=IR[11:0];
state=0;
end
12:begin // Jz
if(R0==0)
PC=IR[11:0];
state=0;
end
13:begin // Read
MAR=PC;
state=4;
end
14:begin // Write
Write_Read=1'b1;
MAR=PC;
state=4;
end
endcase
end
Write_Read=1'b0;
if(OP==13)
R0=M_data_in;
state=0;
4:begin
end
endcase
end
end
endmodule
二、顶层原理图
三、MIF 文件