第一篇:计算机组成原理实验报告+++数据通路实验
数据通路组成实验
一、实验目的
(1)将双端口通用寄存器组和双端口存储器模块联机;
(2)进一步熟悉计算机的数据通路;
(3)掌握数字逻辑电路中故障的一般规律,以及排除故障的一般原则和方法;
(4)锻炼分析问题与解决问题的能力,在出现故障的情况下,独立分析故障现象,并排除故障。
二、实验电路
图9.14示出了数据通路实验电路图,它是将前面进行的双端口存储器实验模块和一个双端口通用寄存器组模块连接在一起形成的,存储器的指令端口不参与本次实验,通用寄存器组连接运算器模块,本实验涉及其中的操作数寄存器DR2。
由于RAM是三态门输出,因而可以将RAM连接到数据总线BUS上。此外,BUS上还连接着双端口通用寄存器组。这样,写入RAM的数据可由通用寄存器提供,而从RAM读出的数据也可送到通用寄存器保存。
RAM和DR2在前面的实验中使用过。对于通用寄存器组RF,它由一个在系统可编程(In System Programable)芯片ispLSI 1016固化了通用寄存器组的功能而成,其功能与双端口寄存器组MC14580相类似,内含四个8位的通用寄存器,带有一个输入端口和两个输出端口,从而可以同时写入一路数据,读出两路数据。输入端口取名为WR端口,连接一个8位的缓冲寄存器ER(已集成在ispLSI 1016芯片中),输出端口取名为RS端口、RD端口,分别连接运算器模块的两个操作数寄存器DR1、DR2,其中,连接DR1的RS端口还可通过一个8位的三态门RSO直接向BUS输出。双端口通用寄存器组模块的控制信号中,RS1、RS0用于选择从RS端口读出的通用寄存器,RD1、RD0用于选择从RD端口读出的通用寄存器,上述选择信号在T1脉冲的上升沿到来时生效。而WR1、WR0则用于选择从WR端口写入的通用寄存器。WRD是写入控制信号,WRD=1时,在T2上升沿的时刻,从ER写入数据;WRD=0时,ER中的数据不写入通用寄存器中。LDER信号控制ER从BUS写入数据,RS-BUS信号则控制RS端口到BUS的输出三态门。以上控制信号各自连接一个二进制开关。
三、实验设备
(1)JYS-4计算机组成原理实验仪一台(2)双踪示波器一台(3)直流万用表一只(4)逻辑测试笔一支
四、实验任务
(1)将实验电路与操作面板的有关信号进行线路连接,方法同前面的实验。(2)用8位数据开关向RF中的四个通用寄存器分别置入以下数据(十六进制):R0=0F,R1=F0,R2=55,R3=AA。
给R0置入0F的步骤是:先用8位数码开关将0F置入ER,并且选择WR1=WR0=0,再将ER的数据置入RF。给其他通用寄存器置入数据的步骤与此类似。
(3)分别将R0至R3中的数据同时读入到DR2寄存器和BUS上,观察其数据是否存入R0至R3中的数据,并记录数据。其中BUS上的数据可直接用指示灯显示,DR2中的数据可用逻辑笔测试有关引脚。
(4)用8位数码开关向AR1送入一个地址0F,然后将R0中的0F写入RAM。用同样的方法,依次将R1至R3中的数据写入RAM中的F0、55、AA单元。
(5)分别将RAM中AA单元的数据写入R0,55单元的数据写入R1,F0单元写入R2,0F单元写入R3。然后将R3、R2、R1、R0中的数据读出到BUS上,通过指示灯验证读出的数据是否正确,并记录数据。
(6)进行RF并行输入输出试验。
1.选择RS端口对应R0,RD端口对应R1,WR端口对应R2,并使WRD=1,观察并行输入输出的结果。选择RS端口对应R2,验证刚才的写入是否生效。记录数据。2.保持RS端口和WR端口同时对应R2,WRD=1,而ER中置入新的数据,观察并行输入输出的结果,RS端口输出的是旧的还是新的数据?(7)在数据传送过程中,发现了什么故障?如何克服的?
五、实验要求(1)做好实验预习和准备工作,掌握实验电路的数据通路特点和通用寄存器组的功能特性。(2)写出实验报告,内容为
1.实验目的;
2.如碰到故障,记录故障现象,排除故障的分析思路,故障定位及故障的性质; 3.实验数据记录;
4.值得讨论的其他问题。
第二篇:计算机组成CPU数据通路verilog实验报告
计算机组成与系统结构实验报告
实验目的:
院(系): 计算机科学与技术学院 专业班级: 学 号: 姓 名: 同 组 者: 指导教师: 实验时间: 2012 年 5 月 23 日
完成处理器的单周期cpu的设计。实验仪器:
PC机(安装Altebra 公司的开发软件 QuartusII)一台
实验原理:
控制器分为主控制器和局部ALU控制器两部分。主控制器的输入为指令操作码op,输出各种控制信号,并根据指令所涉及的ALU运算类型产生ALUop,同时,生成一个R-型指令的控制信号R-type,用它来控制选择将ALUop输出作为ALUctr信号,还是根据R-型指令中的func字段来产生ALUctr信号。
实验过程及实验记录: 1.设计过程:
第一步:分析每条指令的功能,并用RTL来表示。
第二步:根据指令的功能给出所需的元件,并考虑如何将它们互连。
第三步:确定每个元件所需控制信号的取值。
第四步:汇总各指令涉及的控制信号,生成所反映指令与控制信号之间的关系图。
第五步:根据关系表,得到每个控制信号的逻辑表达式,据此设计控制电路。
2.完成代码的编写,并调试运行。1)control module Control(op,func,Branch,Jump,RegDst,ALUSrc,ALUctr,MemtoReg,RegWr,MemWr,ExtOp);input [5:0] op,func;output reg Branch,Jump,RegDst,ALUSrc,MemtoReg,RegWr,MemWr,ExtOp;output reg [2:0] ALUctr;always @(op)case(op)6'b000000: begin Branch=0;Jump=0;RegDst=1;ALUSrc=0;MemtoReg=0;RegWr=1;MemWr=0;case(func)6'b100000:ALUctr=3'b001;6'b100010:ALUctr=3'b101;6'b100011:ALUctr=3'b100;6'b101010:ALUctr=3'b111;6'b101011:ALUctr=3'b110;endcase end 6'b001101: begin Branch=0;Jump=0;RegDst=0;ALUSrc=1;MemtoReg=0;RegWr=1;MemWr=0;ExtOp=0;ALUctr=3'b010;end 6'b001001: begin Branch=0;Jump=0;RegDst=0;ALUSrc=1;MemtoReg=0;RegWr=1;MemWr=0;ExtOp=1;ALUctr=3'b000;end
6'b100011: begin Branch=0;Jump=0;RegDst=0;ALUSrc=1;MemtoReg=1;RegWr=1;MemWr=0;ExtOp=1;ALUctr=3'b000;end 6'b101011: begin Branch=0;Jump=0;ALUSrc=1;RegWr=0;MemWr=1;ExtOp=1;ALUctr=3'b000;end 6'b000100: begin Branch=1;Jump=0;ALUSrc=0;RegWr=0;MemWr=0;ALUctr=3'b100;end 6'b000010: begin Branch=0;Jump=1;RegWr=0;MemWr=0;end endcase endmodule
2)数据通路DataRoad module DataRoad(Run,Clk,RegWr,MemWr,MemtoReg,RegDst,Branch,Jump,ExtOp,ALUctr,ALUSrc,busA,busB,busW,Instruction,Reg0,Reg1,Reg2,Reg3,Reg4,Mem1,Mem2,Mem3,Result,Im);input Run,Clk,RegWr,MemWr,MemtoReg,RegDst,Branch,Jump,ExtOp,ALUSrc;input [2:0] ALUctr;output [31:0] Instruction,busA,busB,busW,Reg0,Reg1,Reg2,Reg3,Reg4,Mem1,Mem2,Mem3,Result,Im;wire [31:0] busC,DataOut;
wire [15:0] im;wire [4:0] Rs,Rd,Rt;wire Overflow,Zero;QZL qzl(Clk,Branch,Jump,Zero,Instruction,Run);assign Rs=Instruction[25:21];assign Rt=Instruction[20:16];assign Rd=Instruction[15:11];assign im=Instruction[15:0];Register register(Run,RegWr,Overflow,RegDst,Rd,Rs,Rt,busW,busA,busB,Clk,Reg0,Reg1,Reg2,Reg3,Reg4);ALU alu(busA,busC,ALUctr,Zero,Overflow,Result);DataMem(Run,MemWr,Clk,busB,DataOut,Result,Mem1,Mem2,Mem3);MUX mux1(ALUSrc,busB,Im,busC);MUX mux2(MemtoReg,Result,DataOut,busW);Extender ext(im,Im,ExtOp);endmodule 3)取指令
module QZL(Clk,Branch,Jump,Zero,Instruction,Run);input Clk,Branch,Jump,Zero,Run;output [31:0] Instruction;wire [4:0] addmem;reg [29:0] PC;wire [29:0] Newpc,pc_1,pc_2,pc_3,pc_12,imm30;wire Branch_Zero;assign addmem={PC[2:0],2'b00};InsMem GetIns(addmem,Instruction);always @(negedge Clk)if(Run==1)begin PC<=Newpc;end else begin
PC<=0;end assign pc_1=PC+1;assign imm30={{14{Instruction[15]}},Instruction[15:0]};assign pc_2=pc_1+imm30;assign pc_3={PC[29:26],Instruction[25:0]};assign Branch_Zero=Branch&Zero;MUX m1(Branch_Zero,pc_1,pc_2,pc_12);MUX m2(Jump,pc_12,pc_3,Newpc);endmodule module InsMem(addmem,Instruction);input [4:0] addmem;output reg[31:0] Instruction;reg [31:0] Mem[31:0];always @(*)begin Mem[0]<={6'b100011,5'b00000,5'b00001,5'b00000,5'b00000,6'b000001};Mem[4]<={6'b100011,5'b00000,5'b00010,5'b00000,5'b00000,6'b000010};Mem[8]<={6'b000000,5'b00001,5'b00010,5'b00011,5'b00000,6'b100000};Mem[12]<={6'b101011,5'b00000,5'b00011,5'b00000,5'b00000,6'b000010};Mem[16]<={6'b001101,5'b00100,5'b00100,5'b11111,5'b11111,6'b111111};Mem[20]<={6'b000000,5'b00011,5'b00010,5'b00010,5'b00000,6'b100010};Mem[24]<={6'b000100,5'b00010,5'b00001,5'b00000,5'b00000,6'b001000};Mem[28]<={6'b000010,5'b00000,5'b00000,5'b00000,5'b00000,6'b000000};end always @(*)
Instruction=Mem[addmem];Endmodule
4)ALU module ALU(A,B,ALUctr,Zero,Overflow,Result);parameter n=32;input [n-1:0] A,B;input [2:0] ALUctr;output Zero,Overflow;output [n-1:0] Result;wire SUBctr,OVctr,SIGctr,SignA,SignB,Cin;wire [1:0] OPctr;wire [n-1:0] X,Y,Z,Less,M,N,Add_Result;wire Add_Carry,Add_Overflow,Add_Sign;assign M={n{1'b0}};assign N={n{1'b1}};assign SUBctr=ALUctr[2];assign OVctr=!ALUctr[1]&ALUctr[0];assign SIGctr=ALUctr[0];assign OPctr[1]=ALUctr[2]&ALUctr[1];assign OPctr[0]=!ALUctr[2]&ALUctr[1]&!ALUctr[0];assign Cin=SUBctr;assign X=B^{n{SUBctr}};assign Y=A|B;Adder ad(Cin,A,X,Add_Carry,Add_Overflow,Add_Sign,Add_Result,Zero);assign SignA=Cin^Add_Carry;assign SignB=Add_Overflow^Add_Sign;assign Overflow=Add_Overflow&OVctr;MUX m1(SIGctr,SignA,SignB,Less);defparam m1.k=1;MUX m2(Less,M,N,Z);MUX3_1 m3(Add_Result,Y,Z,Result,OPctr);
endmodule module MUX3_1(A,B,C,D,ctr);parameter k=32;input [k-1:0] A,B,C;output reg [k-1:0] D;input [1:0] ctr;always @(A or B or C or ctr)if(ctr==2'b00)D=A;else if(ctr==2'b01)D=B;else if(ctr==2'b10)D=C;endmodule module Adder(Cin,X,Y,Add_Carry,Add_Overflow,Add_Sign,Add_Result,Zero);parameter k=32;input [k-1:0] X,Y;input Cin;output reg [k-1:0] Add_Result;output Add_Carry,Add_Overflow,Add_Sign,Zero;reg Add_Carry;assign Zero=~|Add_Result;assign Add_Sign=Add_Result[k-1];assign Add_Overflow=(X[k-1]&Y[k-1]&~Add_Result[k-1])|(~X[k-1]&~Y[k-1]&Add_Result[k-1]);always @(X or Y or Cin){Add_Carry,Add_Result}=X+Y+Cin;Endmodule
5)数据存数 module DataMem(Run,MemWr,Clk,DataIn,DataOut,Adr,Mem1,Mem2,Mem3);
input Run,MemWr,Clk;input [31:0] DataIn,Adr;output [31:0] DataOut;output [31:0] Mem1,Mem2,Mem3;reg[31:0] Mem[31:0];assign Mem1=Mem[1];assign Mem2=Mem[2];assign Mem3=Mem[3];assign DataOut=Mem[Adr];always @(negedge Clk)if(Run==0)begin Mem[0]=0;Mem[1]=10;Mem[2]=20;Mem[3]=30;end else begin if(MemWr==1)Mem[Adr]=DataIn;end endmodule 6)寄存器 module Register(Run,Regwr,Overflow,RegDst,Rd,Rs,Rt,busW,busA,busB,Clk,Reg0,Reg1,Reg2,Reg3,Reg4);input Regwr,Clk,RegDst,Run,Overflow;input [31:0] busW;input [4:0] Rd,Rt,Rs;output reg [31:0] busA,busB;output [31:0] Reg0,Reg1,Reg2,Reg3,Reg4;reg [31:0] Mem[31:0];reg [4:0] Rw;
wire [4:0] Ra,Rb;wire RegWr;assign RegWr=Regwr&~Overflow;assign Ra=Rs;assign Rb=Rt;assign Reg0=Mem[0];assign Reg1=Mem[1];assign Reg2=Mem[2];assign Reg3=Mem[3];assign Reg4=Mem[4];always @(Rd or Rt or RegDst)if(RegDst==1'b1)Rw=Rd;else Rw=Rt;always @(negedge Clk)if(Run==1'b1)begin if(RegWr==1'b1)Mem[Rw]=busW;end else begin Mem[0]<=0;Mem[1]<=2;Mem[2]<=4;Mem[3]<=6;Mem[4]<=8;end always @(Ra or Rb)if(Run==1'b1)begin busA=Mem[Ra];busB=Mem[Rb];
end else begin busA=0;busB=0;end endmodule
7)数据选择
module MUX(ctr,X,Y,Z);parameter k=32;input [k-1:0] X,Y;output reg [k-1:0] Z;input ctr;always @(X or Y or ctr)if(ctr==1'b0)Z<=X;else Z<=Y;endmodule 3.进行仿真并验证其正确性:
第三篇:计算机组成原理实验报告
计算机科学与技术-计10计 算 机 组 成 原 理 实 验 报姓
名:
学
号:
班
级:
指 导 老 师:
郑
计算机科学与技术-计10
4一个上升沿,数据66H 被写入W 寄存器。3)将11H写入R0寄存器
①K23-K16开关置零,按[RST]钮,按[TV/ME]键三次,进入“Hand......”手动状态。②二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据11H
置控制信号为:
③按住STEP脉冲键,CK由高变低,观察现象;放开STEP键,CK由低变高,产生一个上升沿,数据11H 被写入R0 寄存器。4)将22H写入R1寄存器
①K23-K16开关置零,按[RST]钮,按[TV/ME]键三次,进入“Hand......”手动状态。②二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据22H
置控制信号为:
③按住STEP脉冲键,CK由高变低,观察现象;放开STEP键,CK由低变高,产生一个上升沿,数据22H被写入R1 寄存器。5)将33H写入R2寄存器
①K23-K16开关置零,按[RST]钮,按[TV/ME]键三次,进入“Hand......”手动状态。②二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据33H
置控制信号为:
③按住STEP脉冲键,CK由高变低,观察现象;放开STEP键,CK由低变高,产生一个上升沿,数据33H被写入R2 寄存器。
计算机科学与技术-计104
这时寄存器R3 的红色输出指示灯亮,R3 寄存器的数据送上数据总线。此时数据总线指示灯L7...L0为: 01000100.将K11(RRD)置为1,关闭R3 寄存器输出。11)将12H写入MAR寄存器
①K23-K16开关置零,按[RST]钮,按[TV/ME]键三次,进入“Hand......”手动状态。②二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据12H
置控制信号为:
③按住STEP脉冲键,CK由高变低,观察现象;放开STEP键,CK由低变高,产生一个上升沿,数据12H被写入MAR寄存器。12)将34H写入ST寄存器
①K23-K16开关置零,按[RST]钮,按[TV/ME]键三次,进入“Hand......”手动状态。②二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据34H
置控制信号为:
③按住STEP脉冲键,CK由高变低,观察现象;放开STEP键,CK由低变高,产生一个上升沿,数据34H被写入ST 寄存器。13)将56H写入OUT寄存器
①K23-K16开关置零,按[RST]钮,按[TV/ME]键三次,进入“Hand......”手动状态。②二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据56H
置控制信号为:
计算机科学与技术-计10
4(2)掌握简单运算器的数据传送通道。
(3)能够按给定数据,完成实验指定的算术/逻辑运算。
4.实验步骤:
①将55H写入A寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据55H
置控制信号为:
按住STEP脉冲键,CK由高变低,这时寄存器A的黄色选择指示灯亮,表明选择A寄存器。放开STEP键,CK由低变高,产生一个上升沿,数据55H被写入A寄存器。
②将33H写入W寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据33H
置控制信号为:
按住STEP脉冲键,CK由高变低,这时寄存器W 的黄色选择指示灯亮,表明选择W寄存器。放开STEP 键,CK 由低变高,产生一个上升沿,数据33H 被写入W 寄存器。
③置下表的控制信号,检验运算器的运算结果
计算机科学与技术-计10
4实验2:移位实验 将55H写入A寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据55H
置控制信号为:
按住STEP脉冲键,CK由高变低,这时寄存器A的黄色选择指示灯亮,表明选择A寄存器。放开STEP键,CK由低变高,产生一个上升沿,数据55H被写入A寄存器。
S2S1S0=111 时运算器结果为寄存器A内容
5.实验结果与分析:
移位与输出门是否打开无关,无论运算器结果如何,移位门都会给出移位结果。但究竟把那一个结果送数据总线由X2X1X0输出选择决定。表中第一行,A中寄存器值为55H=01010101,L为左移结果为:10101010B=AAH,D为直通输入结果为原值,R为右
计算机科学与技术-计10
4(2)按图3—6连接实验线路,仔细查线无误后接通源。
4.实验结果与分析:
① 编程
计算机科学与技术-计104
MAO清零,从而明确本机的运行入口微地址为000000(二进制)。
D.按动“START”键,启动时序电路,则每按动一次启动键,读出一条微指令后停机,此时实验台上的微地址显示灯和微命令显示灯将显示所读出的一条指令。注意:在当前条件下,可将“MICRO—CONTROLLER”单元的sE6一sEl接至“SWITCH UNIT”中的S3—Cn对应二进制开关上,可通过强置端sEl一sE6人为设置分支地址。将SEI—SE6对应二进制开关量为“1”,当需要人为设置分支地址时,将某个或几个二进制开关置“0”,相应的微地址位即被强置为“l”,从而改变下一条微指令的地址。(二进制开关置为“0”,相应的微地址位将被强置为“l”)④ 连续运行
A.将编程开关置为“RUN(运行)”状态。
B.将实验板的单步开关“STEP”置为“EXEC”状态。
C.使CLR从l→0→l,此时微地址寄存器清“0”,从而给出取指微指令的入口地址为 000000(二进制)。
D.启动时序电路,则可连续读出微指令。
5.实验注意事项:
此次实验主要要掌握微程序控制器的组成、工作原理;明确微程序、微指令、微命令的概念;掌握微指令、微程序的设计及调试方法;通过单步方式执行若干条微指令深入理解微程序控制器的工作原理;用逻辑分析仪测试微程序控制器指令的转移,微程序、微指
第四篇:计算机组成原理及实验报告
中南大学
计算机组成原理及汇编实验报告
姓 名: 代巍 学 号: 0909121615 专业班级: 信安1201 指导教师: 盛羽 学 院: 信息科学与工程学院
计算机组成原理实验
实验1 总线基本实验
一、实验目的
(1)掌握静态存储随机存储器RAM的工作特性(2)掌握静态存储随机存储器RAM的读写方法
二、实验设备
74LS374(一片),74LS245(一片),74LS273(一片),静态存储器MEMORY 6116(一片),8位数据排线(一片),与门(两片),与非门(一片),单脉冲(三片),开关若干,灯泡若干。
三、实验原理
总线传输实验框图如图4.1所示,它将几种不同的设备挂至总线上,有存储器、输入 设备、输出设备、寄存器。这些设备都需要有三态输出控制,按照传输要求恰当有序的控制 它们,就可实现总线信息传输。
总线传输实验框图
总线基本实验要求如下:根据挂在总线上的几个基本部件,设计一个简单的流程。(1)输入设备将一个数输入R0 寄存器。(2)输入设备将另一个数输入地址寄存器。
(3)将R0 寄存器中的数写入到当前地址的存储器中。(4)将当前地址的存储器中的数用LED 数码管显示。
四、实验步骤
(1)选择实验设备:根据实验原理图,将所需要的组件从组件列表中拖到实验设计流程栏中。
搭建实验流程:将已选择的组件进行连线(鼠标从一个引脚的端点拖动到另一组件的引脚端,即完成连线)。搭建好的实验流程图如图4.3所示。
(2)初始化各芯片的控制信号,仔细检查无误后点击 【电源开/关】按钮接通电源。
总线基本实验流程图
(3)实验的具体操作步骤如图4.2 所示。
首先应关闭所有三态门(SW-B=1,CS=1,R0-B=1,LED-B=1),并将关联的信号置为:LDAR=0,LDR0=0,W/R(RAM)=1,W/R(LED)=1。然后参照如下操作流程,先给数据开关置数,打开数据输出三态门,开关LDR0置1,并双击旁边的单脉冲,使产生一个上升沿将数据输入到R0 中;然后继续给数据开关置数,开关LDAR置1,并双击旁边的单脉冲,使产生一个上升沿将数据输入到AR 中;关闭数据开关三态门,打开R0 寄存器输出控制(开关LDR0和开关R0-B都置0),使存储器处于写状态(W/R=0、CS=0)将R0 中的数写到存储器中;关闭存储器片选,关闭R0 寄存器输出(开关R0-B置0),使存储器处于读状态(W/R=
1、CS=0)。
实验步骤图
五、实验结果及结果分析
实验截图
六、实验心得体会
通过本次本次实验:
(1)了解了一些逻辑器的组成结构(2)掌握一些逻辑器的工作原理(3)验证了各逻辑器件的组合功能
(4)了解了总线和各个器件之间的工作过程。
通过亲自动手,能更好的理解逻辑器件的组成及功能。同时实验中遇到各种问题,解决后,让自己的知识更加牢固。同时也意识到自己的不足,需要更加的努力!
汇编语言实验
实验2 汇编语言编程实验
一、实验目的
(1)掌握循环程序的设计方法
(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。
(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。(4)学会针对不同的问题,选用不同的组织循环的方法。
二、实验设备
PC机及masm for windows软件。
三、实验要求
(1)编辑一个指定的汇编语言源程序,并对其进行汇编、连接和运行。(2)利用DEBUG进行程序调试,掌握常用命令的使用方法,观察运行结果。
(3)汇编语言上机操作,掌握循环程序的过程和汇编实现原理,进一步熟练掌握DEBUG操作指令以及汇编语言源程序的编辑、汇编、连接及调试过程。
四、实验内容
实验一:编程计算1~100的和
实验二:编程计算 S=1+2*3+3*4+4*5+……+N*(N+1),N由用户输入,将结果在屏幕显示
实验三:编程计算SUM=1!+2!+3!+4!+5!,将结果输出,需要有子程序
五、程序源代码
实验一程序代码如下: DATA SEGMENT SUM1 DW 0,13,10,'$'
DATA ENDS STACK1 SEGMENT S DB 1000 DUP(0)STACK1 ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK1 START: MOV AX, DATA MOV DS, AX MOV AX, 0 MOV CX, 0
LOOP1: ADD AX, CX INC CX CMP CX, 101 JL LOOP1 MOV SUM1, AX lea di ,sum1 call cv mov ah,9 lea dx,sum1 int 21h jmp ok
cv:
push cx push dx xor cx,cx mov si,10 s0:
xor dx,dx inc cx div si push dx cmp ax,0 jnz s0 s1: pop dx add dl,“0”
mov byte ptr [di],dl inc di loop s1 mov al,20h s2:
cmp byte ptr [di],0 jz s3
cmp byte ptr [di],43h jz s3
mov byte ptr [di],al inc di jmp s2 s3: pop dx pop cx ret ok:
MOV AH,4CH INT 21H CODE ENDS END START
实验二程序代码如下: DATAS SEGMENT
s dw ?;此处输入数据段代码
n dw ?
DATAS ENDS STACKS SEGMENT
dw 64 dup(?);此处输入堆栈段代码 STACKS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
loop1:
clc
;此指令清除cf标志位cf=0
mov ah,1h
;通过给AH寄存器赋值,然后调用INT 21H指令,;计算机就会根据AH寄存器中的值执行相应的操作
;其中1H是键盘输入并回显,AL中有输入字符
int 21h
cmp al,0dh;比较是不是回车键,不改变操作数,只改变标志位,若ZF=1,则表示两数相等
je print;ZF=1,转至标号处执 表示输入完毕
cmp al,'0'
jz rotate;ZF=1,转至标号处执
stc
;此指令设置cf为1 rotate:
rcl bx,1
;注意这里是带进位左移,程序的思想所在 jmp loop1;无条件转移 print:
mov n,bx
MOV AX,DATAS
MOV DS,AX
mov bx,0001h
mov dl,02h lop2:mov al,bl
inc dl;加1
mul dl;无符号数乘法AX=oprd*al
add bx,ax
cmp ax,n;与n比较
jna lop2;不高于转移
mov s,bx
mov ch,4
mov cl,4 lop1:rol bx,cl
mov dl,bl
and dl,0Fh
cmp dl,09h
jbe next;低于等于转移
add dl,7 next:add dl,30h
mov ah,2
int 21h
dec ch
jnz lop1;非零转移
MOV AH,4CH
INT 21H CODES ENDS
END START 实验三程序代码如下:
DATA SEGMENT
OUTPUT_TIPS DB 10, 13, “1!+ 2!+ 3!+ 4!+ 5!=
NNN DW 1 DATA ENDS CODE SEGMENT
ASSUME CS:CODE, DS:DATA START:
MOV AX, DATA
MOV DS, AX
MOV BX, 2
;0、1 的阶乘都是 1 LOP:
MOV AX, BX
MOV CX, AX
CALL FACTOR
;用递归方法计算阶乘
$”
ADD AX, NNN
MOV NNN, AX
INC BX
CMP BX, 6
JNE LOP
MOV AX, NNN
DISP:
PUSH AX
MOV DX, OFFSET OUTPUT_TIPS
MOV AH, 9
;显示字符串.INT 21H
POP AX
MOV BX, 10
MOV CX, 0 L1:
MOV DX, 0
DIV BX
PUSH DX
INC CX
AND AX, AX
JNZ L1 L2:
POP DX
ADD DL, 48
MOV AH, 2
INT 21H
LOOP L2 EXIT:
MOV AH, 4CH
INT 21H
FACTOR PROC NEAR
;阶乘.DEC CX
;CX=2~8
CMP CX, 1
;=1 ?
JE
FACTOR_E
;为1就退出
PUSH CX
;非1压栈保存
CALL FACTOR
;递归调用,把CX一次次的减一
POP CX
;弹出一个个递减的数值
MUL CX
;乘到AX FACTOR_E:
RET
;AX=(2~8)!FACTOR ENDP
;简洁明了,无与伦比 CODE ENDS
END START
六、运行结果
实验一调试
实验一运行结果
实验二调试
实验二运行结果
实验三调试
实验三运行结果
七、实验总结
通过本次上机实验,学习了数值转换,循环,中断,分支结构等知识点。在课堂中听到的关于汇编语言中的循环和分支程序的知识点,我们将它实践化了,使得我们更深一步的认识和理解了循环程序和分支程序。在实验中,暴漏出来的问题就是,对于一些符号它所代表的是什么还是不熟悉,导致程序出现问题,因此,以后还要多看书,多练习,加强这方面的记忆。这次实验所学到的印象最深的就是LOOP循环以及有符号数跳转JLE。
总体上来讲,有些知识点理解的还不到位,希望通过以后的练习能加强对这些知识点的理解。实验过程中,遇到很多问题,比如程序一的编写,基本上都是学习书本以及依靠书本多做题才编出来的,仅有的几次上机实验,要抓紧时间学习和交流,时间挺少的。在今后的学习和生活中,我们都需要相互学习、相互交流,共同进步。学习是一个循序渐进的过程。通过这次实验,使我了解到运行调试程序的不易,今后一定更加努力,把程序做到最好!对于不足之处,会积极改正。掌握汇编语言程序编辑、汇编、连接、运行以及利用DEBUG调试程序的方法。加深对循环和分支程序结构的理解,掌握循环和分支结构程序设计的方法,熟练汇编语言程序上机调试的方法和过程。能够独立自主的编辑代码解决一些小问题,对汇编有了初步的了解。但仍有很多需要学习的地方!
第五篇:计算机组成原理实验报告
课程名称:计算机组成原理学
院:计算机科学与工程专
业:计算机科学与技术指导教师:廖建明学生姓名:林怡学
号:实验成绩:日
期:实验报告
2012060020023
2014 年 11
日月
电 子 科 技 大 学
实
验
报
告
一、实验一:ALU设计实验
二、实验室名称:主楼A2-411 实验学时:4
三、实验目的:
1.熟悉ALU的工作原理。2.掌握多个ALU的扩展方法。
3.掌握用硬件描述语言设计ALU的方法。
4.掌握数据的暂存和分时传送的方法。
四、实验内容
设计一个8bit ALU,实现两个8bit二进制数的算术运算和逻辑运算, ★算术运算(加、减);★逻辑运算(与、或、置
1、清0);实验要求:
1.设计一个4bitALU模块;
2.如何用4bitALU实现8bitALU的功能?
3.数据的输入/输出
输入: 只有8个开关,如何分时输入数据?
输出: 8个指示灯(数据),1个指示灯(进位/借位)
4.控制端输入
模式控制:(算术 / 逻辑)
运算方式控制:(+、-/ and、or、set、clr)
分时控制位:(输入数据的使能端)
数据输入控制脉冲:
五、实验原理: 实验原理图如图一:
图一
由图可知,ALU模块有四个输入,分别为寄存器A、B,模式控制端M与逻辑/算术运算方式控制端SE。输出为四位的D,同时还有一个进位/借位端cout。
其中M端为一位的输入,当M=1时,模块将用于逻辑运算,而M=0时,模块将进行算术运算。而两种运算模式下,两位的输入端SE的不同的值又将控制+、-/ and、or、set、clr等不同的运算方式。所以可以考虑采用if..else..结合case模块的方式来实现always块中的功能描述。
六、实验器材:
PC机、Xilinx ise7.1 集成开发坏境、pq208芯片一块
七、实验步骤:
1、在Xilinx ise7.1 集成开发坏境中输入实验代码,保存并验证其正确性;
2、将模块中使用到的开关与pq208的各个引脚的标号对应起来,并在xilinx中将其设置好;
3、将所需的开关与pq208的对应引脚用电线连接起来,之后将验证正确的代码下载到pq208芯片中;
4、根据实验要求操作各开关,观察指示灯的结果以验证实验的正确性;
实验代码如下:
module alu(A,B,M,SE,D,cout);input [3:0] A;input [3:0] B;input M;input [1:0] SE;output [3:0] D;output cout;reg [3:0] D;reg cout;always @(A,B,M,SE)begin
// 逻辑运算模式 if(M)begin case(SE)2'b00:D=A&B;//与运算 2'b01:D=A|B;//或运算 2'b10:D=4'b1111;//置1 2'b11:D=4'b0000;//置0 endcase end
else //算术运算模式
begin
case(SE)
2'b00: {cout,D}=A+B;//加法运算 2'b01:{cout,D}=A+B;2'b10: {cout,D}=A-B;//减法运算 2'b11:{cout,D}=A-B;endcase end end endmodule
I/O 端口与指示灯的连接方式: A[3:0] 与K1,K2,K3,K4相连,B[3:0]与K5,K6,K7,K8相连,M与K10相连,SE与K12,K11相连,cout与L5相连,输出端D[3:0]分别与L4,L3,L2,L1相连。
八、实验数据及结果分析:
电路图如图二、三所示:
图二
图三 图三中,当输入为0-1时,发现指示灯结果如为D[3:0]=1111 且cout=1。分析后可知,这个结果是由于-1的四位二进制补码表示为1111。
九、总结、改进建议及心得体会:
通过本次实验,我不仅完成了Verilog HDL语言从书本知识到实践的转化,同时也加深了对计算机CPU中的ALU模块的各种功能的了解。把自己设计的ALU模块加载到pq208芯片上进行仿真验证,非常好地锻炼了我的动手能力,看到自己写出的代码能够有实质性的成果展示也更好的调动了我的积极性。
总体来说,这次实验是非常有收获的。
电 子 科 技 大 学
实
验
报
告
一、实验二:存贮器设计实验
二、实验室名称:主楼A2-411 实验学时:4
三、实验目的:
1.掌握存贮器的读写控制方法,(读信号、写信号、片选信号)。2.掌握存储器的字扩展和位扩展方法。3.掌握用硬件描述语言设计存贮器的方法。4.了解存储器种类、工作原理和特点。
四、实验原理: 实验原理图如下图:
分析上图可知,我们要把16*4的存储器扩展为一个32*8的存储器模块,总共需要4块16*4的存储器模块。我们首先需要把两块16*4的模块连接在一起扩展为一块16*8的存储器模块,再对两块16*8的模块进行字扩展,最终把它们扩展为一块32*8的静态存储器模块。
五、实验内容:
用字扩展和位扩展的方式,设计一个32X8的静态存储器,能够对其随机的读写。其中:32表示地址的寻址空间大小,8表示数据单元的位数。要求:
1.设计一个16X4的可随机读写的存储器模块。
2.利用16X4存储器模块,如何通过级连实现32X8的存储器的功能。3.数据、地址的输入/输出
数据/地址的输入:开关控制。
数据的输出:指示灯显示。4.控制信号
片选:低有效。
读:低有效。
写:上升沿有效。
六、实验器材:
PC机、Xilinx ise7.1 集成开发坏境、pq208芯片一块
七、实验步骤:
1、把两块16*4的存储器模块位扩展为16*8的存储器模块;
2、继续把两块16*8的存储器模块字扩展为一块32*8的存储器模块;
3、在Xilinx ise7.1 集成开发坏境中把写好的实验代码保存;
4、将模块中使用到的开关与pq208的各个引脚的标号对应起来,将所需的开关与pq208的对应引脚用电线连接起来,之后将验证正确的代码下载到pq208芯片中;
5、根据实验要求操作各开关,对存储器进行读写操作并观察指示灯的结果以验证实验的正确性;
实验代码如下: 16*4存储器设计模块
module ram16_4(din,addr,wr,rd,cs,dout);
parameter D_WIDTH = 4;
parameter A_WIDTH = 4;
input[D_WIDTH-1:0] din;
//D[3:0] input[A_WIDTH-1:0] addr;
//AD[3:0] input wr,rd,cs;output[D_WIDTH-1:0]dout;
reg [D_WIDTH-1:0] ram [(2**A_WIDTH)-1:0];//16*4
wire [D_WIDTH-1:0] dout;
always @(posedge wr)
if(!cs)
ram[addr] <= din;
assign dout =(!(rd||cs))?ram[addr]:4'bzzzz;
//rd cs同时为低电平ram[addr] endmodule 16*8存储器设计模块
module ram16_8(d,ad,wr,rd,cs,dout);
input[4:0] ad;input[7:0] d;input wr,rd,cs;output[7:0] dout;ram16_4 m1(.din(d[3:0]),.addr(ad[3:0]),.wr(wr),.rd(rd),.cs(ad[4]|cs),.dout(dout[3:0]));ram16_4 m2(.din(d[7:4]),.addr(ad[3:0]),.wr(wr),.rd(rd),.cs(~ad[4]|cs),.dout(dout[7:4]));endmodule
32*8存储器设计模块
module ram32_8(d,ad,wr,rd,cs,dout);
input[4:0] ad;input[7:0] d;input wr,rd,cs;output[7:0] dout;ram16_8 ram16_8_1(.d(d[3:0]),.ad(ad[3:0]),.wr(wr),.rd(rd),.cs(ad[4]|cs),.dout(dout[3:0]));ram16_8 ram16_8_2(.d(d[7:4]),.ad(ad[3:0]),.wr(wr),.rd(rd),.cs(~ad[4]|cs),.dout(dout[7:4]));endmodule
八、实验数据及结果分析:
实验结果图如下:
九、总结、改进建议及心得体会:
本实验对存储器模块进行了字扩展和位扩展,将16*4的模块扩展为32*8的存储器模块,加深了我对于存储器扩展这部分知识的理解,同时让我对于Verilog HDL语言中的模块调用这部分的机制有了更深入的体会。
在验证实验结果的环节,自己动手操作对存储器模块进行读写操作也使我对于存储器这个计算机的重要组成部分有了一个更加感性的认识,对于它的寻址方式,片选逻辑等机制都有了更深层次的掌握。