西工大计组实验_verilog实现单周期CPU_2022

说明:

后面做题的时候有对前面的代码进行更正,  所以会出现拼接在一起过不去的情况.

如果有及时联系我, 我会进行修改. 


预习

大小比较器

module comparer #(parameter width=8) (gt,lt,eq,a,b);

output reg gt,lt,eq;

input [width-1:0] a,b;

always@(a,b)

begin
gt=0;
eq=0;
lt=0;

if(a[31]>=1&&b[31]<1)
lt=1;
else if(a[31]<1&&b[31]>=1)
gt=1;
else if(a[31]<1&&b[31]<1)
	if(a>b) gt=1;
	else if(a==b) eq=1;
	else lt=1;
else
	if(a<b) lt=1;
	else if(a==b) eq=1;
	else gt=1;
end

endmodule

D触发

module d_ff  #(parameter WIDTH = 8) (q, d, reset, clock);


output reg [WIDTH-1 : 0] q;

input [WIDTH-1 : 0] d;

input reset, clock;
always@(posedge clock or negedge reset)
begin

if(reset==0)q=0;
else
q<=d;
end
endmodule

 实验一

pc模块

module pc(pc,clock,reset,npc);



output reg[31:0] pc;

input clock;

input reset;

input [31:0] npc;

always@(posedge clock, negedge reset)

begin 

if(clock) pc[31:0]<=npc[31:0];

if (!reset) pc[31:0]<=32'h0000_3000;

end

endmodule

 im模块

module im(instruction,pc);

output [31:0] instruction;

input [31:0] pc;

reg [31:0] ins_memory[1023:0]; 

assign instruction[31:0]=ins_memory[pc[11:0]>>2];

endmodule

gpr模块

module gpr(a,b,clock,reg_write,num_write,rs,rt,data_write);



output [31:0] a;  

output [31:0] b;

input clock;

input reg_write;

input [4:0] rs; //read reg1

input [4:0] rt; //read reg2

input [4:0] num_write; //write reg

input [31:0] data_write; //write data



reg [31:0] gp_registers[31:0];  //32* reg

always@(posedge clock)

begin

if(reg_write)

gp_registers[num_write]=data_write;


end

