西南交大计算机组成原理实验八:指令的分析与执行

计算机组成原理实验八:指令的分析与执行

本实验在实验七的基础上进行指令的分析与执行的实现。掌握指令周期、CPU周期等概念,理解指令的分析与执行过程。学习状态机的使用,为课程设计奠定基础。本实验用verilog语言进行编程。

使用软件:Quartus II 13.0sp1
实验内容详见使用指导书
有两种指令的操作码op分别为0111和1000分别表示XOR(异或)和Shr(移位)在这里插入图片描述
图为实验内容,我们将进行状态机的设计在第一个时钟周期从ROM中取出指令,在第二个时钟周期取出寄存器中的操作数,在第三个时钟周期进行运算,对于单操作数和多操作数的,为简化状态机的设计,在这里统一为在三个时钟周期完成所有步骤。
本实验通过分模块设计并用顶层原理图的方式进行各模块之间的连接,本实验分为cpu模块,ROM模块和七段数码管的动态扫描显示模块
实验重点主要在于模拟计算机内部取指令并执行的过程,CPU内部是单总线结构,所以注意在时钟的上升沿到来之时执行操作,在时钟的下降沿到来之时切换周期。
同时看清楚实验内容中Rx,Ry,Rz与R1,R2,R3,R4的对应关系,例如指令的助记符XOR Rz,Rx,Ry 的操作内容应该为
Rz<–(Rx)XOR(Ry)
即将Rx与Ry异或的结果存入Rz中。
接下来开始实验的代码部分

module cpu_module(clk,reset,w,k,M,IR,PC_IN,PC,inR,command);
input clk,reset,w,k;
input [1:0]M;
input [7:0]PC_IN;
input [7:0]inR;
input [15:0]command;
output reg[31:0]IR;
output reg[7:0]PC;
reg [7:0]R1;
reg [7:0]R2;
reg [7:0]R3;
reg [7:0]R4;
reg [1:0]Rx;
reg [1:0]Ry;
reg [1:0]Rz;
reg [3:0]op;
reg [7:0]CZ;
reg [7:0]CY;
reg [7:0]CX;
reg[71:0] l;
reg [1:0]state;
reg clk_freq;
always @(posedge clk)
begin
	if(l==71'b11111111111111111)
	begin
		l=71'b0; 
		clk_freq=~clk_freq;
	end
	else
		l=l+1;
end

always @(posedge clk_freq ,negedge reset)
begin 
if(!reset)
PC=8'b00000000;
else
begin
begin
if(k==0)
begin
case(M)
2'b00:R1=inR;
2'b01:R2=inR;
2'b10:R3=inR;
2'b11:R4=inR;
endcase
end
else if(k==1)
begin
if(state==2'b00)
begin

if(w==1)
PC=PC_IN[7:0];
else
 begin
 if(PC==2'b11)
    PC=2'b01;
   else
	 PC=PC+1;
end
end

end


else if(state==2'b01)
begin
begin
op=command[15:12];
Rx=command[11:10];
Ry=command[9:8];
Rz=command[7:6];  
end               
   case(Rx)
		2'b00: CX=R1;
		2'b01: CX=R2;
		2'b10: CX=R3;
		2'b11: CX=R4;
	endcase
  case(Ry)
		2'b00: CY=R1;
		2'b01: CY=R2;
		2'b10: CY=R3;
		2'b11: CY=R4;
	endcase
  case(Rz)
		2'b00: CZ=R1;
		2'b01: CZ=R2;
		2'b10: CZ=R3;
		2'b11: CZ=R4;
	endcase
	
end
else if(state==2'b10)
begin 

if(op==4'b0111)
CZ=CX^CY;
else if(op==4'b1000)
CY={1'b0,CX[7:1]};

case(Rx)
		2'b00: R1=CX;
		2'b01: R2=CX;
		2'b10: R3=CX;
		2'b11: R4=CX;
	endcase
case(Ry)
		2'b00: R1=CY;
		2'b01: R2=CY;
		2'b10: R3=CY;
		2'b11: R4=CY;
	endcase
case(Rz)
		2'b00: R1=CZ;
		2'b01: R2=CZ;
		2'b10: R3=CZ;
		2'b11: R4=CZ;
	endcase

end
end
end
IR[31:28]=R1[7:4];
IR[27:24]=R1[3:0];
IR[23:20]=R2[7:4];
IR[19:16]=R2[3:0];
IR[15:12]=R3[7:4];
IR[11:8]=R3[3:0];
IR[7:4]=R4[7:4];
IR[3:0]=R4[3:0];
end



always@(negedge clk_freq)
begin

if(state==2'b00)
state=2'b01;
else if(state==2'b01)
state=2'b10;
else if(state==2'b10)
state=2'b00;

end


endmodule 

以下为动态扫描七段译码模块,实验室实验箱用的是共阴极数码管

module opshow_unit(IR,clk,sel,led);

input [31:0]IR;

output reg [2:0] sel;
output reg[7:0] led;
reg [3:0]data;
input clk;
always @(posedge clk)
begin
	sel=sel+1;
	if(sel>8)
		sel=0;
	case(sel)
		3'd0: data=IR[31:28];
		3'd1: data=IR[27:24];
		3'd2: data=IR[23:20];
		3'd3: data=IR[19:16];
		3'd4: data=IR[15:12];
		3'd5: data=IR[11:8];
		3'd6: data=IR[7:4];
		3'd7: data=IR[3:0];
	endcase
	case(data)
			4'h0: led=8'h3F;
			4'h1: led=8'h06;
			4'h2: led=8'h5B;
			4'h3: led=8'h4F;
			4'h4: led=8'h66;
			4'h5: led=8'h6D;
			4'h6: led=8'h7D;
			4'h7: led=8'h07;
			4'h8: led=8'h7F;
			4'h9: led=8'h6F;
			4'hA: led=8'h77;
			4'hB: led=8'h7C;
			4'hC: led=8'h39;
			4'hD: led=8'h5E;
			4'hE: led=8'h79;
			4'hF: led=8'h71;
			default: led=8'h3F;
	endcase
end
endmodule

在这里插入图片描述
模块创建完毕后点击模块的右键创建对应器件,再创建一个顶层原理图将刚才创建的器件添加即可,对于ROM的创建,我们先创建一个对应的mif文件
在这里插入图片描述
图为在Quartus II13.0中的创建方法,之后再ROM中添加对应指令,本次实验的三条指令如下
在这里插入图片描述
对应的指令应该为7600H 8300H 7340H
所以在mif文件的对应地址处写入这三条指令即可

在这里插入图片描述
其他地址的指令不用管,只用管地址1-3的指令就可以了
之后创建ROM并绑定该mif文件
点击tools工具栏再点击下图中选项
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实验书要求256x16

在这里插入图片描述
在这里插入图片描述
点击浏览选择对应的mif文件,注意mif文件好像不能绑定多次,不然会出现一些小bug,之后完成即可,在将创建的ROM添加到顶层原理图中连接
这里放一张顶层原理图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
引脚分配表,实验用芯片为Cyclone III EP3C40F780C8

如有不足之处请指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值