杭电计组实验4-寄存器堆设计实验.doc
《杭电计组实验4-寄存器堆设计实验.doc》由会员分享,可在线阅读,更多相关《杭电计组实验4-寄存器堆设计实验.doc(6页珍藏版)》请在冰豆网上搜索。
杭州电子科技大学计算机学院
实验报告
实验项目:
课程名称:
计算机组成原理与系统结构设计
姓名:
学号:
同组姓名:
学号:
实验位置(机号):
实验日期:
指导教师:
实验内容(算法、程序、步骤和方法)
一、实验目的
(1)学会使用VerilogHDL进行时序电路的设计方法。
(2)掌握灵活应用VerilogHDL进行各种描述与建模的技巧和方法。
(3)学习寄存器堆的数据传送与读/写工作原理,掌握寄存器堆得设计方法。
二、实验仪器
ISE工具软件
三、步骤、方法
(1)启动XilinxISE软件,选择File->NewProject,输入工程名shiyan2,默认选择后,点击Next按钮,确认工程信息后点击Finish按钮,创建一个完整的工程。
(2)在工程管理区的任意位置右击,选择NewSource命令。
弹出NewSourceWizard对话框,选择VerilogModule,并输入Verilog文件名,点击Next按钮进入下一步,点击Finish完成创建。
(3)编辑程序源代码,然后编译,综合;选择Synthesize--XST项中的CheckSyntax右击选择Run命令,并查看RTL视图;如果编译出错,则需要修改程序代码,直至正确。
(4)在工程管理区将View类型设置成Simulation,在任意位置右击,选择NewSource命令,选择VerilogTestFixture选项。
点击Next,点击Finish,完成。
编写激励代码,观察仿真波形,如果验证逻辑有误,则修改代码,重新编译,仿真,直至正确。
(5)由于实验四并未链接实验板,所以后面的链接实验板的步骤此处没有。
操作过程及结果
一,操作过程
实验过程和描述:
moduleshiyan4(R_Addr_A,R_Addr_B,Clk,W_Addr,W_Data,R_Data_A,R_Data_B,Reset,Write_reg);
inputClk,Reset;
inputwireWrite_reg;
inputwire[4:
0]R_Addr_A;
inputwire[4:
0]W_Addr;
inputwire[4:
0]R_Addr_B;
inputwire[32:
0]W_Data;
reg[31:
0]REG_Files[31:
0];
outputwire[0:
31]R_Data_A;
outputwire[0:
31]R_Data_B;
integeri=0;
always@(posedgeClkorposedgeReset)
begin
if(Reset)
begin
for(i=0;i<=31;i=i+1)
REG_Files[i]<=32'b0;
end
else
begin
if(Write_reg)REG_Files[W_Addr]<=W_Data;
end
end
assignR_Data_A=REG_Files[R_Addr_A];
assignR_Data_B=REG_Files[R_Addr_B];
endmodule
仿真代码
moduleshiyan4_test;
//Inputs
reg[4:
0]R_Addr_A;
reg[4:
0]R_Addr_B;
regClk;
reg[4:
0]W_Addr;
reg[32:
0]W_Data;
regReset;
regWrite_reg;
//Outputs
wire[0:
31]R_Data_A;
wire[0:
31]R_Data_B;
//InstantiatetheUnitUnderTest(UUT)
shiyan4uut(
.R_Addr_A(R_Addr_A),
.R_Addr_B(R_Addr_B),
.Clk(Clk),
.W_Addr(W_Addr),
.W_Data(W_Data),
.R_Data_A(R_Data_A),
.R_Data_B(R_Data_B),
.Reset(Reset),
.Write_reg(Write_reg)
);
initialbegin
//InitializeInputs
R_Addr_A=0;
R_Addr_B=0;
Clk=0;
W_Addr=0;
W_Data=0;
Reset=0;
Write_reg=0;
//Wait100nsforglobalresettofinish
#100;
//Addstimulushere
#100;
Clk=1;
Reset=0;
R_Addr_A=0;
R_Addr_B=0;
W_Addr=5'b00001;
Write_reg=1;
W_Data=32'h1111_1111;
#100;
Clk=0;
Reset=0;
R_Addr_A=0;
R_Addr_B=0;
W_Addr=5'b00001;
Write_reg=1;
W_Data=32'h1111_1111;
#100;
Clk=1;
Reset=0;
R_Addr_A=0;
R_Addr_B=0;
W_Addr=5'b00010;
Write_reg=1;
W_Data=32'h2222_2222;
#100;
Clk=0;
Reset=0;
R_Addr_A=5'b00001;
R_Addr_B=5'b00010;
W_Addr=0;
Write_reg=0;
W_Data=0;
#100;
Clk=0;
Reset=1;
R_Addr_A=5'b00001;
R_Addr_B=5'b00010;
W_Addr=0;
Write_reg=0;
W_Data=0;
end
endmodule
RTL图
二、结果
思考题:
(1)根据8个寄存器执行读、写操作,实验结果符合预期
(2)always@(posedgeClkorposedgeReset)
begin
if(Reset)
begin
for(i=0;i<=31;i=i+1)
REG_Files[i]<=32'b0;
end
else
begin
if(Write_reg)begin
if(W_Addr>3’b000)REG_Files[W_Addr]<=W_Data;end
end
end
assignR_Data_A=REG_Files[R_Addr_A];
assignR_Data_B=REG_Files[R_Addr_B];
(3)读操作没有使能或者时钟信号控制,是组合逻辑电路,只要给出寄存器地址,即可独处寄存器中的数据。
所有写入操作的输入信号(包括写寄存器地址W_Addr、写入数据W_Data、写控制信号Write_Reg)必须在时钟边沿来临时已经有效。
实验体会
在这个寄存器堆设计实验中,这个实验理解起来稍微有点困难,起初已经写好了代码,进行了仿真,出现了波形。
但是后来老师要求读操作和写操作输出不同的数据,在不同的单元。
于是我就把仿真代码改了一下,将W_Data,W_Addr等数据做了修改。
这个实验也就成功了。
通过做这个寄存器堆设计实验,我对寄存器堆得读操作和写操作有了一个认识和理解。
也对ISE这个软件的运用更加熟练了,对寄存器堆这个概念也有了更深层次的理解,增长了我的知识,强化了我的实践能力以及思考能力。
这次实验收获很大。
指导教师评议
实验步骤写的时候,最好自己按照所做步骤写,二人不要一模一样。
成绩:
指导教师签名: