计算机组成原理实验报告.docx
- 文档编号:3522626
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:44
- 大小:446.87KB
计算机组成原理实验报告.docx
《计算机组成原理实验报告.docx》由会员分享,可在线阅读,更多相关《计算机组成原理实验报告.docx(44页珍藏版)》请在冰豆网上搜索。
计算机组成原理实验报告
北京科技大学计算机与通信工程学院
实验报告
实验名称:
计算机组成原理实验
学生姓名:
专业:
计算机科学与技术
班级:
学号:
指导教师:
张晓彤/刘宏岚张磊
实验成绩:
________________________________
实验地点:
机电楼304
实验时间:
2017年5月16日
一、实验目的与实验要求
1、实验目的
本实验要求学生运用EDA技术,采用系统能力培养指定的实践平台(XilinxVivado设计工具、XilinxEGO1实验平台),自己设计一些基本的计算机组成原理电路单元,进一步加深对组成原理中重要部件原理的理解。
学会运用XSIM仿真或下载到板来验证自己的设计。
2、实验要求
1)由于在有限的实验课内学时难以较好完成所有实验内容,因此要求在实验课前进行预习,自主完成部分实验或实验的部分内容(包括代码设计);
2)完成的每个实验需要在实验课内经指导教师现场检查、查看编写的程序代码以及测试运行情况,回答指导教师提出的问题,以确认实验实际完成的质量;
3)代码应有适当的注释,并在实验报告中体现;仿真实现的设计需要有仿真波形截图。
二、实验设备(环境)及要求
XilinxEgo1实验平台。
OS:
Win764位
Software:
Vivado15.4开发工具
三、实验内容、步骤与结果分析
1实验132位寄存器和寄存器堆的设计
1.1实验内容
用Vivado软件和VerilogHDL或VHDL语言设计实现32位寄存器堆,要求:
支持32位寄存器地址选择;
支持写入任意32位值;
支持读取寄存器的值。
如图1-1所示,实现圆圈内所示电路。
输入输出变量名字尽量与图示保持一致。
图1-1
1.2主要步骤
1.2.1分析实现的方法
写有效信号,WriteEnable有效时寄存器才能被写入,读取的寄存器的地址,写寄存器的地址,写寄存器数据,Ra所对应寄存器的数据,只要有Ra的输入即输出相应数据,Rb所对应寄存器的数据,只要有Rb的输入即输出相应数据,wa选通的寄存器编号传递给该寄存器,数据传递,将对应寄存器的数据传递给数据选择器
1.2.2实现代码和仿真代码(如用代码仿真增加此项)
源代码:
Top模块:
moduleregfile(
inputclk,//寄存器组时钟信号,下降沿写入数据
inputrst,//reset信号,reset有效时全部寄存器置零
inputWriteEnable,//写有效信号,WriteEnable有效时寄存器才能被写入
input[4:
0]Ra,//所需读取的寄存器的地址
input[4:
0]Rb,//所需读取的寄存器的地址
input[4:
0]Rw,//写寄存器的地址
input[31:
0]busW,//写寄存器数据
output[31:
0]busA,//Ra所对应寄存器的数据,只要有Ra的输入即输出相应数据
output[31:
0]busB//Rb所对应寄存器的数据,只要有Rb的输入即输出相应数据
);
wire[31:
0]reg_wens;//选通信号传递,将wa选通的寄存器编号传递给该寄存器
wire[31:
0]sel[31:
0];//数据传递,将对应寄存器的数据传递给数据选择器
assignsel[0]=0;
decoderdecd(.ena(WriteEnable),.data_in(Rw),.data_out(reg_wens));
myregreg0(.clk(clk),.rst(rst),.wen(reg_wens[0]),.data_in(busW),.data_out(sel[0]));
myregreg1(.clk(clk),.rst(rst),.wen(reg_wens[1]),.data_in(busW),.data_out(sel[1]));
myregreg2(.clk(clk),.rst(rst),.wen(reg_wens[2]),.data_in(busW),.data_out(sel[2]));
myregreg3(.clk(clk),.rst(rst),.wen(reg_wens[3]),.data_in(busW),.data_out(sel[3]));
myregreg4(.clk(clk),.rst(rst),.wen(reg_wens[4]),.data_in(busW),.data_out(sel[4]));
myregreg5(.clk(clk),.rst(rst),.wen(reg_wens[5]),.data_in(busW),.data_out(sel[5]));
myregreg6(.clk(clk),.rst(rst),.wen(reg_wens[6]),.data_in(busW),.data_out(sel[6]));
myregreg7(.clk(clk),.rst(rst),.wen(reg_wens[7]),.data_in(busW),.data_out(sel[7]));
myregreg8(.clk(clk),.rst(rst),.wen(reg_wens[8]),.data_in(busW),.data_out(sel[8]));
myregreg9(.clk(clk),.rst(rst),.wen(reg_wens[9]),.data_in(busW),.data_out(sel[9]));
myregreg10(.clk(clk),.rst(rst),.wen(reg_wens[10]),.data_in(busW),.data_out(sel[10]));
myregreg11(.clk(clk),.rst(rst),.wen(reg_wens[11]),.data_in(busW),.data_out(sel[11]));
myregreg13(.clk(clk),.rst(rst),.wen(reg_wens[13]),.data_in(busW),.data_out(sel[13]));
myregreg14(.clk(clk),.rst(rst),.wen(reg_wens[14]),.data_in(busW),.data_out(sel[14]));
myregreg15(.clk(clk),.rst(rst),.wen(reg_wens[15]),.data_in(busW),.data_out(sel[15]));
myregreg16(.clk(clk),.rst(rst),.wen(reg_wens[16]),.data_in(busW),.data_out(sel[16]));
myregreg17(.clk(clk),.rst(rst),.wen(reg_wens[17]),.data_in(busW),.data_out(sel[17]));
myregreg18(.clk(clk),.rst(rst),.wen(reg_wens[18]),.data_in(busW),.data_out(sel[18]));
myregreg19(.clk(clk),.rst(rst),.wen(reg_wens[19]),.data_in(busW),.data_out(sel[19]));
myregreg20(.clk(clk),.rst(rst),.wen(reg_wens[20]),.data_in(busW),.data_out(sel[20]));
myregreg21(.clk(clk),.rst(rst),.wen(reg_wens[21]),.data_in(busW),.data_out(sel[21]));
myregreg22(.clk(clk),.rst(rst),.wen(reg_wens[22]),.data_in(busW),.data_out(sel[22]));
myregreg23(.clk(clk),.rst(rst),.wen(reg_wens[23]),.data_in(busW),.data_out(sel[23]));
myregreg24(.clk(clk),.rst(rst),.wen(reg_wens[24]),.data_in(busW),.data_out(sel[24]));
myregreg25(.clk(clk),.rst(rst),.wen(reg_wens[25]),.data_in(busW),.data_out(sel[25]));
myregreg26(.clk(clk),.rst(rst),.wen(reg_wens[26]),.data_in(busW),.data_out(sel[26]));
myregreg27(.clk(clk),.rst(rst),.wen(reg_wens[27]),.data_in(busW),.data_out(sel[27]));
myregreg28(.clk(clk),.rst(rst),.wen(reg_wens[28]),.data_in(busW),.data_out(sel[28]));
myregreg29(.clk(clk),.rst(rst),.wen(reg_wens[29]),.data_in(busW),.data_out(sel[29]));
myregreg30(.clk(clk),.rst(rst),.wen(reg_wens[30]),.data_in(busW),.data_out(sel[30]));
myregreg31(.clk(clk),.rst(rst),.wen(reg_wens[31]),.data_in(busW),.data_out(sel[31]));
mux32muxA(.choice(Ra),.data1(sel[0]),.data2(sel[1]),.data3(sel[2]),.data4(sel[3]),.data5(sel[4]),.data6(sel[5]),.data7(sel[6]),.data8(sel[7]),.data9(sel[8]),.data10(sel[9]),.data11(sel[10]),.data12(sel[11]),.data13(sel[12]),.data14(sel[13]),.data15(sel[14]),.data16(sel[15]),.data17(sel[16]),.data18(sel[17]),.data19(sel[18]),.data20(sel[19]),.data21(sel[20]),.data22(sel[21]),.data23(sel[22]),.data24(sel[23]),.data25(sel[24]),.data26(sel[25]),.data27(sel[26]),.data28(sel[27]),.data29(sel[28]),.data30(sel[29]),.data31(sel[30]),.data32(sel[31]),.out(busA));
mux32muxB(.choice(Rb),.data1(sel[0]),.data2(sel[1]),.data3(sel[2]),.data4(sel[3]),.data5(sel[4]),.data6(sel[5]),.data7(sel[6]),.data8(sel[7]),.data9(sel[8]),.data10(sel[9]),.data11(sel[10]),.data12(sel[11]),.data13(sel[12]),.data14(sel[13]),.data15(sel[14]),.data16(sel[15]),.data17(sel[16]),.data18(sel[17]),.data19(sel[18]),.data20(sel[19]),.data21(sel[20]),.data22(sel[21]),.data23(sel[22]),.data24(sel[23]),.data25(sel[24]),.data26(sel[25]),.data27(sel[26]),.data28(sel[27]),.data29(sel[28]),.data30(sel[29]),.data31(sel[30]),.data32(sel[31]),.out(busB));
endmodule
译码器(decoder)模块:
moduledecoder(input[4:
0]data_in,inputena,output[31:
0]data_out);//译码器,将wa信号进行译码,再传递给相应寄存器
reg[31:
0]data_temp;
assigndata_out=~data_temp;
always@(enaordata_in)
begin
if(ena==1)
case(data_in)
5'b00000:
data_temp=32'b11111111111111111111111111111110;
5'b00001:
data_temp=32'b11111111111111111111111111111101;
5'b00010:
data_temp=32'b11111111111111111111111111111011;
5'b00011:
data_temp=32'b11111111111111111111111111110111;
5'b00100:
data_temp=32'b11111111111111111111111111101111;
5'b00101:
data_temp=32'b11111111111111111111111111011111;
5'b00110:
data_temp=32'b11111111111111111111111110111111;
5'b00111:
data_temp=32'b11111111111111111111111101111111;
5'b01000:
data_temp=32'b11111111111111111111111011111111;
5'b01001:
data_temp=32'b11111111111111111111110111111111;
5'b01010:
data_temp=32'b11111111111111111111101111111111;
5'b01011:
data_temp=32'b11111111111111111111011111111111;
5'b01100:
data_temp=32'b11111111111111111110111111111111;
5'b01101:
data_temp=32'b11111111111111111101111111111111;
5'b01110:
data_temp=32'b11111111111111111011111111111111;
5'b01111:
data_temp=32'b11111111111111110111111111111111;
5'b10001:
data_temp=32'b11111111111111011111111111111111;
5'b10010:
data_temp=32'b11111111111110111111111111111111;
5'b10011:
data_temp=32'b11111111111101111111111111111111;
5'b10100:
data_temp=32'b11111111111011111111111111111111;
5'b10101:
data_temp=32'b11111111110111111111111111111111;
5'b10110:
data_temp=32'b11111111101111111111111111111111;
5'b10111:
data_temp=32'b11111111011111111111111111111111;
5'b11000:
data_temp=32'b11111110111111111111111111111111;
5'b11001:
data_temp=32'b11111101111111111111111111111111;
5'b11010:
data_temp=32'b11111011111111111111111111111111;
5'b11011:
data_temp=32'b11110111111111111111111111111111;
5'b11100:
data_temp=32'b11101111111111111111111111111111;
5'b11101:
data_temp=32'b11011111111111111111111111111111;
5'b11110:
data_temp=32'b10111111111111111111111111111111;
5'b11111:
data_temp=32'b01111111111111111111111111111111;
endcase
else
data_temp=32'b11111111111111111111111111111111;
end
endmodule
寄存器(reg)模块(32个32位寄存器):
modulemyreg(inputclk,inputrst,inputwen,input[31:
0]data_in,outputreg[31:
0]data_out);//寄存器,上升沿触发,储存数据
always@(posedgeclk)
begin
if(rst==1)
data_out=0;
else
begin
if(wen==1)
data_out=data_in;
else
data_out=data_out;
end
end
endmodule
数选器模块(2个32位5线-32线数据选择器):
modulemux32(//32位5线-32线数据选择器
input[4:
0]choice,
input[31:
0]data1,
input[31:
0]data2,
input[31:
0]data3,
input[31:
0]data4,
input[31:
0]data5,
input[31:
0]data6,
input[31:
0]data7,
input[31:
0]data8,
input[31:
0]data9,
input[31:
0]data10,
input[31:
0]data11,
input[31:
0]data12,
input[31:
0]data13,
input[31:
0]data14,
input[31:
0]data15,
input[31:
0]data16,
input[31:
0]data17,
input[31:
0]data18,
input[31:
0]data19,
input[31:
0]data20,
input[31:
0]data21,
input[31:
0]data22,
input[31:
0]data23,
input[31:
0]data24,
input[31:
0]data25,
input[31:
0]data26,
input[31:
0]data27,
input[31:
0]data28,
input[31:
0]data29,
input[31:
0]data30,
input[31:
0]data31,
input[31:
0]data32
output[31:
0]out
);
reg[31:
0]dataout;
assignout=dataout;
always@(*)
begin
case(choice)
5'b00000:
dataout=data1;
5'b00001:
dataout=data2;
5'b00010:
dataout=data3;
5'b00011:
dataout=data4;
5'b00100:
dataout=data5;
5'b00101:
dataout=data6;
5'b00110:
dataout=data7;
5'b00111:
dataout=data8;
5'b01000:
dataout=data9;
5'b01001:
dataout=data10;
5'b01010:
dataout=data11;
5'b01011:
dataout=data12;
5'b01100:
dataout=data13;
5'b01101:
dataout=data14;
5'b01110:
dataout=data15;
5'b01111:
dataout=data16;
5'b10000:
dataout=data17;
5'b10001:
dataout=data18;
5'b10010:
dataout=data19;
5'b10011:
dataout=data20;
5'b10100:
dataout=data21;
5'b10101:
dataout=data22;
5'b10110:
dataout=data23;
5'b10111:
dataout=data24;
5'b11000:
dataout=data25;
5'b11001:
dataout=data26;
5'b11010:
dataout=data27;
5'b11011:
dataout=data28;
5'b11100:
dataout=data29;
5'b11101:
dataout=data30;
5'b11110:
dataout=data31;
5'b11111:
dataout=data32;
endcase
end
endmodule
modulemux2(//32位2选一数据选择器
inputchoice,
input[31:
0]data1,//choice为0
input[31:
0]data2,//choice为1
output[31:
0]out
);
reg[31:
0]dataout;
assignout=dataout;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 组成 原理 实验 报告