华科_HUST_微机原理_类MIPS单周期微处理器设计_实验报告

华科_HUST_微机原理_类MIPS单周期微处理器设计_实验报告
华科_HUST_微机原理_类MIPS单周期微处理器设计_实验报告

微机原理实验报告

学号

姓名华中科技大学

专业通信1301

指导教师罗杰

院(系、所)电信学院

类MIPS单周期微处理器设计

一.实验目的

1.了解微处理器的基本结构。

2.掌握哈佛结构的计算机工作原理。

3.学会设计简单的微处理器。

4.了解软件控制硬件工作的基本原理。

二.实验任务

利用HDL语言,基于Xilinx FPGA nexys4实验平台,设计一个能够执行以下MIPS指令集的单周期类MIPS处理器,要求完成所有支持指令的功能仿真,验证指令执行的正确性,要求编写汇编程序将本人学号的ASCII码存入RAM的连续内存区域。

(1)支持基本的算术逻辑运算如add,sub,and,or,slt,andi指令

(2)支持基本的内存操作如lw,sw指令

(3)支持基本的程序控制如beq,j指令

三.各模块实现原理

1.指令存储器设计

指令存储器为ROM类型的存储器,为单一输出指令的存储器。设置一个程序计数器指针PC指向指令存储器,当时钟上升沿到来时,取出PC所指的指令,当时钟的下降沿到来时,修改PC的值,使其指向下一条要执行的指令。因此其对外的接口为clk、存储器地址输入信号(指令指针)以及数据输出信号(指令)。在本实验中调用ISE提供的IP核进行设计,设定的指令存储器大小为128字。

指令存储器模块在顶层模块中被调用。输入为指令指针(PC)与时钟信号(clkin),输出为32位的机器指令,并将输出的机器指令送到后续的寄存器组模块、控制器模块、立即数符号扩展模块进行相应的处理。

2.数据存储器设计

数据存储器为RAM类型的存储器,并且需要独立的读写信号控制。因此其对外的接口为clk、we、datain、addr;输出信号为dataout。当时钟上升沿到来时,如果写信号(we)为真,根据addr所表示的地址找到对应的存储单元,并将输入的数据(datain)写到对应的存储单元中;如果写信号为假,则根据addr所表示的地址,将对应存储单元的数据送到输出端(dataout)。在本实验中调用ISE提供的IP核进行设计,设定的数据存储器大小为64字。

数据存储器模块在顶层模块中被调用。输入的时钟信号来自于顶层模块的clkin,addr 信号来自于ALU单元的输出端(对基地址与偏移量执行加操作),datain来自于寄存器组的第二个数据输出端(Rtdata),而控制信号we则来自于控制器对指令的译码。输出数据dataout通过一个选择器(MUX3)决定是否写入到相应的寄存器。

3.寄存器组设计

寄存器组是指令操作的主要对象,MIPS中一共有32个32位寄存器。在指令的操作过程中需要区分Rs、Rt、Rd的地址和数据,并且Rd的数据只有在寄存器写信号有效时才能够写入,因此该模块的输入为clk、RegWriteData、RegWriteAddr、RegWriteEn、RsAddr、RtAddr 和reset,输出信号为RsData和RtData。由于$0一直输出0,因此当RsAddr、RtAddr为0时,RsData以及RtData必须输出0,否则输出相应地址寄存器数据。另外,当RegWriteEn

信号有效时,数据应该写入RegWriteAddr寄存器,并且每次复位时所有寄存器都清零。

寄存器组模块在顶层模块中被调用。clk信号来自于顶层模块的clkin,reset信号来自于顶层模块的reset,RegWriteData来自于ALU单元的运算结果输出端或者是数据存储器的输出端(通过一个选择器MUX3进行选择),RegWriteAddr、RsAddr、RtAddr来自于指令的对应位,RegWriteEn来自于控制器对指令的译码。输出信号Rsdata与Rtdata则分别来自于Rsaddr与Rtaddr对应的寄存器。

代码如下:

module regFile(

input clk,

input reset,

input [31:0] regWriteData,

input [4:0] regWriteAddr,

input regWriteEn,

output [31:0] RsData,

output [31:0] RtData,

input [4:0] RsAddr,

input [4:0] RtAddr

);

reg[31:0] regs[0:31];