assign a=(rs==5'b0)?32'b0:gp_registers[rs];

assign b=(rt==5'b0)?32'b0:gp_registers[rt];

endmodule

 alu模块

module alu(c,a,b);



output [31:0] c;

input [31:0] a;

input [31:0] b;

assign c=a+b;

endmodule

 单周期cpu--addu

说明: 本模块未使用ctrl.v, 实际代码规范性上不符合考核要求, 已在实验二进行修改.

s_cycle_cpu.v 

module s_cycle_cpu(clock,reset);

input clock;
input reset;

wire clock;

wire [31:0] pc;
wire [31:0] npc;

wire [31:0] instruction;

wire [31:0] a;
wire [31:0] b;


wire [4:0] rt;
wire [4:0] rs;
wire [4:0] num_write;
wire [31:0] data_write;
wire reg_write;



assign reg_write=1;
assign rt=instruction[20:16];
assign rs=instruction[25:21];
assign num_write=instruction[15:11];



pc PC(.pc(pc),.clock(clock),.reset(reset),.npc(npc));
im IM(.instruction(instruction),.pc(pc));
gpr GPR(.a(a),.b(b),.clock(clock),.reg_write(reg_write),.num_write(num_write),.rs(rs),.rt(rt),.data_write(data_write));
alu ALU2(.c(data_write),.a(a),.b(b));
alu ALU1(.c(npc),.a(32'h0000_0004),.b(pc));


endmodule

alu.v 

module alu(c,a,b);



output [31:0] c;

input [31:0] a;

input [31:0] b;

assign c=a+b;

endmodule

gpr.v

module gpr(a,b,clock,reg_write,num_write,rs,rt,data_write);



output [31:0] a;  

output [31:0] b;

input clock;

input reg_write;

input [4:0] rs; //read reg1

input [4:0] rt; //read reg2

input [4:0] num_write; //write reg

input [31:0] data_write; //write data



reg [31:0] gp_registers[31:0];  //32* reg

always@(posedge clock)

begin

if(reg_write)

gp_registers[num_write]<=data_write;


end

assign a=(rs==5'b0)?32'b0:gp_registers[rs];

assign b=(rt==5'b0)?32'b0:gp_registers[rt];

endmodule

im.v

module im(instruction,pc);

output [31:0] instruction;

input [31:0] pc;

reg [31:0] ins_memory[1023:0]; 

assign instruction[31:0]=ins_memory[pc[11:0]>>2];

endmodule

pc.v

module pc(pc,clock,reset,npc);


output reg[31:0] pc;

input clock;

input reset;

input [31:0] npc;

always@(posedge clock, negedge reset)

begin 

if(!reset)pc<=32'h00003000;
else
pc<=npc;

end

endmodule

 单周期cpu--R型指令

说明: 本模块未使用ctrl.v, 实际代码规范性上不符合考核要求, 已在实验二进行修改.

add.v

module add(npc,adder,pc);

output [31:0] npc;
input [31:0] adder;
input [31:0] pc;

assign npc=pc+adder;

endmodule

s_cycle_cpu.v 

module s_cycle_cpu(clock,reset);

input clock;
input reset;

wire clock;

wire [31:0] pc;
wire [31:0] npc;

wire [31:0] instruction;

wire [31:0] a;
wire [31:0] b;


wire [4:0] rt;
wire [4:0] rs;
wire [4:0] num_write;
wire [31:0] data_write;
wire [3:0] ins;
wire reg_write;

assign ins=instruction[3:0];

assign reg_write=1;
assign rt=instruction[20:16];
assign rs=instruction[25:21];
assign num_write=instruction[15:11];



pc PC(.pc(pc),.clock(clock),.reset(reset),.npc(npc));
im IM(.instruction(instruction),.pc(pc));
gpr GPR(.a(a),.b(b),.clock(clock),.reg_write(reg_write),.num_write(num_write),.rs(rs),.rt(rt),.data_write(data_write));
alu ALU(.c(data_write),.a(a),.b(b),.ins(ins));
add ADD(.npc(npc),.adder(32'h0000_0004),.pc(pc));


endmodule

alu.v

module alu(c,a,b,ins);



output reg[31:0] c;

input [31:0] a;

input [31:0] b;

input [3:0] ins;

always@(*)
begin
case(ins)
4'b0001:c<=a+b;
4'b0011:c<=a-b;
4'b0000:c<=a+b;
4'b0100:c<=a&b;
4'b0101:c<=a|b;
4'b1010:
begin
if(a[31]>=1&&b[31]<1)
	c<=1;
else if(a[31]<1&&b[31]>=1)
	c<=0;
else c<=(a<b);
end
endcase
end

endmodule

gpr.v

module gpr(a,b,clock,reg_write,num_write,rs,rt,data_write);



output [31:0] a;  

output [31:0] b;

input clock;

input reg_write;

input [4:0] rs; //read reg1

input [4:0] rt; //read reg2

input [4:0] num_write; //write reg

input [31:0] data_write; //write data



reg [31:0] gp_registers[31:0];  //32* reg

always@(posedge clock)

begin

if(reg_write)

gp_registers[num_write]<=data_write;


end

assign a=(rs==5'b0)?32'b0:gp_registers[rs];

assign b=(rt==5'b0)?32'b0:gp_registers[rt];

endmodule

 im.v

module im(instruction,pc);

output [31:0] instruction;

input [31:0] pc;

reg [31:0] ins_memory[1023:0]; 

assign instruction[31:0]=ins_memory[pc[11:0]>>2];

endmodule

 pc.v

module pc(pc,clock,reset,npc);



output reg[31:0] pc;

input clock;

input reset;

input [31:0] npc;

always@(posedge clock, negedge reset)

begin 

if(!reset)pc<=32'h00003000;
else
pc<=npc;

end

endmodule

 实验二

 add.v

module add(npc,adder,pc);

output [31:0] npc;
input [31:0] adder;
input [31:0] pc;

assign npc=pc+adder;

endmodule

s_cycle_cpu.v

module s_cycle_cpu(clock,reset);

input clock;
input reset;

wire clock;

wire [31:0] pc;
wire [31:0] npc;

wire [31:0] instruction;

wire [31:0] a;
wire [31:0] b;
wire [31:0] alu_b;


wire [4:0] rt;
wire [4:0] rs;
wire [4:0] rd;
wire [31:0] data_write;
wire reg_write;
wire s_num_write;
wire [4:0] num_write;

assign s_num_write=instruction[29];


assign reg_write=1;
assign rt=instruction[20:16];
assign rs=instruction[25:21];
assign rd=instruction[15:11];

wire s_ext;
wire [15:0]imm16;
wire [31:0]imm32;
assign s_ext=instruction[28];
assign imm16=instruction[15:0];
wire [5:0] aluop;

assign aluop=(instruction[31:26]==6'b000000)?instruction[5:0]:instruction[31:26];

wire s_b;
assign s_b=instruction[29];

pc PC(.pc(pc),
	  .clock(clock),
	  .reset(reset),
	  .npc(npc));
im IM(.instruction(instruction),
	  .pc(pc));
gpr GPR(.a(a),
		.b(b),
		.clock(clock),
		.reg_write(reg_write),
		.num_write(num_write),
		.rs(rs),
		.rt(rt),
		.data_write(data_write));
alu ALU(.c(data_write),
		.a(a),
		.b(alu_b),
		.ins(aluop),
		.imm(imm16));
add ADD(.npc(npc),
		.adder(32'h0000_0004),
		.pc(pc));

mux MUX1(.mux_a(rd),
		 .mux_b(rt),
		 .mux_op(s_num_write),
		 .mux_out(num_write));
		 
mux MUX2(.mux_a(b),
		 .mux_b(imm32),
		 .mux_op(s_b),
		 .mux_out(alu_b));
		 
ext EXT(.ext_in(imm16),
		.s_ext(s_ext),
		.ext_out(imm32));
		
endmodule

alu.v 

module alu(c,a,b,ins,imm);



output reg[31:0] c;

input [31:0] a;

input [31:0] b;
input [15:0] imm;

input [5:0] ins;

always@(*)
begin
case(ins)
6'b100001:c<=a+b;
6'b100011:c<=a-b;
6'b100000:c<=a+b;
6'b100100:c<=a&b;
6'b100101:c<=a|b;
6'b101010:
begin
if(a[31]>=1&&b[31]<1)
	c<=1;
else if(a[31]<1&&b[31]>=1)
	c<=0;
else c<=(a<b);
end

6'b001000:c<=a+b;
6'b001001:c<=a+b;
6'b001100:c<=a&b;
6'b001101:c<=a|b;
6'b001111:c<={imm,{16{1'b0}}};

endcase
end

endmodule

ext.v

module ext(ext_in,s_ext,ext_out);

input [15:0] ext_in;
input s_ext;
output [31:0] ext_out;

assign ext_out=(!s_ext)?{{16{ext_in[15]}},ext_in}:{{16{1'b0}},ext_in};

endmodule

gpr.v

module gpr(a,b,clock,reg_write,num_write,rs,rt,data_write);



output [31:0] a;  

output [31:0] b;

input clock;

input reg_write;

input [4:0] rs; //read reg1

input [4:0] rt; //read reg2

input [4:0] num_write; //write reg

input [31:0] data_write; //write data



reg [31:0] gp_registers[31:0];  //32* reg

always@(posedge clock)

begin

if(reg_write)

gp_registers[num_write]<=data_write;


end

assign a=(rs==5'b0)?32'b0:gp_registers[rs];

assign b=(rt==5'b0)?32'b0:gp_registers[rt];

endmodule

im.v

module im(instruction,pc);

output [31:0] instruction;

input [31:0] pc;

reg [31:0] ins_memory[1023:0]; 

assign instruction[31:0]=ins_memory[pc[11:0]>>2];

endmodule

mux.v

module mux(mux_a,mux_b,mux_op,mux_out);

input [31:0]mux_a;
input [31:0]mux_b;
input mux_op;
output[31:0]mux_out;

assign mux_out=mux_op?mux_b:mux_a;

endmodule

pc.v

module pc(pc,clock,reset,npc);



output reg[31:0] pc;

input clock;

input reset;

input [31:0] npc;

always@(posedge clock, negedge reset)

begin 

if(!reset)pc<=32'h00003000;
else
pc<=npc;

end

endmodule

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 西北工业大学计算机操作系统实验os42022是西北工业大学计算机科学与技术专业的一门实验课程。该课程旨在帮助学生深入了解计算机操作系统的基本原理和概念,并通过实际操作和实验,培养学生的操作系统开发和研究能力。 在这门实验课程中,学生将学习并实践操作系统的相关知识,包括进程管理、内存管理、文件系统、设备管理等方面。学生将通过实验学习和理解操作系统的核心概念和算法,比如进程调度算法、内存分配算法、文件系统的设计等。在具体的实验中,学生将通过编写和调试代码来实现一个简单的操作系统,并通过实验数据分析和实验报告来评估实验结果及其性能。 通过完成计算机操作系统实验,学生将获得以下收益: 1. 深入理解计算机操作系统的基本原理和概念,为进一步的学习和研究打下扎实的基础。 2. 锻炼编程和调试能力,提高代码实现和系统设计的技巧。 3. 培养团队合作意识和沟通能力,在实践中学会与他人合作解决问题。 4. 提高问题解决能力和独立思考能力,在实验过程中自主分析和解决问题。 总之,西北工业大学计算机操作系统实验os42022是一个重要的实践课程,通过该课程的学习和实践,学生可以加深对操作系统的理解和应用,并提高自己的操作系统开发和研究能力。 ### 回答2: 西北工业大学计算机操作系统实验OS42022是一门重要的计算机科学课程。该实验旨在让学生深入了解计算机操作系统的基本概念、原理和实践技能。 在这门实验中,学生将学习如何设计、实现和调试一个简单的操作系统。他们将有机会编写汇编语言程序,并在操作系统环境下运行和调试这些程序。通过实践,学生将掌握操作系统内核的基本数据结构和算法,学习处理进程管理、内存管理、文件系统和输入输出等操作系统关键组成部分的技术和技巧。 此外,该实验还引导学生学习操作系统的设计和实现过程中需要注意的性能和安全问题。学生将学会如何优化操作系统的性能,防止死锁和其他常见错误,并研究和实施一些常用的安全保护措施。 在实验过程中,学生将通过小组合作来完成一系列编程任务和实验项目。他们将和其他成员合作,讨论和解决困难,提高解决问题的能力和团队合作精神。 最后,通过这门实验学习,学生将具备设计和实现一个简单操作系统的能力,为将来更深入的操作系统研究和开发奠定基础。此外,他们还将获得丰富的编程经验和操作系统底层知识,为他们的职业发展和进修提供有力支持。 总而言之,西北工业大学计算机操作系统实验OS42022是一门具有挑战性和实践性的课程,通过该课程的学习,学生将获得操作系统设计和实现的核心知识和技能,并为他们的职业发展和学术研究打下坚实基础。 ### 回答3: 西北工业大学计算机操作系统实验OS42022是该校计算机科学与技术专业的一门实验课程,其主要内容是教授学生有关操作系统的基本原理和实践应用。这门实验课程具体包括以下几个方面的内容。 首先,学生将学习操作系统的基本概念和主要组成部分。他们将了解操作系统的功能、种类和特点,以及有关作业调度、进程管理、内存管理和文件系统管理的基本知识。 其次,学生将学习和使用Linux操作系统作为实验平台。他们将了解Linux操作系统的基本原理和命令,以及如何使用Linux进行操作系统实验。 第三,学生将进行一系列的实验项目,以加深他们对操作系统的理解和实践能力。例如,他们将实现一个简单的作业调度算法,设计和实现一个进程管理系统,开发一个内存管理方案,以及构建一个简单的文件系统。 最后,学生将进行实验报告的撰写和展示。他们将通过撰写实验报告来总结实验过程中的关键问题和思考,以及实验结果和成果。 通过参加西北工业大学计算机操作系统实验OS42022,学生将能够深入理解操作系统的原理和实践,提高他们的编程和问题解决能力。这将为他们今后在计算机领域的工作和研究打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值