杭电计组实验
杭电计算机组成原理全加器设计实验-参考模板
实验报告
课程名称:计算机组成原理
实验项目:全加器设计实验
指导教师:
实验位置:
姓 名:
班 级
学 号
日 期:2015年4月15日
实验目的
(1)学习ISE工具软件的使用及仿真方法。
(2)学习FPGA程序的下载方法。
(3)熟悉Nexys3实验板。
(4)掌握运用Verilog HDL进行结构描述与建模的技术和方法。
指导教师
评议
成绩评定: 指导教师签名:
---精心整理,希望对您有所帮助
endmodule
(接上)
实验内容(算法、程序、步骤和方法)
数据记录和计算
软件方程结果
硬件测试结果:
A
B
Ci
F
Co
0
0
0
0
0
0
0
1
1
0
0
1
0
1
0
0
1
1
0
1
1
0
0
1
0
1
0
1
0
1
1
1
0
0
1
1
1
1
1
1
结论(结果)
经过实验,所设计的全加器输出的结果正确复合逻辑
试验心得与小结
学习了门级元件的使用,而且使用的是结构化建模,而不是行为建模,又是一次提高。
.F(F),
.Co(Co)
);
initial begin
// Initialize Inputs
A = 0;B = 0;Ci = 0;
// Wait 100 ns for global reset to finish
杭电计组实验3-多功能ALU设计实验
杭电计组实验3-多功能ALU设计实验杭州电子科技大学计算机学院实验报告实验项目:课程名称:计算机组成原理与系统结构课程设计姓名: 学号: 同组姓名: 学号: 实验位置(机号):实验日期: 指导教师:一、实验目的(1)学习多功能ALU的工作原理,掌握运算器的设计方法。
(2)掌握运用Verilog HDL进行数据流描述与建模的技巧和方法,掌握运算器的设计方法。
二、实验仪器实验 ISE工具软件内容三、步骤、方法(算(1)启动Xilinx ISE软件,选择File->New Project,输入工程名shiyan2,默认选择后,点法、击Next按钮,确认工程信息后点击Finish按钮,创建一个完整的工程。
程(2)在工程管理区的任意位置右击,选择New Source命令。
弹出New Source Wizard对序、话框,选择Verilog Module,并输入Verilog 文件名shiyan3,点击Next按钮进入下一步,点步骤击Finish完成创建。
和方(3)编辑程序源代码,然后编译,综合;选择Synthesize--XST项中的Check Syntax右击法) 选择Run命令,并查看RTL视图;如果编译出错,则需要修改程序代码,直至正确。
(4)在工程管理区将View类型设置成Simulation,在任意位置右击,选择New Source命令,选择Verilog Test Fixture选项,输入实验名shiyan3_test。
点击Next,点击Finish,完成。
编写激励代码,观察仿真波形,如果验证逻辑有误,则修改代码,重新编译,仿真,直至正确。
(5)由于实验三并未链接实验板,所以后面的链接实验板的步骤此处没有。
一,操作过程实验过程和描述:module shiyan3(ALU_OP,AB_SW,OF,ZF,F);reg [31:0]A,B;input [2:0]ALU_OP;input [2:0]AB_SW;操作 wire OF;过程 reg ZF;及结reg [31:0]F;果 output OF;output ZF;output F;reg C32;always@(*)begincase(AB_SW)3'b000: begin A=32'h0000_0000; B=32'h0000_0000; end3'b001: begin A=32'h0000_0003; B=32'h0000_0607; end3'b010: begin A=32'h8000_0000; B=32'h8000_0000; end3'b011: begin A=32'h7FFF_FFFF; B=32'h7FFF_FFFF; end3'b100: begin A=32'hFFFF_FFFF; B=32'hFFFF_FFFF; end3'b101: begin A=32'h8000_0000; B=32'hFFFF_FFFF; end3'b110: begin A=32'hFFFF_FFFF; B=32'h8000_0000; end3'b111: begin A=32'h1234_5678; B=32'h3333_2222; enddefault: begin A=32'h9ABC_DEF0; B=32'h1111_2222; endendcaseendalways@(*)begincase(ALU_OP)3'b000: F<=A&B;3'b001: F<=A|B;3'b010: F<=A^B;3'b011: F<=A~^B;3'b100: {C32,F}<=A+B;3'b101: {C32,F}<=A-B;3'b110: begin if(A<B) F<=32'h0000_0001; else F<=32'h0000_0000; end 3'b111: begin F<=B<<A; enddefault: F<=32'h0000_0000;endcaseendalways@(*)beginif(F===32'h0000_0000)ZF<=1;elseZF<=0;endassign OF=C32^F[31]^A[31]^B[31]; endmodule仿真代码module shiyan3_test;// Inputsreg [2:0] ALU_OP;reg [2:0] AB_SW;// Outputswire OF;wire ZF;wire [31:0] F;// Instantiate the Unit Under Test (UUT) shiyan3 uut (.ALU_OP(ALU_OP),.AB_SW(AB_SW),.OF(OF),.ZF(ZF),.F(F));initial begin// Initialize InputsALU_OP = 0;AB_SW = 0;// Wait 100 ns for global reset to finish #100;// Add stimulus here #100;ALU_OP = 001;AB_SW = 001; #100;ALU_OP = 010;AB_SW = 010; #100;ALU_OP = 011;AB_SW = 011; #100;ALU_OP = 100;AB_SW = 100; #100;ALU_OP = 101;AB_SW = 101; #100;ALU_OP = 110;AB_SW = 110; #100;ALU_OP = 111;AB_SW = 111;end endmodule RTL图二、结果思考题:(2)经过分析,该ALU不能实现MIPS核心指令集的所有指令。
杭电计组实验四
0000_0003
$00011
7FFF_FFFF
7FFF_FFFF
$00111
7FFF_FFFF
7FFF_FFFF
$01111
0000_0000
0000_0000
$11111
000ቤተ መጻሕፍቲ ባይዱ_0003
0000_0003
$10000
7FFF_FFFF
7FFF_FFFF
$11000
7FFF_FFFF
input [4:0] W_Addr;
input [31:0] W_Data;
input Write_Reg;
input Clk;
input Reset;
output [31:0] R_Data_A;
output [31:0] R_Data_B;
integer i;
reg[31:0] REG_Files[31:0];//定义寄存器
实验报告
2016年4月22日成绩:
姓名
学号
班级
专业
信息安全
课程名称
《计算机组成原理课程设计》
任课老师
曾虹
指导老师
曾虹
机位号
实验序号
实验名称
寄存器堆
实验时间
2016、4、22
实验地点
1教南
实验设备号
一、实验程序源代码
module Reg(LED,RW_SW,AB,Reg_Addr_A,Reg_Addr_B,Write_Reg,clk,rst);
NET "Add[3]" LOC = "V8";
NET "Add[2]" LOC = "U8";
杭电计组实验-存储器设计实验
杭电计组实验-存储器设计实验————————————————————————————————作者:————————————————————————————————日期:实验报告2018 年 5 月 5 日成绩:姓名阳光男学号16041321 班级16052317专业计算机科学与技术课程名称《计算机组成原理与系统结构试验》任课老师张翔老师指导老师张翔老师机位号默认实验序号5实验名称《实验五存储器设计实验》实验时间2018/5/12实验地点1教211实验设备号个人电脑、Nexys3开发板一、实验程序源代码存储器顶层电路代码:module top_RAM_B(Mem_Addr,C,Mem_Write,Clk,LED);input [7:2]Mem_Addr;//开关的3、4、5、6、7、8位input Mem_Write,Clk;//clk为按键C9,读写使能信号为按键C4,0为读,1为写input [1:0]C;//选择写入数据+读操作时选择显示字节,为开关1、2位output reg [7:0]LED;wire [31:0]M_R_Data;//存在存储器里的32位读出数据reg [31:0]M_W_Data;//寄存在暂存器的32位写入数据RAM_B test_ram (.clka(Clk), //输入时钟信号.wea(Mem_Write), //输入读写信号.addra(Mem_Addr[7:2]), //输入5位地址信号.dina(M_W_Data), //写入32位数据.douta(M_R_Data) //读出32位数据);always@(*)beginLED=0;//初始化M_W_Data=0;//初始化if(!Mem_Write)//读操作begincase(C)2'b00:LED=M_R_Data[7:0];//读出数据的0-7位2'b01:LED=M_R_Data[15:8];//读出数据的8-15位2'b10:LED=M_R_Data[23:16];//读出数据的16-23位2'b11:LED=M_R_Data[31:24];//读出数据的24-31位endcaseendelsebegincase(C)2'b00:M_W_Data=32'h0055_7523;//写入第一个数据2'b01:M_W_Data=32'h1234_5678;//写入第二个数据2'b10:M_W_Data=32'h8765_4321;//写入第三个数据2'b11:M_W_Data=32'hffff_ffff;//写入第四个数据endcaseendendendmodule测试代码:module test;// Inputsreg clka;reg [0:0] wea;reg [5:0] addra;reg [31:0] dina;// Outputswire [31:0] douta;// Instantiate the Unit Under Test (UUT)RAM_B uut (.clka(clka),.wea(wea),.addra(addra),.dina(dina),.douta(douta));initial begin// Initialize Inputsclka = 0;wea = 0;addra = 0;dina = 0;// Wait 100 ns for global reset to finish #100;// Add stimulus hereclka = 1;wea = 0;addra = 6'b000001;dina = 32'h0000_0003;#100;clka = 0;wea = 0;addra = 6'b000001;dina = 32'h0000_0607;#100;clka = 1;wea = 1;addra = 6'b000001;dina = 32'hFFFF_FFFF;#100;clka = 0;wea = 1;addra = 6'b000001;dina = 32'hFFFF_FFFF;endendmodule二、仿真波形三、电路图顶层电路模块顶层电路内部结构:四、引脚配置(约束文件)NET "Clk" LOC = C9;NET "LED[4]" LOC = M11;NET "LED[3]" LOC = V15;NET "LED[2]" LOC = U15;NET "LED[1]" LOC = V16;NET "LED[0]" LOC = U16;NET "Mem_Addr[7]" LOC = U8;NET "Mem_Addr[6]" LOC = N8;NET "Mem_Addr[5]" LOC = M8;NET "Mem_Addr[4]" LOC = V9;NET "Mem_Addr[2]" LOC = T10;NET "Mem_Write" LOC = C4;NET "Mem_Addr[3]" LOC = T9;NET "C[1]" LOC = T5;NET "C[0]" LOC = V8;NET "LED[7]" LOC = T11;NET "LED[5]" LOC = N11;NET "LED[6]" LOC = R11;五、思考与探索(1)读操作实验结果记录表存储器地址初始化数据读出数据写入新数据读出数据5’b000000 32’b0000000032’b0000000032'h0055_752332'h0055_7523 5’b000001 32’b0000000132’b0000000132'h0055_752332'h0055_7523 5’b000002 32’b0000000232’b0000000232'h0055_752332'h0055_7523 5’b000003 32’b0000000332’b0000000332'h0055_752332'h0055_7523 5’b000004 32’b0000000432’b0000000432'h0055_752332'h0055_7523 5’b000005 32’b0000000532’b0000000532'h0055_752332'h0055_7523 5’b000006 32’b0000000632’b0000000632'h0055_752332'h0055_7523 5’b000007 32’b0000000732’b0000000732'h0055_752332'h0055_7523 (2)答:这些单元的数据已经被改写了。
杭电计组实验1-全加器设计实验
杭电计组实验1-全加器设计实验杭州电子科技大学计算机学院实验报告实验项目:实验1-全加器设计实验课程名称:计算机组成原理与系统结构课程设计姓名:学号:同组姓名:学号:实验位置(机号):自己的笔记本实验日期:指导教师:实验内容(算法、程序、步骤和方法)一、实验目的(1),学习ISE工具软件的使用及仿真方法(2)学习FPGA程序的下载方法(3)熟悉Nexys3实验板(4)掌握运用VerilogHDL进行结构描述与建模的技巧和方法(5)掌握二进制全加器的原理和设计方法二、实验仪器ISE工具软件三、步骤、方法(1)启动XilinxISE 软件,选择File-NewProject,输入工程名,默认选择后,点击Next按钮,确认工程信息后点击Finish按钮,创建一个完整的工程。
(2)在工程管理区的任意位置右击,选择NewSource命令。
弹出NewSourceWizard对话框,选择VerilogModule,并输入Verilog文件名shiyan1,点击Next按钮进入下一步,点击Finish完成创建。
(3)编辑程序源代码,然后编译,综合;选择Synthesize--XST项中的CheckSyntax右击选择Run命令,并查看RTL视图;如果编译出错,则需要修改程序代码,直至正确。
(4)在工程管理区将View类型设置成Simulation,在任意位置右击,选择NewSource命令,选择VerilogTestFixture选项。
输入文件名shiyan1_test,点击Next,点击Finish,完成。
编写激励代码,观察仿真波形,如果验证逻辑有误,则修改代码,重新编译,仿真,直至正确。
(5)由于实验一并未链接实验板,所以后面的链接实验板的步骤此处没有。
操作过程及结果一、操作过程实验过程和描述:moduleshiyan1(A,B,C,F,Ci);inputA,B,C;outputF,Ci;wireA,B,C,F,Ci;wi reS1,S2,S3;xorXU1(F,A,B,C),XU2(S1,A,B);andAU1(S2,A,B),AU2(S3,S1,C);or OU1(Ci,S2,S3);endmodule仿真代码moduleshiyan1_test;//InputsregA;regB;regC;//OutputswireF;wireCi;/ /InstantiatetheUnitUnderTest(UUT)shiyan1uut(.A(A),.B(B),.C(C),.F(F),. Ci(Ci));initialbegin//InitializeInputsA=0;B=0;C=0;//Wait100nsforgloba lresettofinish#100;//AddstimulushereA=0;B=0;C=0;#100A=0;B=0;C=1;#100A =0;B=1;C=0;#100A=0;B=1;C=1;#100A=1;B=0;C=0;#100A=1;B=0;C=1;#100A=1;B= 1;C=0;#100A=1;B=1;C=1;EndRTL图二、结果思考题:((1)根据查看顶层模块RTL的最外层的输入输出接口,和实验指导书式(14.1)所示电路相比,该电路图的输入输出引脚和这个加法器的引脚图式是相符合的。
杭电计算机组成原理寄存器堆设计实验
杭电计算机组成原理寄存器堆设计实验计算机组成原理是计算机科学与技术的基础课程之一,它涉及到计算机的基本组成部分和原理。
在这门课程中,学生通常需要进行一系列的实验来加深对计算机组成原理的理解和应用。
其中之一是关于寄存器堆的设计实验。
寄存器堆是计算机中重要的组成部分之一,它用于存储、读取和写入数据。
在计算机中,数据通常被存储在寄存器中,然后进行各种操作。
因此,设计一个高效可靠的寄存器堆对于计算机的性能至关重要。
根据实验要求,我们需要设计一个8位的寄存器堆,并实现读取、写入和清零等操作。
以下是针对该实验的设计思路和实施步骤。
首先,我们需要确定寄存器堆的结构。
由于该寄存器堆为8位宽度,我们选择使用一个8x8的存储单元阵列。
每个存储单元都可以存储一个8位的数据。
整个寄存器堆由8个存储单元组成,每个存储单元对应一个地址,即0~7接下来,我们需要设计寄存器堆的读写电路。
对于读操作,我们需要通过地址线来选择要读取的存储单元,并将其输出到数据线。
对于写操作,我们同样需要通过地址线来选择要写入的存储单元,并将数据线上的数据写入该存储单元。
为了实现这些操作,我们需要使用多路选择器和数据解码器。
在设计中,我们还需要考虑到时钟信号的输入,以确保读写操作在时钟的上升沿或下降沿进行。
此外,我们还需要添加清零功能,以便将寄存器堆的值重置为零。
为实现清零功能,我们可以将一个额外的输入线与所有存储单元的清零输入连接。
在实施阶段,我们需要使用Verilog或其他硬件描述语言来实现设计。
在代码中,我们首先声明一个8位宽的存储单元阵列作为寄存器堆的基本组成部分。
然后,我们定义读写电路,包括地址线、数据线、多路选择器和数据解码器。
最后,我们添加时钟信号和清零功能。
在完成设计后,我们可以通过仿真工具进行验证。
通过输入不同的数据和地址,观察输出结果是否符合预期。
如果存在问题,我们可以进行调试并进行必要的修改。
一旦仿真结果正确无误,我们就可以开始进行硬件实验了。
杭电计算机组成原理寄存器堆设计实验-4
杭州电子科技大学计算机学院实验报告课程名称:计算机组成原理姓实验项目:寄存器堆设计实验班级:指导教师学号:实验位置:日期:2015年5月7日A=0;B=0;LED=O;W_Data=O;if(!Write_Reg)beginif(!C2)beginA=Addr;case(C1)2'b00:LED=R_Data_A[7:0];2'bO1:LED=R_Data_A[15:8];2'b10:LED=R_Data_A[23:16];2'b11:LED=R_Data_A[31:24];endcaseendelsebeginB=Addr;case(C1)2'b00:LED=R_Data_B[7:0];2'bO1:LED=R_Data_B[15:8];2'b10:LED=R_Data_B[23:16];2'b11:LED=R_Data_B[31:24];endcaseendendelsebegincase(C1)2'b00:W_Data=32'h0000_0003;2'b01:W_Data=32'h0000_0607;2'b10:W_Data=32'hFFFF_FFFF;2'b11:W_Data=32'h1111_1234;endcaseendenden dmodule按照实验的要求,一步步的进行操作。
能够正确的进行 Wire_Reg 写操作,进行读操 作时LED 灯的显示,利用选择A, B 操作读出信号,已经Reset 进行清零信号的操作, 都能顺利的进行,本实验多次失败,收获不小。
(接 上) 实验 内容 (算 法、 程 序、 步骤NET "Addr[0]" LOC =M8; NET "Addr[1]" LOC =N8; NET "Addr[2]" LOC =U8;NET "Addr[3]" LOC =V8; NET "Addr[4]" LOC =T5; NET "C1[0]" LOC = T10; NET "C1[1]" LOC = T9; NET "C2" LOC = B8; NET "Clk" LOC = C 9; NET "LED[0]" LOC =U16; NET "LED[1]" LOC =V16; NET "LED[2]" LOC =U15; NET "LED[3]" LOC =V15; NET "LED[4]" LOC =M11;NET "LED[5]" LOC = N11; NET "LED[6]" LOC = R11; NET "LED[7]" LOC = T11; NET "Reset" LOC = D9; NET "Write_Reg" LOC = V9; 数据 记录 和计结论 (结 果)3.管脚配置实验仿真波形:n n <: Q 电卡p r FWT 尹尸科pi 通 T r n ►卢1叫卜靳 "iz。
杭电计组实验十
output [31:0] PC_new;
output ZF;
output OF;
output Write_Reg;//是否写入
output [31:0] W_Data;
output rd_rt_s; //控制那个作为目的寄存器
output [4:0]W_Addr;//目的操作数地址
endcase
end
//------------------处理I型立即寻址指令------------------------
if(inst[31:29]==3'b001)
begin
imm=inst[15:0];rtinst[20:16];//rt
rs=inst[25:21];//rs
Mem_Write=0;//是否写入数据存储器
.dina(dina), // input [31 : 0] dina
.douta(douta) // output [31 : 0] douta
);
always@(posedge rst or negedge clka)
begin
if(rst)
PC<=32'h00000000;
else
begin
case(PC_s)
.imm_data(imm_data),
.address(address)
//解析指令
);
analysis_inst analysis_inst(
.inst(inst),
.ALU_OP(ALU_OP),
.rs(rs),
.rt(rt),
.rd(rd),
.Write_Reg(Write_Reg),
杭电计组实验9-实现R-I型指令地CPU设计实验
实验报告2018 年 6 月 1 日成绩:姓名阳光男学号16041321 班级16052317专业计算机科学与技术课程名称《计算机组成原理与系统结构试验》任课老师张翔老师指导老师张翔老师机位号无实验序号9实验名称《实验九实现R-I 型指令的CPU 设计实验》实验时间2018/6/2实验地点1 教221实验设备号个人电脑一、实验程序源代码顶层RI 型指令CPU 模块测试文件:module test;// Inputsreg rst;reg clk;// Outputswire ZF;wire OF;wire [31:0] F;wire [31:0] M_R_Data;// Instantiate the Unit Under Test (UUT) TOP_RI_CPU uut (.rst(rst),.clk(clk),.ZF(ZF),.OF(OF),.F(F),.M_R_Data(M_R_Data));initial begin// Initialize Inputsrst = 0;clk = 0;// Wait 100 ns for global reset to finish#100;clk=1;// Add stimulus hereforeverbegin#50;clk=~clk;endendendmodule顶层LED 验证模块:module TOP_LED(clk_100MHz,oclk,rst,SW,LED); input clk_100MHz;input oclk,rst;input [3:0]SW;output reg[7:0]LED;wire rclk;wire ZF,OF;wire [31:0]F;wire [31:0]M_R_Data;xiaodou doudong(clk_100MHz,oclk,rclk);TOP_RI_CPU(clk_100MHz,rst,rclk,ZF,OF,F,M_R_Data);always@(*)begincase(SW)3'b0000:LED=F[7:0];3'b0001:LED=F[15:8];3'b0010:LED=F[23:16];3'b0011:LED=F[31:24];3'b0100:LED=M_R_Data[7:0];3'b0101:LED=M_R_Data[15:8];3'b0110:LED=M_R_Data[23:16];3'b0111:LED=M_R_Data[31:24];3'b1111:begin LED[7:2]=0;LED[1]=OF;LED[0]=ZF;enddefault:LED=0;endcaseendendmodule顶层RI 型指令CPU 模块module TOP_RI_CPU(input rst,input clk,output ZF,output OF,output [31:0]F,output [31:0]M_R_Data);wire Write_Reg;wire [31:0]Inst_code;wire [4:0]rs;wire [4:0]rt;wire [4:0]rd;wire [31:0]rs_data;wire [31:0]rt_data;wire [31:0]rd_data;wire [31:0]imm_data;wire [15:0]imm;wire rd_rt_s;wire imm_s;wire Mem_Write;wire alu_mem_s;wire [31:0]W_Addr;wire [31:0]W_Data;wire [31:0]R_Data_A;wire [31:0]R_Data_B;wire [31:0]F;wire [31:0]ALU_B;wire [2:0]ALU_OP;pc pc_connect(clk,rst,Inst_code);OP_YIMAop(Inst_code,ALU_OP,rs,rt,rd,Write_Reg,imm,rd_rt_s,imm_s,rt_imm_s,Mem_Write,alu_mem_s); assign W_Addr=(rd_rt_s)?rt:rd;assign imm_data=(imm_s)?{{16{imm[15]}},imm}:{{16{1'b0}},imm};Register_file R_connect(rs,rt,W_Addr,Write_Reg,W_Data,~clk,rst,R_Data_A,R_Data_B); assign ALU_B=(rt_imm_s)?imm_data:R_Data_B;ALU ALU_connect(R_Data_A,ALU_B,F,ALU_OP,ZF,OF);wire clk_tmp;wire d_outn;reg d_out=0;assign clk_tmp=clk^d_out;assign d_outn=~d_out;always@(posedge clk_tmp)begind_out<=d_outn;endRAM_B Data_Mem (.clka(clk_tmp), // input clka.wea(Mem_Write), // input [0 : 0] wea.addra(F[5:0]), // input [5 : 0] addra.dina(R_Data_B), // input [31 : 0] dina.douta(M_R_Data) // output [31 : 0] douta);assign W_Data=alu_mem_s?M_R_Data:F;endmodulePC 取指令模块:module pc(input clk,input rst,output [31:0]Inst_code); reg [31:0]PC;wire[31:0]PC_new;initialPC<=32'h00000000;Inst_ROM Inst_ROM1 (.clka(clk),.addra(PC[7:2]),.douta(Inst_code));assign PC_new=PC+4;always@(negedge clk or posedge rst)beginif(rst)PC=32'h00000000;elsePC={24'h000000,PC_new[7:0]};endendmoduleOP 指令功能译码模块module OP_YIMA(inst,ALU_OP,rs,rt,rd,Write_Reg, imm,rd_rt_s,imm_s,rt_imm_s,Mem_Write,alu_mem_s); input [31:0]inst;output reg[2:0]ALU_OP;output reg[4:0]rs;output reg[4:0]rt;output reg[4:0]rd;output reg Write_Reg;output reg[15:0]imm;output reg rd_rt_s;output reg imm_s;output reg rt_imm_s;output reg Mem_Write;output reg alu_mem_s;always@(*)begin//R 型指令if(inst[31:26]==6'b000000)beginrd=inst[15:11];rt=inst[20:16];rs=inst[25:21];alu_mem_s=0;Mem_Write=0;rd_rt_s=0;rt_imm_s=0;Write_Reg=(inst[5:0]==0)?1'b0:1'b1; case(inst[5:0])6'b100000:ALU_OP=3'b100;6'b100010:ALU_OP=3'b101;6'b100100:ALU_OP=3'b000;6'b100101:ALU_OP=3'b001;6'b100110:ALU_OP=3'b010;6'b100111:ALU_OP=3'b011;6'b101011:ALU_OP=3'b110;6'b000100:ALU_OP=3'b111; endcaseend//I 型立即数寻址指令if(inst[31:29]==3'b001)beginimm=inst[15:0];rt=inst[20:16];rs=inst[25:21];Mem_Write=0;rd_rt_s=1;rt_imm_s=1;alu_mem_s=0;Write_Reg=1;case(inst[31:26])6'b001000:begin imm_s=1;ALU_OP=3'b100;end6'b001100:begin imm_s=0;ALU_OP=3'b000;end6'b001110:begin imm_s=0;ALU_OP=3'b010;end6'b001011:begin imm_s=0;ALU_OP=3'b110;endendcaseend//I 型取数/存数指令if((inst[31:30]==2'b10)&&(inst[28:26]==3'b011))beginimm=inst[15:0];rt=inst[20:16];rs=inst[25:21];rd_rt_s=1;rt_imm_s=1;imm_s=1;case(inst[31:26])6'b100011:begin alu_mem_s=1;Mem_Write=0;Write_Reg=1;ALU_OP=3'b100;end6'b101011:begin Mem_Write=1; Write_Reg=0;ALU_OP=3'b100;endendcaseendendendmodule寄存器堆模块:ModuleRegister_file(R_Addr_A,R_Addr_B,W_Addr,Write_Reg,W_Data,Clk,Reset,R_Data_A,R_Data_B); input [4:0]R_Addr_A;input [4:0]R_Addr_B;input [4:0]W_Addr;input Write_Reg;input [31:0]W_Data;input Clk;input Reset;output [31:0]R_Data_A;output [31:0]R_Data_B;reg [31:0]REG_Files[0:31];reg [5:0]i;initial// 仿真过程中的初始化beginfor(i=0;i<=31;i=i+1)REG_Files[i]=0;endassign R_Data_A=REG_Files[R_Addr_A]; assign R_Data_B=REG_Files[R_Addr_B]; always@(posedge Clk or posedge Reset) beginif(Reset)for(i=0;i<=31;i=i+1)REG_Files[i]=0;elseif(Write_Reg&&W_Addr!=0)REG_Files[W_Addr]=W_Data;endendmoduleALU 运算模块:module ALU(A,B,F,ALU_OP,ZF,OF); input [31:0]A,B;input [2:0]ALU_OP;output reg ZF,OF;output reg[31:0]F;reg C32;always@(*)beginOF=1'b0;C32=1'b0;case(ALU_OP)3'b000:F=A&B;3'b001:F=A|B;3'b010:F=A^B;3'b011:F=~(A^B);3'b100:begin {C32,F}=A+B;OF=A[31]^B[31]^F[31]^C32;end 3'b101:begin {C32,F}=A-B;OF=A[31]^B[31]^F[31]^C32;end 3'b110:if(A<B)F=1;elseF=0;3'b111:F=B<<A;endcaseif(F==0)ZF=1;elseZF=0;endendmodule时钟按键消抖代码:module xiaodou(input clk_100MHz,input BTN,output reg BTN_Out);reg BTN1,BTN2;wire BTN_Down;reg [21:0] cnt;reg BTN_20ms_1,BTN_20ms_2;wire BTN_Up;always @(posedge clk_100MHz)beginBTN1 <= BTN;BTN2 <= BTN1;endassign BTN_Down = (~BTN2)&& BTN1 ;从// 0 到1 的跳变always @(posedge clk_100MHz)beginif (BTN_Down)begincnt <= 22'b0;BTN_Out <= 1'b1;endelse cnt <= cnt+1'b1;if (cnt==22'h20000) BTN_20ms_1 <= BTN;BTN_20ms_2 <= BTN_20ms_1;if (BTN_Up) BTN_Out <= 1'b0;endassign BTN_Up = BTN_20ms_2 && (~BTN_20ms_1从);// 1 到 0 endmodule二、仿真波形*** 三、电路图*********顶层电路模块顶层电路内部结构四、引脚配置(约束文件)NET "LED[7]" LOC = T11;NET "LED[6]" LOC = R11;NET "LED[5]" LOC = N11;NET "LED[4]" LOC = M11;******NET "LED[3]" LOC = V15;NET "LED[2]" LOC = U15;NET "LED[1]" LOC = V16;NET "LED[0]" LOC = U16;NET "SW[3]" LOC = M8;NET "SW[2]" LOC = V9;NET "SW[1]" LOC = T9;NET "SW[0]" LOC = T10;NET "rst" LOC = C4; NET "clk_100MHz" LOC = V10;NET "oclk" LOC = C9;五、思考与探索(1)R-I 型指令CPU 实验结果记录表序号指令执行结果标志结论1 38011234 0000_1234 0 0 正确2 20026789 0000_6789 0 0 正确3 20039000 FFFF_9000 0 0 正确4 38040010 0000_0010 0 0 正确5 00822804 6789_0000 0 0 正确6 00253025 6789_1234 0 0 正确7 00833804 9000_0000 0 0 正确8 00464020 6789_79BD 0 0 正确9 00414822, 0000_5555 0 0 正确10 00225022 FFFF_AAAB 0 0 正确11 206b7fff 0000_0FFF 0 0 正确12 206c8000 FFFF_1000 0 0 正确13 314dffff 0000_AAAB 0 0 正确14 2c4e6788 0000_0000 0 0 正确15 2c4f678a 0000_0001 0 0 正确16 ac0c0014 0000_0FFF 0 0 正确。
杭电计算机组成原理实验报告.doc
杭电计算机组成原理实验报告篇一:杭电计组实验报告9计组实验九老师:包健一、源代码测试模块代码:moduleTest_Top;// Inputsreginclk;regmem_clk;regrst;reg [3:0] SW;// Outputswire [7:0] LED;// Instantiate the Unit Under TestTop uut ,.mem_clk,.rst,.LED,.SW);reg [2:0] i;initial begin// Initialize Inputsinclk = 0;mem_clk = 0;rst = 0;SW = 0;i=0;// Wait 100 ns for global reset to finish #100;rst = 1;#100;rst =0 ;#100;foreverbegin#100;mem_clk=~mem_clk;i=i+1;ifinclk=~inclk;endendendmodule顶层模块代码:moduleMy_I_CPU;wireclk_n = ~clk;wire[31:0] codes;Inst_Fetch1 inst_fetch,.clk,.Inst_codes);wire[5:0] OP;wire[5:0] func;wire[2:0] ALU_OP;wirerd_rt_s;wireimm_s;wirert_imm_s;wirealu_mem_s;wireWrite_Reg;wireMem_Write;wire [15:0] imm;wire [31:0] imm_data ;assign imm_data = ?{{16{imm[15]}},imm}:{{16{1b0}},imm}; assign OP =codes[31:26];assignfunc = codes[5:0];assignimm = codes[15:0]; OP_Decoderop_decoder,//input.func,//input.ALU_OP,.rd_rt_s,.imm_s,.rt_imm_s,.alu_mem_s,.Write_Reg,.Mem_Write);wire[4:0] rs;wire[4:0] rt;wire[4:0] rd;assigs = codes[25:21];assigt = codes[20:16];assigd = codes[15:11];wire[4:0] W_Addr;assignW_Addr=?rt:rd;wire [31:0]W_Data;wire [31:0]R_Data_A;wire [31:0]R_Data_B; RegisterHeapregister,.R_Addr_B,.W_Addr,.Write_Reg,.Reset,.Clk,.W_Data,.R_Data_A,.R_Data_B);wire [31:0]ALU_A;wire [31:0]ALU_B;assign ALU_A = R_Data_A;assign ALU_B = ?imm_data:R_Data_B;ALU alu,.A,.B,.F,.ZF,.OF);Data_Memdata_mem , // input clka.wea, // input [0 : 0] wea .addra, // input [5 : 0] addra .dina, // input [31 : 0] dina .douta // output [31 : 0] douta);assignW_Data = ?M_R_Data:ALU_F; endmodule二、仿真波形三、电路图四、引脚配置篇二:杭电计算机组成原理取指令与指令译码实验7杭州电子科技大学计算机学院实验报告课程名称:计算机组成原理姓名实验项目:取指令与指令译码实验班级指导教师:学号:实验位置:日期:篇三:杭电计算机组成原理多功能ALU设计实验3杭州电子科技大学计算机学院实验报告课程名称:计算机组成原理姓名:实验项目:多功能ALU设计实验班级:指导教师:学号:实验位置:日期:2015年4月29日。
杭电计组实验4-寄存器堆设计实验
杭电计组实验4-寄存器堆设计实验实验报告2018 年 5 月12 日成绩:一、实验程序源代码1.寄存器堆模块代码:moduleRegister_file(R_Addr_A,R_Addr_B,W_Addr,Write_Reg,W_Data,Clk,Reset,R_Data_A,R_Data_B); input [4:0]R_Addr_A;input [4:0]R_Addr_B;input [4:0]W_Addr;input Write_Reg;input [31:0]W_Data;input Clk;input Reset;output [31:0]R_Data_A;output [31:0]R_Data_B;reg [31:0]REG_Files[0:31];reg [5:0]i;initial//仿真过程中的初始化beginfor(i=0;i<=31;i=i+1)REG_Files[i]=0;endassign R_Data_A=REG_Files[R_Addr_A];assign R_Data_B=REG_Files[R_Addr_B];2'b01:LED=R_Data_A[15:8];2'b10:LED=R_Data_A[23:16];2'b11:LED=R_Data_A[31:24];endcaseendelsebeginB=Addr;case(C1)2'b00:LED=R_Data_B[7:0];2'b01:LED=R_Data_B[15:8];2'b10:LED=R_Data_B[23:16];2'b11:LED=R_Data_B[31:24];endcaseendendelse//写操作begincase(C1)2'b00:W_Data=32'h0000_0003;2'b01:W_Data=32'h0000_0607;2'b10:W_Data=32'hFFFF_FFFF;2'b11:W_Data=32'h1111_1234;endcaseendendendmodule3.测试代码module test;// Inputsreg [4:0] R_Addr_A;reg [4:0] R_Addr_B;reg [4:0] W_Addr;reg Write_Reg;reg [31:0] W_Data;reg Clk;reg Reset;// Outputswire [31:0] R_Data_A;wire [31:0] R_Data_B;// Instantiate the Unit Under Test (UUT) Register_file uut (.R_Addr_A(R_Addr_A),.R_Addr_B(R_Addr_B),.W_Addr(W_Addr),.Write_Reg(Write_Reg),.W_Data(W_Data),.Clk(Clk),.Reset(Reset),.R_Data_A(R_Data_A),.R_Data_B(R_Data_B));initial begin// Initialize InputsR_Addr_A = 0;R_Addr_B = 0;W_Addr = 0;Write_Reg = 0;W_Data = 0;Clk = 0;Reset = 0;// Wait 100 ns for global reset to finish #100;// Add stimulus here#100;R_Addr_A = 0;R_Addr_B = 0;W_Addr = 5'b00001;Write_Reg = 1;W_Data = 32'h1111_1111;Clk = 1;Reset = 0;#100;R_Addr_A = 0;R_Addr_B = 0;W_Addr = 5'b00001; Write_Reg = 1;W_Data = 32'h1111_1111; Clk = 0;Reset = 0;#100;R_Addr_A = 0;R_Addr_B = 0;W_Addr = 5'b00010; Write_Reg = 1;W_Data = 32'h2222_2222; Clk = 1;Reset = 0;#100;R_Addr_A = 5'b00001;R_Addr_B = 5'b00010;W_Addr = 0;Write_Reg = 0;W_Data = 0;Clk = 0;Reset = 0;#100;R_Addr_A = 5'b00001;R_Addr_B = 5'b00010;W_Addr = 0;Write_Reg = 0;W_Data = 0;Clk = 0;Reset = 1;endendmodule二、仿真波形三、电路图顶层电路模块顶层电路内部结构:四、引脚配置(约束文件)NET "Clk" LOC = C9;NET "Reset" LOC = D9;NET "Write_Reg" LOC = T5;NET "C2" LOC = C4;# PlanAhead Generated physical constraintsNET "LED[7]" LOC = T11;NET "LED[6]" LOC = R11;NET "LED[4]" LOC = M11;NET "LED[3]" LOC = V15;NET "LED[1]" LOC = V16;NET "LED[0]" LOC = U16;NET "LED[2]" LOC = U15;NET "LED[5]" LOC = N11;NET "Addr[0]" LOC = T10;NET "Addr[2]" LOC = V9;NET "Addr[3]" LOC = M8;NET "Addr[4]" LOC = N8;NET "C1[0]" LOC = U8;NET "C1[1]" LOC = V8;NET "Addr[1]" LOC = T9;五、思考与探索(1)实验四实验结果记录表寄存器地址写入数据读出数据$1 32'h0000_000332'h0000_0003$2 32'h0000_0607 32'h0000_0607$3 32'hFFFF_FFFF32'hFFFF_FFFF$4 32'h1111_123432'h1111_1234$5 32'h0000_000332'h0000_0003$6 32'h0000_060732'h0000_0607$7 32'hFFFF_FFFF 32'hFFFF_FFFF$8 32'h1111_123432'h1111_1234。
杭电 计算机网络实验报告
目录实验一、使用数据拷贝线组网 (1)实验二、制作直通双绞线组网 (4)实验三、制作交叉双绞线组网 (7)实验四、Cisco IOS基本使用 (10)实验五、交换机基本使用 (14)实验六、VLAN的使用 (18)实验七、路由器的基本使用 (25)实验八、动态路由配置 (30)实验一、使用数据拷贝线组网实验一使用数据拷贝线组网实验台号:实验时间:实验小组号:成员及本次实验分工:实验目的:学会使用并行电缆(数据拷贝线)实现双机通信和资源共享。
使用直接电缆实现两台PC机之间的通信。
实验环境说明:硬件:2台计算机、2-3根并行电缆软件:Windows XP操作系统实验过程及步骤(可另附页、使用网络拓扑图等辅助说明):(1)、使用并行电缆将两台PC机,进行物理互连;(2)、分别在两台PC机上的网上邻居中创建一个新连接。
按照新建连接向导的指示来做。
首先网络连接类型选为“设置高级连接”;然后其中作为服务器的那台PC机创建为“接受传入的连接”,作为客户机的则创建为“直接连接到其他计算机的连接”,并让此计算机担任“来宾”的角色。
接下去根据向导直至完成创建新连接。
(3)、测试两机的可通用性。
创建好连接之后可以用ping命令测试一下两台机器之间是否已经连通。
(4)、连接创建成功之后,客户机可以找到并登入到服务器,就可以实现对服务器上的资源的共享了。
当然在此之前作为服务器的主机还需要将文件夹属性设置成为可共享的。
测试数据线连接以后Ping对方说明能够Ping通在一台PC上设置共享,然后在另外一台PC上查看共享截图如下:说明通过数据拷贝线成功地连接了两台PC,实现了他们之间的通信。
实验总结(遇到的问题及解决办法、体会):刚开始配置客户机的时候出了点问题。
需要输入对方计算机的名字,我们却输入了服务器上的计算机用户的帐号,所以一直没有连接成功。
后来终于发现了这个问题。
配置也就顺利了。
实验器材、工具领用及归还负责人:验收人:实验执笔人:实验记录人:报告协助人:实验报告完成时间:小组成员签名:指导教师评议成绩评定:指导教师签名:实验二、制作直通双绞线组网实验二制作直通双绞线组网实验台号: 实验时间: 实验小组号:成员及本次 实验分工: 实验目的:1. 了解双绞线的相关知识;2. 学会制作直通双绞线;3. 掌握用双绞线实现集线器和计算机之间的互连。
杭电计组实验6-MIPS汇编器与模拟器实验
0x00a64820,
0x01264004,
0x00284826,
0x01215020,
0x01075822,
0x00e86022,
0x012c6824,
0x012c7025,
0x00c77825,
0x00c78027,
0x00e38820,
0x02289004,
0x02239804,
$25
Hale Waihona Puke 0x0000 0000$4
0x0000_0003
$15
0x0000_000F
$26
0x3000_FF13
$5
0x0000_0005
$16
0xFFFF_FFF0
$27
0xFFF_FFFF
$6
0x0000_0007
$17
0x0000_0010
$28
0x0000_0000
$7
0x0000_000E
$18
0x7000_0000
$29
0x7000_0001
$8
0x00007000
$19
0x0002_0000
$30
0x0000 0000
$9
0xFFFF_8FFF
$20
0x8000_0000
$31
0x3001_6F05
$10
0xFFFF_8FFE
$21
0x0000 0000
结果大多正确,但有的不正确。
原因:add和sub运算可能存在溢出.
sub$11,$8,$7;#$11=0000_6FF2
sub$12,$7,$8;#$12=FFFF_900E
and $13,$9,$12;#$13=FFFF_800E
杭电计组实验10-实现R-I-J型指令的CPU设计实验
实验报告2018年6月9 日成绩:、实验程序源代码顶层RI型指令CPU模块测试文件: module test;//In putsreg rst;reg clk_100MH z;reg clk;// Outputs wire ZF; wire OF;wire [31:0] F;wire [31:0] M_R_Data; wire [31:0] PC;// I nsta ntiate the Unit Un der Test (UUT) TOP_RIJ_CPU uut ( .rst(rst), .clk_100F .clk(clk), •ZF(ZF), •OF(OF),.M_R_Data(M_R_Data), .PC(PC));in itial begi n//I nitialize In putsrst = 0;clk_100MHz = 0;clk = 0;// Wait 100 ns for global reset to fin ish #100;// Add stimulus hereforeverbegi n#2;clk=~clk;#10;clk_100MHz=~clk_100MH z;endenden dmodule顶层LED验证模块module TOP_LED(clk_100M Hz, oclk,rst,SW 丄ED); in put clk_100MH z; in put oclk,rst;in put [3:0]SW;output reg[7:0]LED;4'b0001:LED二F[15:8];4'b0010:LED=F[23:16];4'b0011:LED=F[31:24];4'b0100:LED=M_R_Data[7:0];4'b0101:LED=M_R_Data[15:8];4'b0110:LED二M_R_Data[23:16];4'b0111:LED=M_R_Data[31:24];4'b1000:begin LED[7:2]=0;LED[1]=OF;LED[0]=ZF;e nd4'b1100:LED=PC[7:0];4'b1101:LED=PC[15:8];4'b1110:LED=PC[23:16];4'b1111:LED=PC[31:24];default:LED=0;endcaseenden dmodule顶层RIJ型指令CPU验证模块:module TOP RIJ CPU(i nput rst, in put elk 100MHz,i nput clk,output ZF, output OF,output [31:0]F,output [31:0]M_R_Data,output [31:0]PC);wire Write_Reg;wire [31:0]lnst_code;wire [4:0]rs;wire [4:0]rt;wire [4:0]rd;wire [31:0]rs_data;wire [31:0]rt_data;wire [31:0]rd_data;wire [31:0]imm_data;〃被扩展的立即数wire [15:0]imm;//wire rd_rt_s;wire [1:0]w_r_s;wire imm_s;〃判断是否需要扩展wire rt_imm_s;//B 端选择rt或者是扩展后的immwire Mem_Write;//wire alu_mem_s;wire [1:0]wr_data_s;wire [31:0]W_Addr;wire [31:0]W_Data;wire [31:0]R_Data_A;wire [31:0]R_Data_B;wire [31:0]F;wire [31:0]ALU_B;//B 端口数据wire [2:0]ALU_OP;wire [1:0]PC_s;wire [31:0]PC_ new;wire [31:0]PC;wire [25:0]address;pc pc_c onn ect(clk,rst,PC_s,R_Data_A,imm_data,address,l nst_code,PC);OP_YIMA op(I nst_code,ALU_QP;,rt,rd,Write_Reg,imm,imm_s,rt_imm_s,Mem_Write,address,w_r_s,wr_data_s,PC_s,ZF);elsebeg in case(PC_s)2'b00:PC<二PC_ new;2'bO1:PC<二R_Data_A;2'b10:PC<=PC_ new+(imm_data<<2);2'b11:PC<={PC_ new[31:28],address,2'b00};endcaseendenden dmoduleOP指令功能译码模块:module OP_YIMA(i nst,ALU_OPfe,rt,rd,Write_Reg,imm,imm_s,rt_imm_s,Mem_Write,address,w_r_s,wr_data_s,PC_s,ZF) in put [31:0]i nst; output reg[2:0]ALU_OP;output reg[4:0]rs;output reg[4:0]rt;output reg[4:0]rd;output reg Write_Reg;output reg[15:0]imm;//output reg rd_rt_s;output reg imm_s;output reg rt_imm_s;output reg Mem_Write;output reg [25:0]address;output reg[1:0] w_r_s;output reg[1:0] wr_data_s;output reg[1:0] PC_s;in put ZF;always@(*)begi nw_r_s=2'b01;Write_Reg=1; wr_data_s=2'b00;case(i nst[31:26])6'b001000:begin imm_s=1;ALU_OP=3'b100;e nd 6'b001100:begin imm_s=0;ALU_OP=3'b000;e nd 6'b001110:begin imm_s=0;ALU_OP=3'b010;e nd 6'b001011:begin imm_s=0;ALU_OP=3'b110;e nd endcaseend// ------- 处理I型取数/存数指令------if((i nst[31:30]==2'b10)&&(in st[28:26]==3'b011))imm=i nst[15:0];rt=i nst[20:16];//rt 寄存器rs=inst[25:21];//rs 寄存器//rd_rt_s=1;//rt作为目的存储器rt_imm_s=1;//imm 作为源操作数imm_s=1;w_r_s=2'b01;wr_data_s=2'b01;PC_s=2'b00;case(i nst[31:26])6'b100011:begin Mem_Write=O; Write_Reg=1;ALU_OP=3'b100;e nd 6'b101011:begin Mem_Write=1; Write_Reg=0;ALU_OP=3'b100;e nd endcaseend// ---------- 处理I型跳转指令-------if(i nst[31:27]==5'b00010)begi nimm=i nst[15:0];rt=i nst[20:16];//rtrs=i nst[25:21];//rscase(i nst[31:26])for(i=0;iv=31;i二i+1)REG_Files[i]=O;endassign R_Data_A=REG_Files[R_Addr_A]; assign R_Data_B=REG_Files[R_Addr_B]; always@(posedge Clk or posedge Reset) begi nif(Reset)for(i=0;i<=31;i=i+1)REG_Files[i]v=O;elseif(Write_Reg&&W_Addr!=0)REG_Files[W_Addr]<=W_Data; enden dmoduleALU运算模块:module ALU(A,B,F,ALU_QZF,OF); in put [31:0]A,B;in put [2:0]ALU_OP;output reg ZF,OF;output reg[31:0]F;reg C32;always@(*)begi nOF=1'b0;C32=1'b0;case(ALU_OP)3'b000:F=A&B;3'b001:F=A|B;3'b010:F=A A B;3'bO11:F=~(A^B);3'b100:begin {C32,F}=A+B;OF=A[31]A B[31]A F[31]A C32;e nd3'b101:begin {C32,F}二A-B;OF二A[31]AB[31]AF[31FC32;e nd 3'b110: if(A<B)F=1;elseF=0;3'b111:F=B<< A;endcaseif(F==0)ZF=1;elseZF=0;enden dmodule三、电路图J!仿真波形NjmeVtki*曲饶k ■ FIJI*]•电M_R_Dala[11fl]0 1吃网IIIhO Q10000(X1 悴259^353顶层电路内部结构:四、引脚配置(约束文件)NET "LED[7]" LOC = T11; NET "LED[6]" LOC = R11; NET "LED[5]" LOC = N11; NET "LED[4]" LOC = M11; NET "LED[3]" LOC = V15; NET "LED[2]" LOC = U15; NET "LED[1]" LOC = V16; NET "LED[0]" LOC = U16; NET "SW[3]" LOC = M8; NET "SW[1]" LOC = T9; NET "SW[01" LOC = T10;顶层电路模块SW(3:D)TOP LEDLED(7:0)elk 100MH2odknsl■ /TOP_LEDTOP LED.1NET "clk_100MHz" LOC = V10;NET "oclk" LOC = C9;NET "rst" LOC = C4;NET "SW[2]" LOC = V9;五、思考与探索(1) R-l-J型指令CPU实验结果记录表序号指令执行结果标志结论1 00004020 $8=0000_0000 0 0 正确2 00004820 $9=0000_0000 0 0 正确3 200a0014 $10=0000_0014 0 0 正确4 8d2b0010 $11=0000_0010 0 0 正确5 010b4020 $8=0000_2222 0 0 正确6 21290004 $9=0000_0004 0 0 正确7 214affff $10=000_0013 0 0 正确8 11400001 判断:$10不为0 0 0 正确0 0 正确9 08000003 返回去执行地址为0000_0010 的指令,即序号4:8d2b001010 ac0b0030 存储器地址:0000 0030 0 0 正确。
杭电计组实验7-取指令与指令译码实验
output wire [31:0]inst_code;
input reset;
output reg[31:0]PC;
output [31:0]PC_new;
assign PC_new=PC+4;
rom FA0(clk,PC[7:2],inst_code);
always@(posedge clk orposedge reset)
杭州电子科技大学计算机学院
实验报告
实验项目:
课程名称:计算机组成原理与系统结构课程设计
姓名:学号:同组姓名:学号:
实验位置(机号):
实验日期:指导教师:
实验内容(算法、程序、步骤和方法)
1、实验目的
(1)学习指令存储器的设计
(2)掌握CPU取指令操作与译码的方法和过程
二、实验仪器
ISE工具
三、步骤、方法
rom_d your_instance_name (
.clka(clk), // input clka
.addra(addr[7:2]), // input [5 : 0] addra
.douta(douta) // output [31 : 0] douta
);
Endmodule
RTL图
2、结果
思考题:
begin
if(reset) begin PC<=32'H00000000;end
else begin PC<=PC_new;end
end
endmodule
2、ROM模块的调用代码
module rom(clk,addr,douta);
input clk;
input [7:2]addr;
杭电计组实验一二三
杭电计组实验一二三————————————————————————————————作者:————————————————————————————————日期:实验报告2016 年 3 月11 日成绩:姓名周勇学号班级计科5班专业计算机科学与技术课程名称《数字电路课程设计》任课老师章复嘉老师指导老师章复嘉老师机位号实验序号1,2,3 实验名称实验一,二,三实验时间3月11日实验地点1教225 实验设备号一、实验程序源代码实验1:module ex1(Ai,Bi,Ci,Fi,Ci_1); input Ai,Bi,Ci;output Fi,Ci_1;assign Fi=Ai^Bi^Ci;wire Ai,Bi,Ci,Fi,Ci_1;assign Ci_1=Ai&Bi|(Ai^Bi)&Ci; endmodule实验2:module ex2_1(F,A,B,C0,C4); input[3:0] A,B;input C0;output[3:0] F;output C4;assign {C4,F}=A+B+C0; endmodule实验3:module ex3(ALU_OP,A,B,F,ZF,OF );input[2:0] ALU_OP;input[31:0] A,B;output[31:0] F;output ZF,OF;reg ZF,OF;wire C32,C31;reg [7:0]i;reg[31:0] F;always@(*)begincase(ALU_OP)3'b000:F=A&B;3'b001:F=A|B;3'b010:F=A^B;3'b011:F=!(A|B);3'b100:begin{C32,F}=A+B;OF=C32^A[31]^B[31]^F[31];end 3'b101:begin{C32,F}=A-B;OF=C32^A[31]^B[31]^F[31];end 3'b110:begin if(A<B)F=1;elseF=0;end3'b111:F=B<<A;default: begin endendcasefor(i=0;i<=31;i=i+1)ZF=ZF|F[i];ZF=!ZF;endendmodule二、仿真波形实验2实验3三、电路图四、引脚配置(约束文件)五、思考与探索1.复习了FPGA,Verilog HDL的用法六、意见和建议1.无。
杭电计组实验10-实现R-I-J型指令的CPU设计实验精编版
实验报告2018 年 6 月9 日成绩:姓名阳光男学号16041321 班级16052317专业计算机科学与技术课程名称《计算机组成原理与系统结构试验》任课老师张翔老师指导老师张翔老师机位号默认实验序号10 实验名称《实验十实现R-I-J型指令的CPU设计实验》实验时间2018/6/9 实验地点1教221 实验设备号个人电脑、Nexys3开发板一、实验程序源代码顶层RI型指令CPU模块测试文件:module test;// Inputsreg rst;reg clk_100MHz;reg clk;// Outputswire ZF;wire OF;wire [31:0] F;wire [31:0] M_R_Data;wire [31:0] PC;// Instantiate the Unit Under Test (UUT)TOP_RIJ_CPU uut (.rst(rst),.clk_100MHz(clk_100MHz),.clk(clk),.ZF(ZF),.OF(OF),.F(F),.M_R_Data(M_R_Data),.PC(PC));initial begin// Initialize Inputsrst = 0;clk_100MHz = 0;clk = 0;// Wait 100 ns for global reset to finish#100;// Add stimulus hereforeverbegin#2;clk=~clk;#10;clk_100MHz=~clk_100MHz;endendendmodule顶层LED验证模块module TOP_LED(clk_100MHz,oclk,rst,SW,LED); input clk_100MHz;input oclk,rst;input [3:0]SW;output reg[7:0]LED;wire rclk;wire ZF,OF;wire [31:0]F;wire [31:0]M_R_Data;wire [31:0]PC;xiaodou doudong(clk_100MHz,oclk,rclk);TOP_RIJ_CPU(rst,clk_100MHz,rclk,ZF,OF,F,M_R_Data,PC);always@(*)begincase(SW)4'b0000:LED=F[7:0];4'b0001:LED=F[15:8];4'b0010:LED=F[23:16];4'b0011:LED=F[31:24];4'b0100:LED=M_R_Data[7:0];4'b0101:LED=M_R_Data[15:8];4'b0110:LED=M_R_Data[23:16];4'b0111:LED=M_R_Data[31:24];4'b1000:begin LED[7:2]=0;LED[1]=OF;LED[0]=ZF;end4'b1100:LED=PC[7:0];4'b1101:LED=PC[15:8];4'b1110:LED=PC[23:16];4'b1111:LED=PC[31:24];default:LED=0;endcaseendendmodule顶层RIJ型指令CPU验证模块:module TOP_RIJ_CPU(input rst,input clk_100MHz,input clk,output ZF,output OF,output [31:0]F,output [31:0]M_R_Data,output [31:0]PC);wire Write_Reg;wire [31:0]Inst_code;wire [4:0]rs;wire [4:0]rt;wire [4:0]rd;wire [31:0]rs_data;wire [31:0]rt_data;wire [31:0]rd_data;wire [31:0]imm_data;//被扩展的立即数wire [15:0]imm;//wire rd_rt_s;wire [1:0]w_r_s;wire imm_s;//判断是否需要扩展wire rt_imm_s;//B端选择rt或者是扩展后的immwire Mem_Write;//wire alu_mem_s;wire [1:0]wr_data_s;wire [31:0]W_Addr;wire [31:0]W_Data;wire [31:0]R_Data_A;wire [31:0]R_Data_B;wire [31:0]F;wire [31:0]ALU_B;//B端口数据wire [2:0]ALU_OP;wire [1:0]PC_s;wire [31:0]PC_new;wire [31:0]PC;wire [25:0]address;pc pc_connect(clk,rst,PC_s,R_Data_A,imm_data,address,Inst_code,PC);OP_YIMA op(Inst_code,ALU_OP,rs,rt,rd,Write_Reg,imm,imm_s,rt_imm_s,Mem_Write,address,w_r_s,wr_data_s,PC_s,ZF);assign W_Addr=(w_r_s[1])?5'b11111:((w_r_s[0])?rt:rd);assign imm_data=(imm_s)?{{16{imm[15]}},imm}:{{16{1'b0}},imm};Register_file R_connect(rs,rt,W_Addr,Write_Reg,W_Data,clk,rst,R_Data_A,R_Data_B); assign ALU_B=(rt_imm_s)?imm_data:R_Data_B;ALU ALU_connect(R_Data_A,ALU_B,F,ALU_OP,ZF,OF);RAM_B Data_Mem (.clka(clk_100MHz), // input clka.wea(Mem_Write), // input [0 : 0] wea.addra(F[5:0]), // input [5 : 0] addra.dina(R_Data_B), // input [31 : 0] dina.douta(M_R_Data) // output [31 : 0] douta);assign W_Data=(wr_data_s[1])?PC_new:((wr_data_s[0])?M_R_Data:F); endmodulePC取指令模块:module pc(input clk,input rst,input [1:0]PC_s,input [31:0]R_Data_A,input [31:0]imm_data,input [25:0]address,output [31:0]Inst_code,output [31:0]PC);reg [31:0]PC;wire[31:0]PC_new;initialPC<=32'h00000000;Inst_ROM Inst_ROM1 (.clka(clk),.addra(PC[7:2]),.douta(Inst_code));assign PC_new=PC+4;always@(negedge clk or posedge rst)beginif(rst)PC<=32'h00000000;elsebegincase(PC_s)2'b00:PC<=PC_new;2'b01:PC<=R_Data_A;2'b10:PC<=PC_new+(imm_data<<2);2'b11:PC<={PC_new[31:28],address,2'b00};endcaseendendendmoduleOP指令功能译码模块:module OP_YIMA(inst,ALU_OP,rs,rt,rd,Write_Reg,imm,imm_s,rt_imm_s,Mem_Write,address,w_r_s,wr_data_s,PC_s,ZF); input [31:0]inst;output reg[2:0]ALU_OP;output reg[4:0]rs;output reg[4:0]rt;output reg[4:0]rd;output reg Write_Reg;output reg[15:0]imm;//output reg rd_rt_s;output reg imm_s;output reg rt_imm_s;output reg Mem_Write;output reg [25:0]address;output reg[1:0] w_r_s;output reg[1:0] wr_data_s;output reg[1:0] PC_s;input ZF;always@(*)begin//----------处理R型指令----------if(inst[31:26]==6'b000000)beginrd=inst[15:11];rt=inst[20:16];rs=inst[25:21];//alu_mem_s=0;wr_data_s=2'b00;Mem_Write=0;//rd_rt_s=0;w_r_s=2'b00;rt_imm_s=0;case(inst[5:0])6'b100000:begin ALU_OP=3'b100;Write_Reg=1;PC_s=2'b00;end 6'b100010:begin ALU_OP=3'b101;Write_Reg=1;PC_s=2'b00;end 6'b100100:begin ALU_OP=3'b000;Write_Reg=1;PC_s=2'b00;end 6'b100101:begin ALU_OP=3'b001;Write_Reg=1;PC_s=2'b00;end 6'b100110:begin ALU_OP=3'b010;Write_Reg=1;PC_s=2'b00;end 6'b100111:begin ALU_OP=3'b011;Write_Reg=1;PC_s=2'b00;end 6'b101011:begin ALU_OP=3'b110;Write_Reg=1;PC_s=2'b00;end 6'b000100:begin ALU_OP=3'b111;Write_Reg=1;PC_s=2'b00;end 6'b001000:begin ALU_OP=3'b100;Write_Reg=0;PC_s=2'b01;end endcaseend//---------I型立即数寻址指令-------if(inst[31:29]==3'b001)beginimm=inst[15:0];rt=inst[20:16];rs=inst[25:21];Mem_Write=0;//rd_rt_s=1;rt_imm_s=1;//alu_mem_s=0;w_r_s=2'b01;Write_Reg=1;wr_data_s=2'b00;case(inst[31:26])6'b001000:begin imm_s=1;ALU_OP=3'b100;end6'b001100:begin imm_s=0;ALU_OP=3'b000;end6'b001110:begin imm_s=0;ALU_OP=3'b010;end6'b001011:begin imm_s=0;ALU_OP=3'b110;endendcaseend//--------处理I型取数/存数指令------if((inst[31:30]==2'b10)&&(inst[28:26]==3'b011))beginimm=inst[15:0];rt=inst[20:16];//rt寄存器rs=inst[25:21];//rs寄存器//rd_rt_s=1;//rt作为目的存储器rt_imm_s=1;//imm作为源操作数imm_s=1;w_r_s=2'b01;wr_data_s=2'b01;PC_s=2'b00;case(inst[31:26])6'b100011:begin Mem_Write=0; Write_Reg=1;ALU_OP=3'b100;end 6'b101011:begin Mem_Write=1; Write_Reg=0;ALU_OP=3'b100;end endcaseend//-----------处理I型跳转指令---------if(inst[31:27]==5'b00010)beginimm=inst[15:0];rt=inst[20:16];//rtrs=inst[25:21];//rscase(inst[31:26])6'b000100:begin rt_imm_s=0;ALU_OP=3'b101;Write_Reg=0;Mem_Write=0;PC_s=(ZF?2'b10:2'b00);end6'b000101:begin rt_imm_s=0;ALU_OP=3'b101;Write_Reg=0;Mem_Write=0;PC_s=(ZF?2'b00:2'b10);endendcaseend//----------处理J型跳转指令----------if(inst[31:27]==5'b00001)beginaddress=inst[25:0];case(inst[31:26])6'b000010:begin w_r_s=2'b00;Write_Reg=0;Mem_Write=0;PC_s=2'b11;end6'b000011:begin w_r_s=2'b10;wr_data_s=2'b10;Write_Reg=1;Mem_Write=0;PC_s=2'b11;end endcaseendendendmodule寄存器堆模块:moduleRegister_file(R_Addr_A,R_Addr_B,W_Addr,Write_Reg,W_Data,Clk,Reset,R_Data_A,R_Data_B); input [4:0]R_Addr_A;input [4:0]R_Addr_B;input [4:0]W_Addr;input Write_Reg;input [31:0]W_Data;input Clk;input Reset;output [31:0]R_Data_A;output [31:0]R_Data_B;reg [31:0]REG_Files[0:31];reg [5:0]i;initial//仿真过程中的初始化beginfor(i=0;i<=31;i=i+1)REG_Files[i]=0;endassign R_Data_A=REG_Files[R_Addr_A]; assign R_Data_B=REG_Files[R_Addr_B]; always@(posedge Clk or posedge Reset) beginif(Reset)for(i=0;i<=31;i=i+1)REG_Files[i]<=0;elseif(Write_Reg&&W_Addr!=0)REG_Files[W_Addr]<=W_Data;endendmoduleALU运算模块:module ALU(A,B,F,ALU_OP,ZF,OF);input [31:0]A,B;input [2:0]ALU_OP;output reg ZF,OF;output reg[31:0]F;reg C32;always@(*)beginOF=1'b0;C32=1'b0;case(ALU_OP)3'b000:F=A&B;3'b001:F=A|B;3'b010:F=A^B;3'b011:F=~(A^B);3'b100:begin {C32,F}=A+B;OF=A[31]^B[31]^F[31]^C32;end 3'b101:begin {C32,F}=A-B;OF=A[31]^B[31]^F[31]^C32;end 3'b110:if(A<B)F=1;elseF=0;3'b111:F=B<<A;endcaseif(F==0)ZF=1;elseZF=0;endendmodule二、仿真波形三、电路图顶层电路模块顶层电路内部结构:四、引脚配置(约束文件)NET "LED[7]" LOC = T11;NET "LED[6]" LOC = R11;NET "LED[5]" LOC = N11;NET "LED[4]" LOC = M11;NET "LED[3]" LOC = V15;NET "LED[2]" LOC = U15;NET "LED[1]" LOC = V16;NET "LED[0]" LOC = U16;NET "SW[3]" LOC = M8;NET "SW[1]" LOC = T9;NET "SW[0]" LOC = T10;NET "clk_100MHz" LOC = V10;NET "oclk" LOC = C9;NET "rst" LOC = C4;NET "SW[2]" LOC = V9;五、思考与探索(1)R-I-J型指令CPU实验结果记录表序号指令执行结果标志结论1 00004020 $8=0000_0000 0 0 正确2 00004820 $9=0000_0000 0 0 正确3 200a0014 $10=0000_0014 0 0 正确4 8d2b0010 $11=0000_0010 0 0 正确5 010b4020 $8=0000_2222 0 0 正确6 21290004 $9=0000_0004 0 0 正确7 214affff $10=000_0013 0 0 正确8 11400001 判断:$10不为0 0 0 正确9 08000003 返回去执行地址为0 0 正确0000_0010的指令,即序号4:8d2b0010…………10 ac0b0030 存储器地址:0000_0030 0 0 正确。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
assign PC_new=PC+4;
always@( negedge clkor posedge rst)
begin
if(rst)
PC=32'h0000_0000;
else
PC={24'h000000,PC_new[7:0]};
end
endmodule
Inst_ROM文件:
memory_initialization_radix=16;
2016年5月10日 成绩:
姓名
学号
班级
专业
计算机科学与技术
课程名称
《计算机组成原理课程设计》
任课老师
章复嘉
指导老师
章复嘉
机位号
实验序号
5,6,7
实验名称
寄存器堆设计实验,MIPS汇编器与模拟器实验取,指令与译指令
实验时间
第6周~第14周
实验地点
一教225
实验设备号
一、实验程序源代码
实验五
module main(
input [0:0] wea,
input [7:2] addra,
output [31:0] douta,
input Clk,Reset,
input Write_Reg,
input [4:0] W_Addr,
input [31:0] W_Data,
input [4:0] R_Addr_A,R_Addr_B,
output [31:0] R_Data_A,R_Data_B
);
RAM A1(
.clka(Clk), ea(wea), ddra(addra[7:2]), ina(R_Data_A), outa(douta) lk(Clk),
.Reset(Reset),
.Write_Reg(Write_Reg),
六、意见和建议
.W_Addr(W_Addr),
.W_Data(W_Data),
.R_Addr_A(R_Addr_A),
.R_Addr_B(R_Addr_B),
.R_Data_A(R_Data_A),
.R_Data_B(R_Data_B)
);
endmodule
module RAM(
input clka,
input [0:0] wea,
input [7:2] addra,
input [31:
RAM_B your_instance_name (
.clka(clka), ea(wea), ddra(addra[7:2]), ina(dina), outa(douta)ddra(PC[7:2]),lka(clk), outa(Inst_Code) // output [31 : 0] douta
二、仿真波形
实验五
实验六
实验七:
三、电路图
实验5
实验7
四、引脚配置(约束文件)
五、思考与探索
实验5:
(3)设计实现一个ROM,常规存储器是单端口存储器,每次只接收一个地址,访问一个存储单元,从中读取或写入一个字节或字。主存储器是信息交换的中心,一方面CPU频繁地与主存交换信息,另一方面外设也较频繁地与主存交换信息,而单端口存储器每次只能接受一个访存者,或是读或是写,这就影响到存储器的整体工作速度。?
memory_initialization_vector=00000827,0001102b,00421820,00622020,00832820,00a33020,00463804,00a64820,01264004,00284826,01215020,01075822,00e86022,012c6820,012c7025,00c77825,00a78027,00e38820,02289004,02239804,00f3a004,0034a822,0255b025,0296b820,0253c022,0272c822,0032d026,02d4d82b,0354e02b,02c2e822,0282f020,017af820;