assign RsData = (RsAddr == 5'b0)?32'b0:regs[RsAddr];

assign RtData = (RtAddr == 5'b0)?32'b0:regs[RtAddr];

integer i;

always @(posedge clk)

begin

if(!reset)

begin

if(regWriteEn==1)

begin

regs[regWriteAddr]=regWriteData;

end

end

else

begin

for(i=0;i<31;i=i+1)

regs[i]=0;

regs[31]=32'hffffffff;

end

end

endmodule

4.ALU设计

在这个简单的MIPS指令集中,微处理器支持的add、sub、and、or和slt运算指令,需要利用ALU单元实现运算,同时数据存储指令sw和lw也需要通过ALU单元计算存储器地

址,条件跳转指令beq需要ALU来比较两个寄存器是否相等。所有这些指令包含的操作为加、减、与、或和小于设置5钟不同的操作。

该模块根据输入控制信号对输入数据进行相应的操作,并获得输出结果以及零标识,由于MIPS处理器ALU单元利用4根输入控制信线的译码决定执行何种操作,于是该操作的输入接口为input1、input2和aluCtr,输出端口为zero和aluRes。

ALU模块在顶层模块被调用。input1来自于寄存器组模块输出信号Rsdata,input2来自于寄存器组模块输出信号Rtdata或者是立即数符号扩展模块的输出信号(通过一个选择器MUX2进行选择),aluCtr来自于aluctr模块的输出端。aluRes与zero为ALU单元的运算结果,其中zero主要用于beq指令。

代码如下:

module ALU(

input [31:0] input1,

input [31:0] input2,

input [3:0] aluCtr,

output [31:0] aluRes,

output zero

);

reg zero;

reg[31:0] aluRes;

always @(input1 or input2 or aluCtr)

begin

case(aluCtr)

4'b0110:

begin

aluRes=input1-input2;

if(aluRes==0)

zero=1;

else

zero=0;

end

4'b0010:

aluRes=input1+input2;

4'b0000:

aluRes=input1&input2;

4'b0001:

aluRes=input1|input2;

4'b1100:

aluRes=~(input1|input2);

4'b0111:

begin

if(input1

aluRes = 1;

end

default:

aluRes = 0;

endcase

end

endmodule

5.ALU控制设计

ALU单元对应的5种操作的编码。

MIPS指令中具有6位操作码,如果为R型指令,进一步采用6位功能码来表示R型指令的具体操作。由于设计的微处理器支持的运算类指令全部为R型指令,因此可以通过对R 型指令的6位功能码编码产生ALU的4为控制信号。但是lw、sw以及beq、j型指令没有功能码,因此需要区分指令的类型。由于只有三类指令需要ALU单元,因此可以采用两位二进制码对指令的ALU操作类型进行编码。指令的ALU操作类型编码由指令译码器产生。

通过2位操作类型码以及6位指令功能码就可以产生ALU单元的4位控制信号。

因此该模块的主要功能就是根据译码控制单元产生的2位操作码以及6位功能码产生4位ALU控制信号,因此输入信号为aluop(2位)、funct(6位),输出信号为aluctr(4位)。ALU控制模块在顶层模块被调用。aluop来自于控制器对指令的6位opcode的译码,而funct 来自于指令的后6位。

module aluctr(

input [1:0] ALUOp,

input [5:0] funct,

output [3:0] ALUCtr

);

reg[3:0] ALUCtr;

always @(ALUOp or funct)

casex({ALUOp,funct})

8'b00xxxxxx:ALUCtr=4'b0010;

8'b01xxxxxx:ALUCtr=4'b0110;

8'b11xxxxxx:ALUCtr=4'b0000;

8'b10xx0000:ALUCtr=4'b0010;

8'b10xx0010:ALUCtr=4'b0110;

8'b10xx0100:ALUCtr=4'b0000;

8'b10xx0101:ALUCtr=4'b0001;

8'b10xx1010:ALUCtr=4'b0111;

endcase

endmodule

6.控制器设计

控制器输入为指令的opCode字段,即操作码。操作码经过主控制单元的译码,给ALUCtrl、Data Memory、Registers、Muxs等部件输出正确的控制信号。

该模块在顶层模块中被调用,输入的opcode来自于指令的前6位,而输出信号aluSrc、MemToReg、RegWrite、MemRead、MemWrite、branch、aluop和jmp则是对6位opcode的译码。译码结果在此不做说明。

代码如下:

module ctr(

input [5:0] opCode,

output regDst,

output aluSrc,

output memToReg,

output regWrite,

output memRead,

output memWrite,

output branch,

output [1:0] aluop,

output jmp

);

reg regDst;

reg aluSrc;

reg memToReg;

reg regWrite;

reg memRead;

reg memWrite;

reg branch;

reg[1:0] aluop;

reg jmp; always @(opCode) begin

case(opCode)

6'b000010://jmp

begin

regDst=0;

aluSrc=0;

memToReg=0;

regWrite=0;

memRead=0;

memWrite=0;

branch=0;

aluop=2'b00;

jmp=1;

end

6'b000000://R

begin

regDst=1;

aluSrc=0;

memToReg=0;

regWrite=1;

memRead=0;

memWrite=0;

branch=0;

aluop=2'b10;

jmp=0;

end

6'b100011://lw

begin

regDst=0;

aluSrc=1;

memToReg=1;

regWrite=1;

memRead=1;

memWrite=0;

branch=0;

aluop=2'b00;

jmp=0;

end

6'b101011://sw begin

regDst=0;

aluSrc=1; memToReg=0; regWrite=0; memRead=0; memWrite=1; branch=0;

aluop=2'b00;

jmp=0;

end

6'b000100://beq begin

regDst=0;

aluSrc=0; memToReg=0; regWrite=0; memRead=0; memWrite=0; branch=1;

aluop=2'b01;

jmp=0;

end

6'b001100://andi begin

regDst=0;

aluSrc=1; memToReg=0; regWrite=1; memRead=0; memWrite=0; branch=0;

aluop=2'b11;

jmp=0;

end

default:

begin

regDst=0;

aluSrc=0;

memToReg=0;

regWrite=0;

memRead=0;

memWrite=0;

branch=0;

aluop=2'b00;

jmp=0;

end

endcase

end

endmodule

7.立即数符号扩展模块设计

对于I型指令,将指令的低十六位作为立即数符号扩展模块的输入inst[15:0],如果十六位立即数的最高位(即符号位)为1,则在inst[15:15]前面补16个1,如果为0,则在前面补16个0。然后将符号扩展之后的data[31:0]通过一个选择器(即MUX2)输送到ALU 单元的第二个源操作数输入端(即input2)。

代码如下:

module signext(

input [15:0] inst,

output [31:0] data

);

assign data=inst[15:15]?{16'hffff,inst}:{16'h0000,inst};

endmodule

8.顶层设计

顶层模块需要将前面的多个模块实例化后,通过导线以及多路复用器将各个部件连接起来,并且在时钟的控制下修改PC的值,PC是一个32位的寄存器,每个时钟沿自动增加4。

多路复用器MUX直接通过三目运算符实现,例如

assign OUT = SEL ? INPUT1 : INPUT2;

其中,OUT、SEL、INPUT1和INPUT2都是预先定义的信号。

代码如下:

module top(

input clkin,

input reset

);

reg[31:0] pc,add4;

wire choose4;

wire[31:0] expand2,mux2,mux3,mux4,mux5,address,jmpaddr,inst;

wire[4:0] mux1;

//wire for controller

wire reg_dst,jmp,branch,memread,memwrite,memtoreg;

wire[1:0] aluop;

wire alu_src,regwrite;

//wire for aluunit

wire zero;

wire[31:0] aluRes;

//wire for aluctr

wire[3:0] aluCtr;

//wire for memory

wire[31:0] memreaddata;

//wire for register

wire[31:0] RsData,RtData;

//wireforext

wire[31:0] expand;

always @(negedge clkin)

begin

if(!reset) begin

pc=mux5;

add4=pc+4;

end

else begin

pc=32'b0;

add4=32'h4;

end

end

ctr mainctr(

.opCode(inst[31:26]),

.regDst(reg_dst),

.aluSrc(alu_scr),

.memToReg(memtoreg),

.regWrite(regwrite),

.memRead(memread),

.memWrite(memwrite),

.branch(branch),

.aluop(aluop),

.jmp(jmp));

ALU alu(.input1(RsData),

.input2(mux2),

.aluCtr(aluCtr),

.zero(zero),

.aluRes(aluRes));

aluctr aluctr1(.ALUOp(aluop), .funct(inst[5:0]),

.ALUCtr(aluCtr));

dram dmem(

.a(aluRes[7:2]),

.d(RtData),

.clk(!clkin),

.we(memwrite),

.spo(memreaddata)

);

irom_number imem(

.a(pc[8:2]),

.clk(clkin),

.spo(inst)

);

regFile regfile(

.RsAddr(inst[25:21]),

.RtAddr(inst[20:16]),

.clk(!clkin),

.reset(reset),

.regWriteAddr(mux1),

.regWriteData(mux3),

.regWriteEn(regwrite),

.RsData(RsData),

.RtData(RtData)

);

signext signext(.inst(inst[15:0]),.data(expand));

assign mux1=reg_dst?inst[15:11]:inst[20:16];

assign mux2=alu_scr?expand:RtData;

assign mux3=memtoreg?memreaddata:aluRes;

assign mux4=choose4?address:add4;

assign mux5=jmp?jmpaddr:mux4;

assign choose4=branch&zero;

assign expand2=expand<<2;

assign jmpaddr={add4[31:28],inst[25:0],2'b00};

assign address=pc+expand2;

endmodule

四.ROM程序设计

本程序的目的是将自己学号的ASCII码存储到数据存储器中。每个字存储一个ASCII 码。汇编程序代码如下:

main:

addi $2,$0,85 #U

sw $2,0($3)

addi $2,$0,50 #2

sw $2,4($3)

addi $2,$0,48 #0

sw $2,8($3)

addi $2,$0,49 #1

sw $2,12($3)

addi $2,$0,51 #3

sw $2,16($3)

addi $2,$0,49 #1

sw $2,20($3)

addi $2,$0,51 #3

sw $2,24($3)

addi $2,$0,54 #6

sw $2,28($3)

addi $2,$0,53 #5

sw $2,32($3)

addi $2,$0,49 #1

sw $2,36($3)

j main

对应的机器码为:

MEMORY_INITIALIZATION_RADIX=16;

MEMORY_INITIALIZATION_VECTOR=

20020055,

ac620000,

20020032,

ac620004,

20020030,

ac620008,

20020031,

ac62000c,

20020033,

ac620010,

20020031,

ac620014,

20020033,

ac620018,

20020036,

ac62001c,

20020035,

ac620020,

20020031,

ac620024,

08100000,

特别值得注意的有两点:一是寄存器组中的$1号寄存器被系统占用,在编写汇编代码时不可使用,否则Qtspim会报错;二是机器码的最后一条指令是跳转到程序入口main处,应将机器码改为08100000。

把coe文件导入irom中,如下图所示:

四.模块仿真

1.寄存器组仿真:

代码如下:

module regsim;

// Inputs

reg clk;

reg reset;

reg [31:0] regWriteData;

reg [4:0] regWriteAddr;

reg regWriteEn;

reg [4:0] RsAddr;

reg [4:0] RtAddr;

// Outputs

wire [31:0] RsData;

wire [31:0] RtData;

// Instantiate the Unit Under Test (UUT)

regFile uut (

.clk(clk),

.reset(reset),

.regWriteData(regWriteData),

.regWriteAddr(regWriteAddr),

.regWriteEn(regWriteEn),

.RsData(RsData),

.RtData(RtData),

.RsAddr(RsAddr),

.RtAddr(RtAddr)

);

integer i;

initial begin

// Initialize Inputs

clk = 0;

reset = 0;

regWriteData = 0;

regWriteAddr = 0;

regWriteEn = 0;

RsAddr = 0;

RtAddr = 0;

// Wait 100 ns for global reset to finish

#100;

// Add stimulus here

regWriteData=32'h55aaaa55;

regWriteEn=1;

reset=1;

#100;

reset=0;

end

parameter PERIOD = 20;

always begin

clk = 1'b0;

#(PERIOD/2) clk = 1'b1;

#(PERIOD/2);

end

always begin

for(i = 31; i>= 1; i=i-1) begin

regWriteAddr = i;

RsAddr=i;

#PERIOD;

end

end

Endmodule

结果如下:

Reset高电平下输出为0,Reset无效后,正常输入和输出数据,Reset正常工作。

第一次for循环的地址范围输出数据在低电平时输出0,高电平输出0x55aaaa55,如图所示,说明数据是在时钟上升沿写入,之后输出的数据与写入的数据相同,数据都保存在了寄存器组中,工作正常。

2.控制器仿真:

代码如下:

如下:

module ctrsim;

// Inputs

reg [5:0] opCode;

// Outputs

wire regDst;

wire aluSrc;

wire memToReg;

wire regWrite;

wire memRead;

wire memWrite;

wire branch;

wire [1:0] aluop;

wire jmp;

// Instantiate the Unit Under Test (UUT)

ctr uut (

.opCode(opCode),

.regDst(regDst),

.aluSrc(aluSrc),

.memToReg(memToReg),

.regWrite(regWrite),

.memRead(memRead),

.memWrite(memWrite),

.branch(branch),

.aluop(aluop),

.jmp(jmp)

);

initial begin

// Initialize Inputs

opCode = 0;

// Wait 100 ns for global reset to finish

#100;

opCode=6'b000010;//jump

#100;

opCode=6'b000000;//R

#100;

opCode=6'b100011;//lw

#100;

opCode=6'b101011;//sw

#100;

opCode=6'b000100;

end

Endmodule

结果如下,对比之前的表格,工作正常。

3.顶层仿真:

代码如下:

module topsim;

// Inputs

reg clkin;

reg reset;

// Instantiate the Unit Under Test (UUT)

top uut (

.clkin(clkin),

.reset(reset)

);

initial begin

// Initialize Inputs

clkin = 0;

reset = 0;

// Add stimulus here

#100;

reset = 1;

#100;

reset = 0;

end

parameter PERIOD = 20;

always begin

clkin = 1'b0;

#(PERIOD/2) clkin = 1'b1;

#(PERIOD/2);

End

Endmodule

可以查看寄存器模块的regWriteData为0x55555555,regWriteAddr为04,且RegWriteEnd 为1,表示将对4号寄存器写入数据0x55555555,结果正常。

4.加学号至RAM的仿真

coe文件导入ROM后,学号U201313651已经存进RAM中了,并可以得到以下的仿真波形:

五.实验总结

这个实验总体来讲,是比较有挑战性的,通过本次实验,我加深了对MIPS微处理器的理解。通过对代码的编写与对指令执行过程的仿真,我很清楚的知道了MIPS微处理器中指令的执行过程以及各模块之间的相互关系(比如说控制信号、数据传递等等)。同时本次实验

也加深了我对verilog语言的掌握,特别是我学会了通过仿真波形来查错与对模块功能作相应的调整。本次实验虽然有点繁琐,但是我感觉收获颇多。

微机原理学习心得

微机原理学习心得 本学期的微机原理课程即将要结束,以下是关于微机这门课程的心得体会: 初学《微机原理》时,感觉摸不着头绪。面对着众多的术语、概念及原理性的问题不知道该如何下手。在了解课程的特点后,我发现,应该以微机的整机概念为突破口,在如何建立整体概念上下功夫。“麻雀虽小,五脏俱全”可以通过学习一个模型机的组成和指令执行的过程,了解和熟悉计算机的结构、特点和工作过程。 《微机原理》课程有许多的新名词、新专业术语。透彻理解这些名词、术语的意思,为今后深入学习打下基础。一个新的名词从首次接触到理解和应用,需要一个反复的过程。而在众多概念中,真正关键的有很多。比如“中断”概念,既是重点又是难点,如果不懂中断技术,就不能算是搞懂了微机原理。在学习中凡是遇到这种情况,绝对不轻易放过,要力求真正弄懂,搞懂一个重点,将使一大串概念迎刃而解。 学习过程中,我发现许多概念很接近,为了更好的掌握,将一些容易混淆的概念集中在一起进行分析,比较它们之间的异同点。比如:微机原理中,引入了计算机由五大部分组成这一概念;从中央处理器引出微处理器的定义;在引出微型计算机定义时,强调输入/输出接口的重要性;在引出微型计算机系统的定义时,强调计算机软件与计算机硬件的相辅相成的关系。微处理器是微型计算机的重要组成部

分,它与微型计算机、微型计算机系统是完全不同的概念。 在微机中,最基础的语言是汇编语言。汇编语言是一个最基础最古老的计算机语言。语言总是越基础越重要。在重大的编程项目中应用最广泛。就我的个人理解,汇编是对寄存的地址以及数据单元进行最直接的修改。而在某些时候,这种方法是最有效,最可靠的。比如,最近闹得沸沸扬扬的珊瑚虫一案,其软件制作的核心人物就是使用汇编语言来创造闻名遐迩的QQ查IP软件-----珊瑚虫,并成立了有名的珊瑚虫工作室,其威力可见一斑。 然而,事物就是有两面性,有优点自然缺点也不少。其中,最重要的一点就是,汇编语言很复杂,对某个数据进行修改时,本来很简单的一个操作会用比较复杂的语言来解决,而这些语言本身在执行和操作的过程中,占有大量的时间和成本。在一些讲求效率的场合,并不可取。 汇编语言对学习其他计算机起到一个比较、对照、参考的促进作用。学习事物总是从最简单的基础开始的。那么学习高级语言也当然应当从汇编开始。学习汇编语言实际上是培养了学习计算机语言的能力和素养。个人认为,学习汇编语言对学习其他语言很有促进作用。 汇编语言在本学期微机学习中有核心地位。本学期微机原理课程内容繁多,我认为在学习中要考虑到“学以致用”,不能过分强调课程的系统性和基本理论的完整性,而应该侧重于基本方法和应用实例。从微机应用系统的应用环境和特点来看,微机系统如何与千变万化的外部设备、外部世界相连,如何与它们交换信息,是微机系统应用中的关键所在,培养一定的微机应用系统的分析能力和初步设计能

微机软件实验习题与答案(完整版)

微机原理软件实验 实验1 两个多位十进制数相加的实验 实验容:将两个多位十进制数相加,要求加数和被加数均以ASCII码形式各自顺序存放以DATA1和DATA2为首的5个存单元中(低位在前),结果送回DATA1处。完整代码如下: DATAS SEGMENT ;此处输入数据段代码 STRING1 DB'input the first number:','$' STRING2 DB 13,10,'input the second number:','$' STRING3 DB 13,10,'the output is:','$' DATA1 DB 6 DUP(00H),'$' DATA2 DB 6 DUP(00H),'$' DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码 LEA SI,DATA1 LEA DI,DATA2 L0: LEA DX,STRING1;打印字符串STRING1 MOV AH,09 INT 21H INPUT1: ;输入第一个数 MOV AH,01;输入字符至AL中 INT 21H CMP AL,'/' JE L1 MOV [SI],AL INC SI

JMP INPUT1 L1: LEA DX,STRING2;打印字符串STRING2 MOV AH,09 INT 21H INPUT2: ;输入第二个数 MOV AH,01;输入字符至AL INT 21H CMP AL,'/' JE L2 MOV [DI],AL INC DI JMP INPUT2 L2: MOV SI,0 CLC;清空进位标志位CF MOV CX,6

微机实验心得体会

微机实验心得体会 【篇一:微机原理实验报告】 一、实验目的 1.掌握qtspim的调试技术 2.了解mips汇编语言与机器语言之间的对应关系 3.掌握mips汇编程序设计 4.了解c语言语句与汇编指令之间的关系 5.熟悉常见的mips汇编指令 6.掌握程序的内存映像 二、实验任务 用汇编程序实现以下伪代码:要求采用移位指令实现乘除法运算。 int main() { int k, y ; int z[50] ; y = 56; for(k=0;k50;k++) z[k] = y - 16 * ( k / 4 + 210) ; } 三、实验要求 1.完成汇编语言程序设计、调试、测试全过程 2.指出用户程序的内存映像,包括代码段和数据段 3.完成软件实验报告 四、实验过程 程序源代码: .data #定义用户数据段 z:.space 200 .text main: la $s0,z #$s0=addrz li $t0,0 #$s1=k=0 li $t1,56 #$s2=y=56 loop: slti $t2,$t0,50 #判断k是否小于50 beq $t2,$0,done #当k大于等于50时跳转 srl $t3,$t0,2 #k/4 addi $t3,$t3,210 #k/4+210

sll $t3,$t3,4 #16*(k/4+210) sub $t3,$t1,$t3 #y-16*(k/4+210) sw $t3,0($s0) #写进z[k] addi $s0,$s0,4 #地址移一位 addi $t0,$t0,1 #k加1 j loop #循环 done: li $v0 10 syscall 五、实验总结 通过这次实验,加深了我对理论学习的代码书写规范的理解,练习 了qtspim软件的使用,对以后的学习有很大的帮助。这次实验的内 容相对比较简单,原理容易理解,编译的过程中遇到了一点困难, 不过在同学的帮助下顺利解决了。 【篇二:微机原理与接口技术实验总结】 微机原理与接口技术实验总结 11107108徐寒黎 一、实验内容以及设计思路 1、①试编写一程序,比较两个字符串string1、 string2 所含字符 是否相同,若相同输出“match”,若不相同输出“no match”。 设计思路:定义一个数据段,在数据段中定义两个字符串作为 string1、 string2以及几个用于输入提示的和输出所需内容的字符串,定义一个堆栈段用于存放,定义代码段。关键步骤以及少量语句:第一步将string1和string2都实现用键盘输入,方法是 mov dx,offset string2 mov ah,0ah 并且显示在显示器上,显示方法将0ah改成09h,语句与上面类似。然后进行比较第一个单元, mov al,[string1+1] cmp al,[string2+1] jnz nomatch 若字符串长度不等,则直接跳转,输出输出“no match”; 若长度相等再逐个比较 lea si,[string1+2] lea di,[string2+2] mov cl,[string1+1]

微机原理实验报告

西安交通大学实验报告 课程_微机与接口技术第页共页 系别__生物医学工程_________实验日期:年月日 专业班级_____组别_____交报告日期:年月日 姓名__ 学号__报告退发 ( 订正、重做 ) 同组人_教师审批签字 实验一汇编语言程序设计 一、实验目的 1、掌握Lab6000p实验教学系统基本操作; 2、掌握8088/8086汇编语言的基本语法结构; 3、熟悉8088/8086汇编语言程序设计基本方法 二、实验设备 装有emu8086软件的PC机 三、实验内容 1、有一个10字节的数组,其值分别是80H,03H,5AH,FFH,97H,64H,BBH,7FH,0FH,D8H。编程并显示结果: 如果数组是无符号数,求出最大值,并显示; 如果数组是有符号数,求出最大值,并显示。 2、将二进制数500H转换成二-十进制(BCD)码,并显示“500H的BCD是:” 3、将二-十进制码(BCD)7693转换成ASCII码,并显示“BCD码7693的ASCII是:” 4、两个长度均为100的内存块,先将内存块1全部写上88H,再将内存块1的内容移至内存块2。在移动的过程中,显示移动次数1,2 ,3…0AH…64H(16进制-ASCII码并显示子

程序) 5、键盘输入一个小写字母(a~z),转换成大写字母 显示:请输入一个小写字母(a~z): 转换后的大写字母是: 6、实现4字节无符号数加法程序,并显示结果,如99223344H + 99223344H = xxxxxxxxH 四、实验代码及结果 1.1、实验代码: DATA SEGMENT SZ DB 80H,03H,5AH,0FFH,97H,64H,0BBH,7FH,0FH,0D8H;存进数组 SHOW DB 'THE MAX IS: ','$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA ;把数据的基地址赋给DS MOV DS,AX MOV DX,OFFSET SHOW ;调用DOS显示字符串 MOV AH,09H INT 21H MOV SI ,OFFSET SZ ;数组的偏移地址赋给SI MOV CX,10 ;存进数组的长度给CX MOV DH,80H ;将数组的第一个数写进DH NEXT: MOV BL,[SI] ;将数组的第一个数写进BL CMP DH,BL ;比较DH和BL中数的到校 JAE NEXT1 ;如果DH中的数大于BL中,将跳转到NEXT1 MOV DH,BL ;如果DH中的数小于BL中,将BL中的数赋给DH NEXT1: INC SI ;偏移地址加1 LOOP NEXT;循环,CX自减一直到0,DH中存数组的最大值 ;接下来的程序是将将最大值DH在屏幕上显示输出 MOV BX,02H NEXT2: MOV CL,4 ROL DH,CL ;将DH循环右移四位

内蒙古工业大学微机原理实验指导答案.doc

被嗅材尊机原理与旅用实验指导布实验 程禹够告 沽说:信息工程修陇班披, 电8 77-7班g生名:Eg 样号,2011202030 实验一编辑、汇编、 连接、调试程序的使用 程序设计A 设计要求 (1)将FFFFH 送到AX, SI, DI, BP, DS, ES 寄存器 (2)编程(利用DEBUG调试程序,每执行一次T命令后,记录相关寄存器

内容,并判断是否正确。)程序如下: CODE SEGMENT ASSUME CS:CODE START PROC FAR STTPUSH DS SUB AX,AX PUSH AX MOV AX,0FFFFH MOV SI,AX MOV DI,AX MOV BP,AX MOV DS,AX MOV ES,AX RET STARTENDP CODE ENDS END STT B、设计要求 ⑴将1,2,3,4,5分别送到数据段偏移地址为1000H, 1001H, 1002H, 1003H, 1004H,单元中。 ⑵编程 DATA SEGMENT ORG 1000H DATA ENDS CODE SEGMENT ASSUME CS:CODE START PROC FAR STTPUSH DS SUB AX,AX PUSH AX MOV AX, DATA MOV DS,AX MOV AL,1 MOV DS:[1000H],AL

MOV AL,2 MOV DS:[1001H],AL MOV AL,3 MOV DS:[1002H],AL MOV AL,4 MOV DS:[1003H],AL MOV AL,5 MOV DS:[1004H],AL RET STARTENDP CODE ENDS END STT 实验二、加法程序设计 设计内容A、设计要求 (1)在数据段偏移地址1000H处开始,连续存放有3字节的数据(高位对应高地 址,低位对应低地址),1003H处开始连续存放有两字节的数据(高对高,低 对低),求这两数据之和,并将结果放在流量数据之后。(eg: 1234 56H+78 9AH=12 AC FOH) (2)编程 DATA SEGMENT ORG 1000H H1 DB56H J34H,12H,9AH,78H H2 DB 3DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START PROC FAR STTPUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOVSIJOOOH MOV DI,1003H MOV BX,1005H MOV CX,2 CLC LP:MOVAL,[SI] MOV DL,[DI[ ADCAL,DL MOV [BX],AL INC SI

微机原理实验并行IO接口设计

微机原理实验三并行I/O接口实验 姓名: 学号: 班级:

一、实验目的 1. 掌握GPIOIP核的工作原理和使用方法 2.掌握中断控制方式的IO接口设计原理 3.掌握中断程序设计方法 4.掌握IO接口程序控制方法:中断方式、查询方式、延时方式 二、实验任务 按键输入,并显示到console 用中断、查询两种方式实现按键输入,将结果显示到console窗口。 三、硬件电路 四、硬件实现步骤 1. 创建一个最小系统,启动XPS,并打开xmp工程文件。 2.添加和配置GPIO IP核。

3. 添加和配置AXI Interrupt Controller IP核。 4. 产生外部GPIO连接。 引脚约束 五、中断方式、查询方式 1. 中断方式设计思路 主程序开放microBlaze INTC,GPIO中断,不停地检测输出标志是否为1,是则输出数据到console,并将输出标志设置为0。中断服务程序读取数据(或输出数据)并设立输出标志位为1。

通过中断方式读入开关的状态,由于按键仅短暂的时间维持高电平,并且还具有抖动,因此需在中断服务程序内读入按键状态,并且为消除按键回弹产生的中断,需在中断服务程序内部暂时关闭中断,并且延时一段时间再打开中断。 2. 查询方式设计思路 主程序不停地读取GPIO和ISR寄存器,当对应位为1时,读取GPIO的数据寄存器并输出到console(xil_printf函数实现,头文件为”stdio.h”),并写ISR相应位。数据寄存器的读取通过函数Xil_In实现,而ISR相应状态为的写通过函数Xil_Out实现。 六、软件实现流程 1. 中断方式主程序实现 对各个设备进行初始化,并且开放相应的中断,注册中断服务程序以及开关状态显示等。然后通过读取中断标志进入相应中断服务程序处理中断,并在console打印相关信息。 2. 查询方式程序实现 通过不断地读取GPIO和ISR寄存器,当状态发生变化时读取数据寄存器并输出到console,并写ISR相应位。 七、软件源代码 1. 中断方式源代码 #include"xparameters.h" #include"xgpio.h" #include"xintc.h" #include"stdio.h" void Initialize(); void Delay_50ms(); void PushBtnHandler(void *CallBackRef); void SwitchHandler(void *CallBackRef); XGpio Btns,Dips;//按键BTNS外设变量 XIntc intCtrl;//定义一个XINTC外设变量 int pshBtn,pshDip; int state1,state2; int main() { Initialize(); xil_printf("\r\nRunning GpioInputInterrupt!\r\n"); while(1)

微机原理实验报告软件实验1-4

微机原理实验报告 学院:算机科学与软件教育学院 1. 掌握存储器读写方法 2. 了解存储器的块操作方法 二、实验原理 存储器读写和块操作 三、实验设备仪器及材料 计算机,WA VE 6000软件 四、实验过程 S1.asm 代码流程图 data segment Block db 256 dup(55h) data ends code segment assume cs:code, ds:data start proc near mov ax, data mov ds, ax mov bx, offset Block ; 起始地址 mov cx, 256 ; 清256 字节Again: mov [bx], byte ptr 0 inc bx ; 地址+1 Loop Again ; 记数减一jmp $ ;死循环code ends end start

五、实验步骤 (1) 进入Wave6000,输入程序并检查,保存程序。 (2) “编译”程序。 (3) “全速执行”程序。 (4) “暂停”程序运行,在“数据窗口(MEMOREY)”查看0400H起始的单元内容,并记录。 (5) 在指令“jmp $”处设断点。“全速执行”程序。 (6) 在“数据窗口(MEMOREY)”查看0400H起始的单元内容,记录并分析实验结果。 六、实验结果及总结 运行前:运行后: 2、调试:如何将存储器块的内容置成某固定值(例全填充为0FFH)? 总结:通过本实验,我了解到单片机读写存储器的读写方法,同时也了解到单片机编程,调试方法。学会内存的移动方法,也加深对存储器读写的认识。

微机原理实验报告 学院:算机科学与软件教育学院 实验 课程 名 微机原理实验成绩实验 项目名称实验二、二进制到BCD码转换 指导老 师 1. 了解BCD值和ASCII值的区别。 2. 了解如何将BCD值转换成ASCII值。 3. 了解如何查表进行数值转换及快速计算。 二、实验原理 ASCII码表 三、实验设备仪器及材料 计算机,WA VE 6000软件 data segment Result db 3 dup(?) data ends code segment assume cs:code, ds:data start proc near mov ax, data mov ds, ax mov ax, 123 mov cl, 100 div cl mov Result, al ; 除以 100, 得百位数 mov al, ah mov ah, 0 mov cl, 10 div cl mov Result+1, al ; 余数除以 10, 得十位数 mov Result+2, ah ; 余数为个位 数 jmp $ code ends end start 代码流程图

微机原理实验报告

汇编语言程序设计实验 一、实验内容 1.学习并掌握IDE86集成开发环境的使用,包括编辑、编译、链接、 调试与运行等步骤。 2.参考书例4-8,P165 (第3版161页)以单步形式观察程序的 执行过程。 3.修改该程序,求出10个数中的最大值和最小值。以单步形式观 察,如何求出最大值、最小值。 4.求1到100 的累加和,并用十进制形式将结果显示在屏幕上。 要求实现数据显示,并返回DOS状态。 二、实验目的 1.学习并掌握IDE86集成开发环境的使用 2.熟悉汇编语言的基本算法,并实际操作 3.学会利用IDE86进行debug的步骤 三、实验方法 1.求出10个数中的最大值和最小值 (1)设计思路:利用冒泡法,先对数据段的10个数字的前2个比 较,把二者中大的交换放后面。在对第二个和第三个数比较,把 二者中较大的交换放后面,依此类推直到第十个数字。这样第十 位数就是10个数里面最大的。然后选出剩下9个数字里面最大 的,还是从头开始这么做,直到第九个数字。以此类推直到第一 个数字。

(2)流程图 2.求1到100 的累加和,并用十进制形式将结果显示在屏幕上。 要求实现数据显示,并返回DOS状态

(1)设计思路:结果存放在sum里面,加数是i(初始为1),进行 100次循环,sum=sum+I,每次循环对i加1. (2)流程图: 四、 1.求出10个数中的最大值和最小值

DSEG SEGMENT NUM DB -1,-4,0,1,-2,5,-6,10,4,0 ;待比较数字 DSEG ENDS CODE SEGMENT ASSUME DS:DSEG,CS:CODE START:MOV AX,DSEG MOV DS,AX LEA SI,NUM MOV DX,SI MOV CL,9 ;大循环计数寄存器初始化 NEXT1:MOV BL,CL ;大循环开始,小循环计数器初始化MOV SI,DX NEXT2:MOV AL,[SI+1] CMP [SI],AL ;比较 JGGONE ;如果后面大于前面跳到小循环末尾CHANGE:MOV AH,[SI] ;交换 MOV [SI+1],AH MOV [SI],AL JMP GONE GONE:add SI,1 DEC BL JNZ NEXT2

微机原理综合实验报告_nexys4_简易数字信号发生器_HUST_华中科技大学

微机原理综合项目报告 基于nexys4简易数字信号发生器 班级:通信1301班 学号: HUST 姓名:华中科技大学 指导老师: 左冬红罗杰

目录 一、项目简介 (1) 1.设计思路 (1) 2.任务分配 (1) 3.功能描述 (1) 二、项目构成及概要设计 (2) 1. 硬件模块构成 (2) 2. 软件实现流程 (2) 三、项目详细设计 (4) 1.硬件的内部构成 (4) 2.硬件平台的搭建 (9) 3.软件模块的构成及其实现 (13) 波形产生模块 (13) 频率调节模块 (15) 幅度调节模块 (16) 方波占空比调节模块 (16) 四、项目操作说明 (18) 五、附录 (19) 六、心得体会及建议 (20)

一、项目简介 1.设计思路 本次项目我们小组选择的是信号发生器,由于之前做过D/A显示锯齿波的实验,便想到在该实验的基础上进行功能的扩充,这样思路比较清晰。首先我们想到在上次实验的基础上加上方波、三角波和正弦波这几种常见波形,实现起来也与锯齿波较为类似,只是在正弦波的显示上花了点功夫,最后决定通过MATLAB取值来实现,最后能正常显示。而几种波形的切换我们则想到了开关,通过添加开关的GPIO核来获取开关的状态,预留了三位用于波形的切换。仅仅几种波形的显示是远不够的,所以我们决定添加频率的调节和幅度的调节部分,实现时发现幅度调节容易实现但频率调节有些难度,最后从代码产生波形的原理上来分析想到通过改变取样的次数来调节频率的增减,而选择用一位开关用于切换频率增加和减小,这样会节省资源。 当添加了方波后又发现其占空比也应该实现调节的功能,想到通过开发板上的按钮来实现,通过建立按钮的中断控制,来调节时间延时的增减,从而控制占空比的实现。当实现了MA TLAB取数进行正弦波的显示时,小组一位成员提出显示心形的设计想法,通过类似的思路也得到了实现。 具体的设计原理及流程后面会有详细说明。 2.任务分配 小组成员、贡献比例及具体分工: 1硬件平台的搭建,软件代码的实现以及各功能的设计 2心形显示的提出和设计,正弦波MA TLAB取值的实现 3项目整体框图的设计和绘制 实验报告、PPT以及视频的拍制则是由小组成员一起完成。 3.功能描述 该信号发生器工程能显示方波,锯齿波,正弦波,三角波以及“爱心”形状(ch1、ch2分别显示“爱心”上下部分再拼接成完整的“爱心”)。通过开发板按钮能调节各个波形的频率、幅度和方波的占空比,通过led灯能反映开关状态,通过数码管能反映当前显示的波形序号。 Switch<2>---Switch<0>:选择波形 Switch<8>---Switch<3>:调节频率 Switch<9>:控制频率增加和减小 Switch<15>---Switch<10>:调节幅度 BTNU:增加占空比 BTND:减小占空比

学微机原理课程设计心得体会范文

学微机原理课程设计心得体会范文 "微机原理与系统设计"作为电子信息类本科生教学的主要基础课之一,课程紧密结合电子信息类的专业特点。接下来就跟着小编的脚步一起去看一下关于吧。 篇1 这次微机原理课程设计历时两个星期,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序原理方框图化出来,但是我开始总觉得这样做没必要,很浪费时间。但是,这次课程设计完全改变了我以前的那种错误的认识,以前我接触的那些程序都是很短、很基础的,但是在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。 其次,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。 通过这次课程设计使我懂得了理论与实际相结合是很

重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。 这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在赵老师的辛勤指导下,终于游逆而解。同时,在赵老师的身上我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢! 篇2 以前从没有学过关于汇编语言的知识,起初学起来感觉很有难度。当知道要做课程设计的时候心里面感觉有些害怕和担心,担心自己不会或者做不好。但是当真的要做的时候也只好进自己作大的努力去做,做到自己最好的。 我们在这个过程中有很多自己的感受,我想很多同学都会和我有一样的感受,那就是感觉汇编语言真的是很神奇,很有意思。我们从开始的担心和害怕渐渐变成了享受,享受着汇编带给我们的快乐。看着自己做出来的东西,心里面的感觉真的很好。虽然我们做的东西都还很简单,但是毕竟是我们自己亲手,呵呵,应该是自己亲闹做出来的。很有成就

微机原理及应用实验报告

微机原理及应用实验报告 班级:机械1301班 姓名:黄佳清 学号:0801130117 座位号: 中南大学机电工程学院

实验一单片机仿真开发机操作和MCS-51指令系统应用 一.实验目的 1、熟悉MCS-51单片机仿真开发机和开发调试软件的操作使用和调整; 2、学会编写和输入汇编语言源程序、对输入的源程序进行汇编; 3、掌握程序的调试和运行的各种方法。 三.实验内容及步骤(完成分值:60分) 本实验秩序运行Keil uVersion2程序,设置为keil为纯软件仿真 1.新建工程项目 2.设置工程文件参数 3.编写新程序事例 4.调试程序直至能够运行出结果。 四.实验程序 AJMP MAIN ORG 0030H MAIN: MOV R0,#20H MOV R2,#0FH MOV A,#00H A1: MOV @R0,A INC R0 INC A DJNZ R2,A1 MOV R0,#20H ;暂停,观察并记录! MOV DPTR,#7000H MOV R2,#0FH A2: MOV A,@R0 MOVX @DPTR,A INC R0 INC DPTR DJNZ R2,A2 MOV R0,#030H ;断点,观察并记录! MOV DPTR,#7000H MOV R2,#0FH A3: MOVX A,@DPTR MOVX @R0,A INC R0 INC DPTR DJNZ R2,A3 DO: LJMP DO END ;内部存储器数据块赋值,搬运数据块到外部存储器,再搬运回内部数据存储器。 五、附加题 1.将光标移到想要暂停的地方,MOV R0,#20H所在行,选择“执行到光

华中科技大学微机原理实验考试题库与答案

复习题(后面附有全部代码) 1.用74LS244设计一个输入接口。从输入端口读入开关状态(高表示‘1’,低表示‘0’),以十进制形式在CRT显示器上显示输入结果(0~255)。 如:输入开关状态:高高高高低低低低→ CRT显示:240 2.用74LS244和74LS273设计一个输入/输出接口,从输入端口输入原码数,转换为补码后从输出端口输出(高和亮表示‘1’,低和灭表示‘0’)。 如:输入开关状态:低高高低低高低高→ 灭亮亮灭灭亮灭亮 输入开关状态:高低低低低高低高→ 亮亮亮亮亮灭亮亮

复习题 1.用AD0809设计一个A/D接口,从5VIN输入直流电压值,在CRT显示器上以二进制形式显示采样结果。 如:输入5V→CRT显示:1111 1111 B (允许有误差) 如:输入0V→CRT显示:0000 0000 B

2.用AD0809设计一个A/D接口,从5VIN输入直流电压值,在CRT显示器上以十进制形式显示采样结果。 如:输入5V→CRT显示:255( 允许有误差) 如:输入0V →CRT显示:0 3.用AD0809设计一个A/D接口,从5VIN输入直流电压值,在CRT显示器上以0~FFFH 的形式显示采样结果。 如:输入5V→CRT显示:FFH( 允许有误差) 如:输入0V →CRT显示:00H

复习题 1.用8255设计一个输入/输出接口,C口输入原码数,转换为补码后从B口输出(高和亮表示‘1’,低和灭表示‘0’)。 如:输入开关状态:低高高低低高低高→ 发光二极管: 灭亮亮灭灭亮灭亮 输入开关状态:高低低低低高低高→ 发光二极管: 亮亮亮亮亮灭亮亮

微机原理课程设计心得体会3篇

微机原理课程设计心得体会3篇课程设计是对课程的各个方面做出规划和安排,是连接课程基本理念和课程实践活动的桥梁。下面是为大家带来的微机原理课程设计心得体会,希望可以帮助大家。 微机原理课程设计心得体会范文1: 计算机网络的设计是一个要求动手能力很强的一门实践课程,在课程设计期间我努力将自己以前所学的理论知识向实践方面转化,尽量做到理论与实践相结合,在课程设计期间能够遵守纪律规章,不迟到、早退,认真完成老师布置的任务,同时也发现了自己的许多不足之处。 在课程设计过程中,我一共完成了11个实验,分别是1.制作直通电缆和交叉UTP、2.交换机Console口和Telnet配置、3.交换机端口和常规配置、4.虚拟局域网VLAN配置、5.路由器Console口Telnet 配置方法和接口配置、6.路由器静态路由配置、7单臂路由配置、8.动态路由协议配置、9.PPP协议配置、10路由器访问控制表(ACL)、11.网络地址转换(NAT)。 在制作直通电缆和交换UTP的实验中,我起初不能完全按照要求来剪切电缆,导致连接不通,后来在同学的帮助下,终于将实验完成。 在做到单臂路由配置和动态路由协议配置的实验,由于自身的基础知识掌握不牢,忘掉了一些理论知识,在重新翻阅课本和老师的指导之下,也成功的完成了试验。

从抽象的理论回到了丰富的实践创造,细致的了解了计算机网络连接的的全过程,认真学习了各种配置方法,并掌握了利用虚拟环境配置的方法,我利用此次难得的机会,努力完成实验,严格要求自己,认真学习计算机网络的基础理论,学习网络电缆的制作等知识,利用空余时间认真学习一些课本内容以外的相关知识,掌握了一些基本的实践技能。 课程设计是培养我们综合运用所学知识,发现、提出、分析、解决问题的一个过程,是对我们所学知识及综合能力的一次考察。随着科学技术日新月异的不断发展,计算机网络也在不断的变化发展当中,这就要求我们用相应的知识来武装自己,夯实基础,为将来走向工作岗位,贡献社会做好充分的准备。 微机原理课程设计心得体会范文2: "微机原理与系统设计" 作为电子信息类本科生教学的主要基础课之一,课程紧密结合电子信息类的专业特点,围绕微型计算机原理和应用主题,以Intelx86CPU为主线,系统介绍微型计算机的基本知识,基本组成,体系结构和工作模式,从而使学生能较清楚地了解微机的结构与工作流程,建立起系统的概念。 这次微机原理课程设计历时两个星期,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序原理方框图化出来,但是我开始总觉得这样做没必

北京邮电大学微机原理硬件实验报告

北京邮电大学微机原理硬件实验报告

实验报告一:I/0地址译码和简单并行接口 ——实验一&实验二 一、实验目的 掌握I/O地址译码电路的工作原理;掌握简单并行接口的工作原理及使用方法。 二、实验原理及内容 a) I/0地址译码 1、实验电路如图1-1所示,其中74LS74为D触发器,可直接使用实验台上数 字电路实验区的D触发器,74LS138为地址译码器。译码输出端Y0~Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:280H~ 287H,Y1:288H~28FH,……当CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。 例如:执行下面两条指令 MOV DX,2A0H OUT DX,AL(或IN AL,DX) Y4输出一个负脉冲,执行下面两条指令 MOV DX,2A8H OUT DX,AL(或IN AL,DX) Y5输出一个负脉冲。 利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔经过软件延时实现。 2、接线: Y4/IO地址接 CLK/D触发器

Y5/IO地址接 CD/D触发器 D/D触发器接 SD/D触发器接 +5V Q/D触发器接L7(LED灯)或逻辑笔 b) 简单并行接口 1、按下面图4-2-1简单并行输出接口电路图连接线路(74LS273插通 用插座,74LS32用实验台上的“或门”)。74LS273为八D触发器, 8个D输入端分别接数据总线D0~D7,8个Q输出端接LED显示电 路L0~L7。 2、编程从键盘输入一个字符或数字,将其ASCⅡ码经过这 个输出接口输出,根据8个发光二极管发光情况验证正确 性。 3、按下面图4-2-2简单并行输入接口电路图连接电路 (74LS244插通用插座,74LS32用实验台上的“或门”)。 74LS244为八缓冲器,8个数据输入端分别接逻辑电平开关 输出K0~K7,8个数据输出端分别接数据总线D0~D7。 4、用逻辑电平开关预置某个字母的ASCⅡ码,编程输入这 个ASCⅡ码,并将其对应字母在屏幕上显示出来。 5、接线:1)输出 按图4-2-1接线(图中虚线为实验所需接线,74LS32为实验 台逻辑或门) 2)输入 按图4-2-2接线(图中虚线为实验所需接线,74LS32为实 验台逻辑或门) 三、硬件连线图 1、I/O地址译码

微机原理与接口技术试验学习总结

微机原理与接口技术试验学习总结 本学期微机原理的实验课程即将结束,关于微机原理课程实验的心得体会颇多。 初学《微机原理》时,感觉摸不着头绪。面对着众多的术语、概念及原理性的问题不知道该如何下手。在了解课程的特点后,我发现,应该以微机的整机概念为突破口,在如何建立整体概念上下功夫。“麻雀虽小,五脏俱全”,可以通过学习一个模型机的组成和指令执行的过程,了解和熟悉计算机的结构、特点和工作过程。 《微机原理》课程有许多新名词、新专业术语。透彻理解这些名词、术语的意思,为今后深入学习打下基础。一个新的名词从首次接触到理解和应用,需要一个反复的过程。而在众多概念中,真正关键的并不是很多。比如“中断”概念,既是重点又是难点,如果不懂中断技术,就不能算是搞懂了微机原理。在学习中凡是遇到这种情况,绝对不轻易放过,要力求真正弄懂,搞懂一个重点,将使一大串概念迎刃而解。 学习过程中,我发现许多概念很相近,为了更好地掌握,将一些容易混淆的概念集中在一起进行分析,比较它们之间的异同点。比如:微机原理中,引入了计算机由五大部分组成这一概念;从中央处理器引出微处理器的定义;在引出微型计算机定义时,强调输入/输出接口的重要性;在引出微型计算机系统的定义时,强调计算机软件与计算机硬件的相辅相成的关系。微处理器是微型计算机的重要组成部分,它与微型计算机、微型计算机系统是完全不同的概念。 在微机中,最基础的语言是汇编语言。汇编语言是一个最基础最古老的计算机语言。语言总是越基础越重要,在重大的编程项目中应用最广泛。就我的个人理解,汇编是对寄存的地址以及数据单元进行最直接的修改。而在某些时候,这种方法是最有效,最可靠的。然而,事物总有两面性,有优点自然缺点也不少。其中,最重要的一点就是,汇编语言很复杂,对某个数据进行修改时,本来很简单的一个操作会用比较烦琐的语言来解决,而这些语言本身在执行和操作的过程中,占有大量的时间和成本。在一些讲求效率的场合,并不可取。 汇编语言对学习其他计算机起到一个比较、对照、参考的促进作用。学习事物总是从最简单基础的开始。那么学习高级语言也当然应当从汇编开始。学习汇编语言实际上是培养了学习计算机语言的能力和素养。个人认为,学习汇编语言对学习其他语言很有促进作用。 汇编语言在本学期微机学习中有核心地位。本学期微机原理课程内容繁多,还学习了可编程的计数/定时的8253,可编程的外围接口芯片8255A等。学的都是芯片逻辑器件,而在名字前都标有“可编程”,其核心作用不可低估。 我想微机原理课程试验不仅加深和巩固了我们的课本知识,而且增强了我们自己动脑,自己动手的能力。但是我想他也有它的独特之处,那就是让我们进入一个神奇的世界,那就是编程。对我们来说汇编真的很新奇,很有趣,也使我有更多的兴趣学习微机原理和其

四川大学微机原理实验报告..

微机原理实验报告 学院: 专业班级: 姓名 学号

实验一汇编语言编程基础 1.3汇编语言程序上机操作和调试训练 一.功能说明 运用8086汇编语言,编辑多字节非压缩型BCD数除法的简单程序,文件名取为*.ASM。 运用MASM﹒EXE文件进行汇编,修改程序中的各种语法错误,直至正确,形成*.OBJ文件。 运用LINK.EXE文件进行连接,形成*.EXE文件。 仔细阅读和体会DEBUG调试方法,掌握各种命令的使用方法。 运用DEBUG。EXE文件进行调试,使用单步执行命令—T两次,观察寄存器中内容的变化,使用察看存储器数据段命令—D,观察存储器数据段内数值。 再使用连续执行命令—G,执行程序,检查结果是否正确,若不正确可使用DEBUG的设置断点,单步执行等功能发现错误所在并加以改正。 二.程序流程图 设置被除数、商的地址指针 设置单位除法次数计数器 取被除数一位作十进制调整 作字节除法、存商 N 被除数各位已除完? Y 显示运算结果 结束 三.程序代码 修改后的程序代码如下: DATA SEGMENT A D B 9,6,8,7,5 B DB 5 C DB 5 DUP (0) N EQU 5 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX

MOV ES,AX CLD LEA SI,A LEA DI,C MOV CX,N MOV AH,0 LP1: LODSB AAD DIV B STOSB LOOP LP1 MOV CX,N LEA DI,C LP2: MOV DL,[DI] ADD DL,30H MOV AH,2 INT 21H INC DI LOOP LP2 MOV AH,4CH INT 21H CODE ENDS END START 四.实验感想和收获 通过这次试验,我对微机原理上级试验环境有了初步的认识,可以较为熟练地对汇编语言进行编译,汇编及连接,同时也学会了用DEBUG调试程序,收获很大。 在这次试验中我也遇到了一些困难。在刚开始我发现自己无法打开MASM.EXE,计算机提示是由于版本不兼容。我这才想起来我的操作系统是64位的,和该软件版本不兼容。不过我并没有放弃,经过我的摸索之后,我发现用DOSBOX这个程序可以解决我的电脑运行不了该程序的问题。在解决了第一个难题后,我开始着手改正试验1.3中的语法错误和逻辑错误,但是无论我怎么修改却始终都无法通过编译,并且基本上每句话都有编译错误。根据我多年编程的经验来看,这应该是中文输入法在搞鬼,之后我耐心地把程序重新输了一遍,果然通过了编译,并且之后的连接也进行的很顺利。在用DEBUG调试时发现得出的结果也很正确。 尽管这次的实验内容非常简单,仅仅是教会我们一些基本的操作,但我却明显感觉到了汇编语言和C语言等高级语言所不同的地方。越是底层,基础的东西就越不人性化,用C语言一行代码就能实验的功能在汇编语言中可能要花上数十行。看来汇编语言的学习不是几周就能速成的,必须要有长年累月的积淀才能掌握。

微机原理实验答案汇总

1.题目:编程将(AX)=2387、(BX)=192FH、(CX)=9256中的无符号数按由大到小排序,上机编程调试出程序,并将程序及排序结果记录在下面。 CODE SEGMENT ASSUME CS:CODE START: MOV AX,2387 MOV BX,192FH MOV CX,9256 CMP AX,BX JAE NEXT1 XCHG AX,BX NEXT1: CMP AX,CX JAE NEXT2 XCHG AX,CX NEXT2: CMP BX,CX JAE NEXT3 XCHG BX,CX NEXT3: MOV AH,4CH INT 21H CODE ENDS END START 2.题目:编程将(BX)=8600H、(CX)=3489H、(DX)=9235按有符号数由大到小排序,上机编程调试出程序,并将程序及排序结果记录在下面。 ;CODE SEGMENT ASSUME CS:CODE START: MOV BX,8600h MOV CX,3489H MOV DX,9235 CMP BX,CX JGE NEXT1 XCHG BX,CX NEXT1: CMP BX,DX JGE NEXT2 XCHG BX,DX NEXT2: CMP CX,DX JGE NEXT3 XCHG CX,DX NEXT3:

MOV AH,4CH INT 21H CODE ENDS END START 3.题目:在数据段中定义如下数据:32,34,89H,,编程将以上数据按有符号数进行排序,并将程序和结果记录下来。 DATA SEGMENT NUM DB 32,34,89H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DAT START: MOV AX,DATA MOV DS,AX ;初始化DS LEA BX,NUM ;取有效地址到BX,以便访问要排序的数 MOV AL,[BX] CMP AL,[BX+1] JGE NEXT1 ;若第一个数大则跳转,否则将第一个与第二个数交换 XCHG AL,[BX+1] MOV [BX],AL NEXT1: CMP AL,[BX+2] JGE NEXT2;若第一个数大则跳转,否则将第一个与第三个数交换 XCHG AL,[BX+2] MOV [BX],AL NEXT2: MOV AL,[BX+1];将第二个和第三个数比较 CMP AL,[BX+2] JGE NEXT3;若第二个数大则跳转,否则将第二个与第三个数交换 XCHG AL,[BX+2] MOV [BX+1],AL NEXT3: MOV AH,4CH INT 21H CODE ENDS END START 4.题目:在数据段中定义如下数据:99,25,86,编程将以上数据按无符号数进行排序,上机调试出程序,并将程序和结果记录下来。 data segment num db 99h,25h,86h data ends code segment assume cs:code,ds:data start:mov ax,data

相关文档
最新文档