CPU与简单模型机设计实验
CPU与简单模型机设计实验

CPU与简单模型机设计实验1.实验目的和背景CPU是计算机的核心部件,负责执行各种运算和指令。
在现代计算机系统中,CPU的设计日益复杂和精密,其中包含了大量的逻辑单元、寄存器、控制器等组件。
本实验旨在通过设计一个简单的模型机,使学生们对CPU的基本原理和运作方式有一个直观的理解,并通过实际操作加深对计算机系统的理解。
2.实验内容和步骤本实验将分为以下几个步骤来完成:1)硬件设计:首先,根据CPU的基本原理和结构,设计一个简单的模型机,包括运算单元、寄存器、控制器等组件。
可以参考经典的冯·诺伊曼结构,根据实际需要添加一些功能模块。
2)指令设计:设计若干简单的指令集,包括算术运算、逻辑运算、跳转等指令。
指令集的设计应考虑到CPU的硬件结构,使其能够有效地执行这些指令。
3)程序编写:编写一些简单的程序,包括对指令集的测试、算术运算、逻辑运算等,以验证CPU的正确性和性能。
4)实验报告:总结实验中的设计过程、实现方法、遇到的问题以及解决方案,对设计的CPU进行性能评估和改进。
3.实验材料和工具1)计算机:用于进行程序编写和模拟实验,可以选择使用现有的模拟器或者在线平台。
2)模型机器材料:包括集成电路芯片、面包板、导线、电阻、电容等,用于搭建实验平台。
3)编程工具:用于程序编写和调试,可以选择使用C语言、Python 等高级语言。
4.实验预期结果和意义通过本次实验,学生们将能够深入了解CPU的基本原理和工作原理,掌握计算机系统的设计和实现方法。
同时,通过实际操作,学生们可以锻炼自己的设计能力、解决问题的能力和团队合作能力。
这对于深入理解计算机科学的理论知识、提高实践能力和培养创新思维具有重要意义。
5.实验总结通过本次实验,我对CPU的工作原理和计算机系统的设计有了更深入的理解,掌握了一定的设计和实现方法。
在实验过程中遇到了一些问题,如指令集设计不够合理、硬件连接错误等,通过团队合作和思考,最终得以解决。
实验4 简单CPU设计与仿真

预做实验报告4简单CPU设计与仿真一、实验目的理解并掌握CPU的基本电路结构及其设计方法,学会使用Verilog HDL对电路进行行为建模、结构建模以及仿真测试。
二、实验内容利用Verilog HDL设计一个简单的CPU模型,并进行仿真测试。
要求该处理机能够实现下列指令系统:31262521201615540指令000000rd rs1rs2and rd,rs1,rs2 000001rd rs1imme andi rd,rs1,imme 000010rd rs1rs2or rd,rs1,rs2 000011rd rs1imme ori rd,rs1,imme 000100rd rs1rs2add rd,rs1,rs2 000101rd rs1imme addi rd,rs1,imme 000110rd rs1rs2sub rd,rs1,rs2 000111rd rs1imme subi rd,rs1,imme 001000rd rs1imme load rd,rs1,imme 001001rd rs1imme store rd,rs1,imme 001010disp bne disp001011disp beq disp001100disp branch disp 要求把指令的执行分为以下5个步骤,每个步骤用一个时钟周期。
1、取指令及PC+1周期2、指令译码、读寄存器及转移周期3、ALU执行或者存储器地址计算周期4、ALU指令结束周期或者存储器访问周期5、写回周期三、实验环境PC机1台、Modelsim仿真软件1套。
四、实验步骤1、电路结构设计与逻辑设计多周期处理机的总体电路图P C寄存器堆ALUABZERO 存储器Addres sDataou t Detain CSOEWE WRITEMEMALUOPZEROWRITEZEROM U XM U X M U X1偏移量符号扩展立即数符号扩展WRITEREG DI AD A1A2Q2Q1SELLOADSELST偏移量立即数Rd rs1rs2RdWRITEPCM U XI RM U XSELLDSTSELALUASELALUBAB IM WRITEIRZEROOPCODE 控制部件控制信2、建立Verilog 模型module TOP(clk,rst,start,memwe,memin,memaddr,zero,n,v,c,dataout);input clk,rst,start,memwe;input [31:0]memin;input [4:0]memaddr;output [31:0]dataout;output n,v,c,zero;wire clk,rst;wire writepc,selldst,writemem,writeir,selload,selst,writereg,selalua,writezero;wire [5:0]opcode;wire [1:0]aluop,selalub;wire zero;datapathu0(writepc,selldst,writemem,writeir,selload,selst,writereg,selalua,selalub,aluop,w ritezero,clk,rst,memin,memaddr,memwe,zero,n,v,c,opcode,dataout);controlu1(clk,start,zero,opcode,writepc,selldst,writemem,writeir,selload,selst,writereg,se lalua,selalub,aluop,writezero);endmodulemoduledatapath(writepc,selldst,writemem,writeir,selload,selst,writereg,selalua,selalub,alZEROuop,writezero,clk,rst,memin,memaddr,memwe,zero,n,v,c,opcode,dataout); inputwritepc,selldst,writemem,writeir,selload,selst,writereg,selalua,writezero,clk,rst,m emwe;input[1:0]selalub,aluop;input[4:0]memaddr;input[31:0]memin;output zero,n,v,c;output[5:0]opcode;output[31:0]dataout;wire[4:0]pcout,address,memaddr,mux3out;wire[31:0]memin,mux4out,mux5out,imme,disp;wire memwe,zero1;wire[31:0]dataout,Q1,datain,irout,f,aluout;pc pc1(pcout,aluout[4:0],writepc,clk,rst);mux21_5mux1(address,pcout,aluout[4:0],selldst);memorymem(dataout,datain,address,writemem,memin,memaddr,memwe,clk,rst);//memin,memaddr,memweÊÇΪÁËÔڼĴæÆ÷ÖÐÊäÈëÊý¾Ý¶øÓÃir ir1(irout,dataout,clk,rst,writeir);mux21_32mux2(f,aluout,dataout,selload);mux21_5mux3(mux3out,irout[4:0],irout[25:21],selst);registerfileregisterfile(Q1,datain,f,clk,rst,writereg,irout[25:21],irout[20:16],mux3out); mux21_32mux4(mux4out,Q1,{27'b0,pcout},selalua);assignimme={irout[15],irout[15],irout[15],irout[15],irout[15],irout[15],irout[15],irout[1 5],irout[15],irout[15],irout[15],irout[15],irout[15],irout[15],irout[15],irout[15],iro ut[15:0]};assigndisp={irout[25],irout[25],irout[25],irout[25],irout[25],irout[25],irout[25:0]}; mux41_32mux5(mux5out,datain,imme,32'd1,disp,selalub);ALU alu1(aluop,mux4out,mux5out,aluout,n,v,c,zero1);dff zeroflag(zero,zero1,clk,rst,writezero);assign opcode=irout[31:26];endmodulemodulecontrol(clk,start,zero,opcode,writepc,selldst,writemem,writeir,selload,selst,writer eg,selalua,selalub,aluop,writezero);input clk,start,zero;input[5:0]opcode;output writepc,selldst,writemem,writeir,selload,selst,writereg,selalua,writezero;output[1:0]selalub,aluop;reg[3:0]q;wire[3:0]d;wire zero;always@(posedge clk)beginif(start)q<=4'd0;elseq<=d;endassignd[0]=(~q[3]&~q[2]&~q[1]&~q[0])|((~q[3]&~q[2]&~q[1]&q[0])&(~opcode[3]&op code[0]))|((~q[3]&~q[2]&~q[1]&q[0])&(opcode[3]&~opcode[2]&~opcode[1]&op code[0]))|(~q[3]&~q[2]&q[1]&q[0])|(~q[3]&q[2]&~q[1]&q[0]);assignd[1]=((~q[3]&~q[2]&~q[1]&q[0])&(~opcode[3]&~opcode[0]))|((~q[3]&~q[2]&~q [1]&q[0])&(~opcode[3]&opcode[0]))|(~q[3]&~q[2]&q[1]&~q[0])|(~q[3]&~q[2]& q[1]&q[0])|(q[3]&~q[2]&~q[1]&~q[0]);assignd[2]=((~q[3]&~q[2]&~q[1]&q[0])&(opcode[3]&~opcode[2]&~opcode[1]&~opcod e[0]))|((~q[3]&~q[2]&~q[1]&q[0])&(opcode[3]&~opcode[2]&~opcode[1]&opcod e[0]))|(~q[3]&~q[2]&q[1]&~q[0])|(~q[3]&~q[2]&q[1]&q[0]);assignd[3]=(~q[3]&q[2]&~q[1]&~q[0])|(~q[3]&q[2]&~q[1]&q[0])|(q[3]&~q[2]&~q[1]& ~q[0]);assignwritepc=(~q[3]&~q[2]&~q[1]&~q[0])|((~q[3]&~q[2]&~q[1]&q[0])&((opcode[3]& opcode[2]&~opcode[1]&~opcode[0])|(opcode[3]&~opcode[2]&opcode[1]&~opco de[0]&~zero)|(opcode[3]&~opcode[2]&opcode[1]&opcode[0]&zero)));assignselldst=(~q[3]&q[2]&~q[1]&~q[0])|(~q[3]&q[2]&~q[1]&q[0])|(q[3]&~q[2]&~q[1] &~q[0])|(q[3]&~q[2]&~q[1]&q[0])|(q[3]&~q[2]&q[1]&~q[0]);assign writemem=q[3]&~q[2]&~q[1]&q[0];assign writeir=~q[3]&~q[2]&~q[1]&~q[0];assignselload=(~q[3]&q[2]&~q[1]&~q[0])|(q[3]&~q[2]&~q[1]&~q[0])|(q[3]&~q[2]&q[1] &~q[0]);assign selst=(~q[3]&q[2]&~q[1]&q[0])|(q[3]&~q[2]&~q[1]&q[0]);assignwritereg=(~q[3]&q[2]&q[1]&~q[0])|(~q[3]&q[2]&q[1]&q[0])|(q[3]&~q[2]&q[1] &~q[0]);assign selalua=(~q[3]&~q[2]&~q[1]&~q[0])|(~q[3]&~q[2]&~q[1]&q[0]); assign selalub[1]=(~q[3]&~q[2]&~q[1]&~q[0])|(~q[3]&~q[2]&~q[1]&q[0]);assignselalub[0]=(~q[3]&~q[2]&~q[1]&q[0])|(~q[3]&~q[2]&q[1]&q[0])|(~q[3]&q[2]&~ q[1]&~q[0])|(~q[3]&q[2]&~q[1]&q[0])|(~q[3]&q[2]&q[1]&q[0])|(q[3]&~q[2]&~q [1]&~q[0])|(q[3]&~q[2]&~q[1]&q[0])|(q[3]&~q[2]&q[1]&~q[0]);assign writezero=(~q[3]&q[2]&q[1]&~q[0])|(~q[3]&q[2]&q[1]&q[0]);assignaluop[1]=(~q[3]&~q[2]&~q[1]&~q[0])|(~q[3]&~q[2]&~q[1]&q[0])|((~q[3]&~q[2] &q[1]&~q[0])&(~opcode[3]&opcode[2]))|((~q[3]&~q[2]&q[1]&q[0])&(~opcode[ 3]&opcode[2]))|(~q[3]&q[2]&~q[1]&~q[0])|(~q[3]&q[2]&~q[1]&q[0])|((~q[3]&q[2]&q[1]&~q[0])&(~opcode[3]&opcode[2]))|((~q[3]&q[2]&q[1]&q[0])&(~opcode[3]&opcode[2]))|(q[3]&~q[2]&~q[1]&~q[0])|(q[3]&~q[2]&~q[1]&q[0])|(q[3]&~q[ 2]&q[1]&~q[0]);assignaluop[0]=((~q[3]&~q[2]&q[1]&~q[0])&(~opcode[3]&opcode[1]))|((~q[3]&~q[2] &q[1]&q[0])&(~opcode[3]&opcode[1]))|((~q[3]&q[2]&q[1]&~q[0])&(~opcode[3] &opcode[1]))|((~q[3]&q[2]&q[1]&q[0])&(~opcode[3]&opcode[1])); endmodulemodule memory(dataout,datain,address,we,memin,memaddr,memwe,clk,reset); output[31:0]dataout;input[31:0]datain,memin;input[4:0]address,memaddr;input clk,reset,we,memwe;wire we1;wire[4:0]address1;wire[31:0]decoderout;wire[31:0]regen;wire[31:0]datain1;wire[31:0]q0,q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,q12,q13,q14,q15,q16,q17,q18,q19,q20,q21, q22,q23,q24,q25,q26,q27,q28,q29,q30,q31;assign address1=memwe?memaddr:address;assign datain1=memwe?memin:datain;decoder dec0(decoderout,address1);assign we1=we|memwe;assign regen[0]=decoderout[0]&we1;assign regen[1]=decoderout[1]&we1;assign regen[2]=decoderout[2]&we1;assign regen[3]=decoderout[3]&we1;assign regen[4]=decoderout[4]&we1;assign regen[5]=decoderout[5]&we1;assign regen[6]=decoderout[6]&we1;assign regen[7]=decoderout[7]&we1;assign regen[8]=decoderout[8]&we1;assign regen[9]=decoderout[9]&we1; assign regen[10]=decoderout[10]&we1; assign regen[11]=decoderout[11]&we1; assign regen[12]=decoderout[12]&we1; assign regen[13]=decoderout[13]&we1; assign regen[14]=decoderout[14]&we1; assign regen[15]=decoderout[15]&we1; assign regen[16]=decoderout[16]&we1; assign regen[17]=decoderout[17]&we1; assign regen[18]=decoderout[18]&we1; assign regen[19]=decoderout[19]&we1; assign regen[20]=decoderout[20]&we1; assign regen[21]=decoderout[21]&we1; assign regen[22]=decoderout[22]&we1; assign regen[23]=decoderout[23]&we1; assign regen[24]=decoderout[24]&we1; assign regen[25]=decoderout[25]&we1; assign regen[26]=decoderout[26]&we1; assign regen[27]=decoderout[27]&we1; assign regen[28]=decoderout[28]&we1; assign regen[29]=decoderout[29]&we1; assign regen[30]=decoderout[30]&we1; assign regen[31]=decoderout[31]&we1; register reg0(q0,datain1,clk,reset,regen[0]); register reg1(q1,datain1,clk,reset,regen[1]); register reg2(q2,datain1,clk,reset,regen[2]); register reg3(q3,datain1,clk,reset,regen[3]); register reg4(q4,datain1,clk,reset,regen[4]); register reg5(q5,datain1,clk,reset,regen[5]); register reg6(q6,datain1,clk,reset,regen[6]); register reg7(q7,datain1,clk,reset,regen[7]); register reg8(q8,datain1,clk,reset,regen[8]); register reg9(q9,datain1,clk,reset,regen[9]); register reg10(q10,datain1,clk,reset,regen[10]); register reg11(q11,datain1,clk,reset,regen[11]); register reg12(q12,datain1,clk,reset,regen[12]); register reg13(q13,datain1,clk,reset,regen[13]); register reg14(q14,datain1,clk,reset,regen[14]); register reg15(q15,datain1,clk,reset,regen[15]); register reg16(q16,datain1,clk,reset,regen[16]); register reg17(q17,datain1,clk,reset,regen[17]); register reg18(q18,datain1,clk,reset,regen[18]); register reg19(q19,datain1,clk,reset,regen[19]); register reg20(q20,datain1,clk,reset,regen[20]);register reg21(q21,datain1,clk,reset,regen[21]);register reg22(q22,datain1,clk,reset,regen[22]);register reg23(q23,datain1,clk,reset,regen[23]);register reg24(q24,datain1,clk,reset,regen[24]);register reg25(q25,datain1,clk,reset,regen[25]);register reg26(q26,datain1,clk,reset,regen[26]);register reg27(q27,datain1,clk,reset,regen[27]);register reg28(q28,datain1,clk,reset,regen[28]);register reg29(q29,datain1,clk,reset,regen[29]);register reg30(q30,datain1,clk,reset,regen[30]);register reg31(q31,datain1,clk,reset,regen[31]);mux_32mux0(dataout,q0,q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,q12,q13,q14,q15,q16,q17,q 18,q19,q20,q21,q22,q23,q24,q25,q26,q27,q28,q29,q30,q31,address); endmodule3、设计测试文件`timescale1ns/1nsmodule TOP_test;reg clk,rst,start,memwe;reg[31:0]memin;reg[4:0]memaddr;wire zero,n,v,c;wire[31:0]dataout;TOP u(clk,rst,start,memwe,memin,memaddr,zero,n,v,c,dataout);always#50clk=~clk;initialbeginclk=1;rst=0;start=0;#20rst=1;//load instruction and data to memory.#100rst=0;memwe=1;memin=32'b001000_00000_11111_0000000000010000;//load r0,r31,16memaddr=5'd0;#100memwe=1;memin=32'b001001_00000_11111_0000000000010001;//store r0,r31,17memaddr=5'd1;#100memwe=1;memin=32'b001000_00001_11111_0000000000010001;//load r1,r31,17memaddr=5'd2;#100memwe=1;memin=32'b000001_00010_00000_0101010101010101;//andi r2,r0,16'b0101010101010101memaddr=5'd3;#100memwe=1;memin=32'b000101_00011_00010_0000000000001011;//addi r3,r2,16'b0000000000001011memaddr=5'd4;#100memwe=1;memin=32'b001100_11111111111111111111111011;//branch-5memaddr=5'd5;#100memwe=1;memin=32'hFFFF_FFFF;//load data to memorymemaddr=5'd16;//start to execuit instructions.#100memwe=0;start=1;#100start=0;#10000$stop;endendmodule注意:测试的完备性。
(完整word版)CPU与简单模型机设计实验

图5-1-1 基本CPU 构成原理图除了程序计数器(PC),其余部件在前面的实验中都已用到,在此不再讨论。
系统的程序计数器(PC)和地址寄存器(AR)集成在一片CPLD 芯片中 .CLR 连接至CON 单元的总清端CLR,按下CLR 按钮,将使PC 清零,LDPC 和T3 相与后作为计数器的计数时钟,当LOAD为低时,计数时钟到来后将CPU 内总线上的数据打入PC。
如图5-1—2所示。
图5-1—2 程序计数器(PC)原理图本模型机和前面微程序控制器实验相比,新增加一条跳转指令JMP,共有五条指令:IN (输入)、ADD(二进制加法)、OUT(输出)、JMP(无条件转移),HLT(停机),其指令格式如下(高4位为操作码):其中JMP 为双字节指令,其余均为单字节指令,********为addr 对应的二进制地址码。
微程序控制器实验的指令是通过手动给出的,现在要求CPU 自动从存储器读取指令并执行。
根据以上要求,设计数据通路图,如图5—1—3 所示。
本实验在前一个实验的基础上增加了三个部件,一是PC(程序计数器),另一个是AR(地址寄存器),还有就是MEM(主存)。
因而在微指令中应增加相应的控制位,其微指令格式如表5-1—1 所示.图5—1-3 数据通路图表5—1-1 微指令格式系统涉及到的微程序流程见图5-1—4 所示,当拟定“取指”微指令时,该微指令的判别测试字段为P<1〉测试。
指令译码原理见图3—2-3 所示,由于“取指"微指令是所有微程序都使用的公用微指令,因此P<1〉的测试结果出现多路分支。
本机用指令寄存器的高6 位(IR7—IR2)作为测试条件,出现5路分支,占用5个固定微地址单元,剩下的其它地方就可以一条微指令占用控存一个微地址单元随意填写,微程序流程图上的单元地址为16 进制。
图5-1-4 简单模型机微程序流程图当全部微程序设计完毕后,应将每条微指令代码化,表5-1-2 即为将图5-1—4 的微程序流程图按微指令格式转化而成的“二进制微代码表”。
CPU与简单模型机设计实验中的关键问题分析

CPU与简单模型机设计实验中的关键问题分析摘要:模型机设计实验是计算机组成原理实验中的一个综合性较强的实验,要求学生在掌握各部件单元电路的基础上,构建一台模型计算机。
文章选用TD-CMA实验教学系统,针对采用微程序控制器设计的CPU与简单模型机设计实验,从连线排查、指令设计、微程序设计、指令控制、程序运行等方面分析该实验中的关键问题,并给出每个问题的解决方法。
关键词:计算机组成原理;微程序控制器;简单模型机;TD-CMA0 引言CPU与简单模型机设计实验是计算机组成原理实验中的一个综合性较强的实验,对学生的理论要求、能力要求较高。
在美国的一些主流大学中,计算机组成原理实验强调从顶层(应用和软件)到底层(硬件)的掌握与了解,实验方式一般采用高级语言实现对硬件的模拟;有些大学则要求学生采用VHDL、Verilog 等硬件描述语言进行功能部件和小型系统的设计与实现,并在FPGA等硬件上进行测试验证。
从文献[4]可以看出,国内大学计算机组成原理课程的实验已经由验证性实验逐渐过渡到处理器设计及计算机系统搭建的层次上。
与模型机设计相关的实验仍然是重点实验内容,只是实现方式和难度不同。
例如,有些学校开设的实验会引入MIPS、流水、Cache等功能设计。
根据控制器部件的工作原理,模型机控制器可分为硬布线控制器和微程序控制器两种,还可根据设计的模型机所含指令系统分为简单模型机和具有特定功能的模型机,因此模型机的设计也有不同的类型。
笔者选取微程序控制器的基本模型机设计进行分析。
TD-CMA教学实验系统是西安唐都科教仪器公司推出的新一代计算机组成原理与系统结构教学实验设备。
该系统硬件的电路布局按照计算机组成结构进行模块化设计,配有CMA’监控软件,可以实现从部件到整机实验的数据通路图实时动态图形调试界面演示,且都具有单拍、单周期、连续等调试功能,通路图的调试过程也具有保存和回放功能。
笔者采用TD-CMA实验教学系统,针对以微程序控制器为基础的简单模型机设计实验,从连线排查、指令设计、微程序设计、指令控制、程序运行等多个方面分析微程序控制器模型机实验中的关键问题,给出了每个问题的解决方法。
基本模型机的设计与实现实验报告

基本模型机的设计与实现实验报告本文将围绕“基本模型机的设计与实现实验报告”进行分析和阐述。
基本模型机的设计与实现是计算机系统课程中的重点内容,是学生理解计算机系统的核心;设计和实现基本模型机需要学生掌握计算机组成原理的基本知识,能够编写汇编语言程序和理解存储器层次结构等相关概念。
一、实验目的本次计算机系统实验的目的是掌握CPU的设计与实现,以及理解汇编语言的底层执行过程。
通过本次实验,学生可以深入了解计算机系统的基本组成部分,从而提高对计算机实现原理的认识和理解。
二、实验中设计与实现模型机的步骤1、确定模型机性能要求根据实验要求,我们需要设计出一个能够运行汇编语言程序的模型机。
此时,我们需要确定模型机的性能需求,如运行速度、存储容量和输入输出设备等方面。
2、设计和实现CPU在模型机中,CPU是核心部件,所以首先需要设计和实现CPU。
CPU需要包括寄存器、算术逻辑单元、控制器和取指令等组成部分。
由于我们使用的是逻辑电路实现,所以需要进行逻辑门设计,采用Verilog语言来实现。
3、设计和实现存储器存储器是CPU所需的重要组成部分之一,我们需要为CPU设计实现一套存储器,包括RAM和ROM两部分,其中RAM用于存储数据,ROM用于存储指令。
4、设计和实现输入输出设备在模型机中,输入输出设备也是必不可少的部分。
我们需要设计并实现一套输入输出设备,用于用户输入指令和数据,以及模型机输出结果。
5、编写汇编程序在完成模型机的设计和实现后,我们需要编写汇编程序来测试模型机的功能是否正常。
我们可以编写一些简单的汇编程序来测试模型机的运行速度和结果准确性。
三、实验结果与分析经过实验,我们成功地设计并实现了一套基本模型机,并编写了一些简单的汇编程序进行测试。
模型机具有较高的运行速度和存储容量,并且可以实现输入输出设备的基本功能。
同时,我们也发现了一些问题,如指令与数据存储的冲突等,需要进一步改进。
在完成实验过程中,我们深刻理解了计算机系统的结构和运作原理,提高了对计算机系统的认识和理解能力。
Cpu与简单模型机

1.写入微程序
将下面微代码写入芯片
地址
HEX
高八位
A字段
21,19-12位
CN_I
S3-S0
uM_PC7..uM_PC0
00
6F0ED001
6F
00
0 11101101
0
0000
01
08
3B0AF009
3B
00
0 10101111
0
0000
09
09
5D0AF00A
5D
00
0 10101111
PC+1IN---RO
RO---B
R0----A
A+B----RO
RO---OUT
实验过程及
结果记录
一 准备好实验仪
二.写入微程序,机器程序
三.本机运行(出现错误)
输入数据10101000即为A8
多次检验发现错误,微指令与机器指令的首地址出现问题
实验结果
分析
思考
1在不同地址 输入微指令(信号
uM_PC7..uM_PC0
计算机组成原理实验报告
实验名称
Cpu与简单模型机
实验日期
2016.11.14
学生姓名
学号
班级
实验目的
(简述实验的目的及意义)
(1) 了解并掌握一个基础的CPU的组成原理
(2) 在前几章介绍的各单元电路的基础上,构造一个简单模型计算机
(3) 给简单模型机设计4条机器指令,并编写每条机器指令的微指令,上机调试,掌握整机概念。
;START:IN R0
;从IN单元读入数据送 R0
00000001
0000 0000
CPU-与简单模型机设计实验

评语: 课中检查完成的题号及题数:课后完成的题号与题数:成绩: 自评成绩: 85实验报告实验名称:CPU 与简单模型机设计实验日期:2015.11.17 班级: 2 学号:13 姓名:周小多一、实验目的:1. 掌握一个简单CPU 的组成原理。
2. 在掌握部件单元电路的基础上,进一步将其构造一台基本模型计算机。
3. 为其定义五条机器指令,编写相应的微程序,并上机调试掌握整机概念。
二、实验内容:1.要实现一个简单的CPU,并且在此CPU 的基础上,继续构建一个简单的模型计算机。
CPU 由运算器(ALU)、微程序控制器(MC)、通用寄存器(R0),指令寄存器(IR)、程序计数器(PC)和地址寄存器(AR)组成,如图2-1-1 所示。
这个CPU 在写入相应的微指令后,就具备了执行机器指令的功能,但是机器指令一般存放在主存当中,CPU 必须和主存挂接后,才有实际的意义,所以还需要在该CPU 的基础上增加一个主存和基本的输入输出部件,以构成一个简单的模型计算机。
2.本模型机和前面微程序控制器实验相比,新增加一条跳转指令JMP,共有五条指令:IN(输入)、ADD(二进制加法)、OUT(输出)、JMP(无条件转移),HLT(停机),其指令格式如下(高4位为操作码):助记符机器指令码说明IN 0010 0000 IN→R0ADD 0000 0000 R0 + R0→R0OUT 0011 0000 R0→OUTJMP addr 1100 0000 addr→ PCHLT 0101 0000 停机3. 设计一段机器程序,要求从IN 单元读入一个数据,存于R0,将R0 和自身相加,结果存于R0,再将R0 的值送OUT 单元显示。
根据要求可以得到如下程序,地址和内容均为二进制数。
地址内容助记符说明00000000 00100000 ; START: IN R0 从IN 单元读入数据送R000000001 00000000 ; ADD R0,R0R0 和自身相加,结果送R000000010 00110000 ; OUT R0R0 的值送OUT 单元显示00000011 11100000 ; JMP START跳转至00H 地址00000100 0000000000000101 01010000 ; HLT停机三、项目要求及分析:1. 试修改现有的指令系统,将加法指令的功能修改为R0的内容和某个存储单元的内容相加;增加存数、取数和减法三条机器指令,指令助记符分别为STA、LAD 和SUB,指令操作码分别为十六进制的60、70和80。
简单模型机实验报告

简单模型机实验报告篇一:模型机实验报告HUNAN UNIVERSITY课程实习报告题目:模型机学生姓名学生学号 XX0801328专业班级计算机科学与技术(3)班指导老师方恺晴完成日期思考题:1. 给定一个复合运算式子以及指令码IR[7..5]与八位BUS总线对应情况。
要求写出七条指令新的指令码并写出复合运算执行mif文件。
修改模型机电路调试程序以实现复合运算。
例:已知A=55H,B=8AH,C=F0H;IR[7..5]对应BUS8,BUS1,BUS3;写出(Aplus/B)^(/(/CplusB))的mif文件,并在模拟机上实现。
答:模拟机电路修改如下:存储器预设指令重设:计算结果:(A+/B)^(/(/C+B))=42H2. Microcomputer.vhd代码中进程ct1,ct2,ct3,ct4功能划分依据是什么?ct1:微序列控制器下址跳转。
ct2:实现各种指令,主要集中在实现从存储器或者寄存器释放数据到总线上。
ct3:完成各种指令,从总线上装载数据到相应的存储器或者寄存器中。
ct4:生成下址,判断下址生成方式,根据不太那个的方式生成下址。
3. Microcomputer.vhd代码中如何定义并初始化RAM?type ram is array(0 to 37)of std_logic_vector(7 downto 0); --38*8ramsignal ram8:ram:=(x”20”, x”1e”, x”80”, x”40”, x”20”, x”20”, x”1d”, x”c0”, x”20”, x”40”, x”21”, x”20”, x”1f”, x”80”, x”40”, x”22”, x”20”, x”1e”, x”c0”, x”22”, x”80”, x”e0”, x”21”, x”40”, x”23”, x”60”, x”23”, x”a0”, x”00”, x”55”, x”8a”, x”f0”,others=>x”00”) –initialize ram44. Microcomputer.vhd代码中bus_reg_t2 将ram8存储器中对应于ar中地址单元的数据取出来放到bus_reg_t2寄存器中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验项目CPU与简单模型机设计实验实验时间2015年11月7日实验目的(1) 掌握一个简单CPU 的组成原理。
(2) 在掌握部件单元电路的基础上,进一步将其构造一台基本模型计算机。
(3) 为其定义五条机器指令,编写相应的微程序,并上机调试掌握整机概念。
实验设备PC机一台,TD-CMA实验系统一套实验原理本实验要实现一个简单的CPU,并且在此CPU 的基础上,继续构建一个简单的模型计算机。
CPU 由运算器(ALU)、微程序控制器(MC)、通用寄存器(R0),指令寄存器(IR)、程序计数器(PC)和地址寄存器(AR)组成,如图5-1-1 所示。
这个CPU 在写入相应的微指令后,就具备了执行机器指令的功能,但是机器指令一般存放在主存当中,CPU 必须和主存挂接后,才有实际的意义,所以还需要在该CPU 的基础上增加一个主存和基本的输入输出部件,以构成一个简单的模型计算机。
图5-1-1 基本CPU 构成原理图除了程序计数器(PC),其余部件在前面的实验中都已用到,在此不再讨论。
系统的程序计数器(PC)和地址寄存器(AR)集成在一片CPLD 芯片中。
CLR 连接至CON 单元的总清端CLR,按下CLR 按钮,将使PC 清零,LDPC 和T3 相与后作为计数器的计数时钟,当LOAD为低时,计数时钟到来后将CPU 内总线上的数据打入PC。
如图5-1-2所示。
图5-1-2 程序计数器(PC)原理图本模型机和前面微程序控制器实验相比,新增加一条跳转指令JMP,共有五条指令:IN(输入)、ADD(二进制加法)、OUT(输出)、JMP(无条件转移),HLT(停机),其指令格式如下(高4位为操作码):其中JMP 为双字节指令,其余均为单字节指令,********为addr 对应的二进制地址码。
微程序控制器实验的指令是通过手动给出的,现在要求CPU 自动从存储器读取指令并执行。
根据以上要求,设计数据通路图,如图5-1-3 所示。
本实验在前一个实验的基础上增加了三个部件,一是PC(程序计数器),另一个是AR(地址寄存器),还有就是MEM(主存)。
因而在微指令中应增加相应的控制位,其微指令格式如表5-1-1 所示。
图5-1-3 数据通路图表5-1-1 微指令格式系统涉及到的微程序流程见图5-1-4 所示,当拟定“取指”微指令时,该微指令的判别测试字段为P<1>测试。
指令译码原理见图3-2-3 所示,由于“取指”微指令是所有微程序都使用的公用微指令,因此P<1> 的测试结果出现多路分支。
本机用指令寄存器的高6 位(IR7—IR2)作为测试条件,出现5路分支,占用5个固定微地址单元,剩下的其它地方就可以一条微指令占用控存一个微地址单元随意填写,微程序流程图上的单元地址为16 进制。
图5-1-4 简单模型机微程序流程图当全部微程序设计完毕后,应将每条微指令代码化,表5-1-2 即为将图5-1-4 的微程序流程图按微指令格式转化而成的“二进制微代码表”。
表5-1-2 二进制微代码表设计一段机器程序,要求从IN 单元读入一个数据,存于R0,将R0 和自身相加,结果存于R0,再将R0 的值送OUT 单元显示。
根据要求可以得到如下程序,地址和内容均为二进制数。
实验步骤1. 按图5-1-5 连接实验线路。
2. 写入实验程序,并进行校验,分两种方式,手动写入和联机写入。
1) 手动写入和校验(1) 手动写入微程序①将时序与操作台单元的开关KK1 置为‘停止’档,KK3 置为‘编程’档,KK4 置为‘控存’档,KK5 置为‘置数’档。
②使用CON 单元的SD05——SD00 给出微地址,IN 单元给出低8 位应写入的数据,连续两次按动时序与操作台的开关ST,将IN 单元的数据写到该单元的低8 位。
③将时序与操作台单元的开关KK5 置为‘加1’档。
④IN 单元给出中8 位应写入的数据,连续两次按动时序与操作台的开关ST,将IN 单元的数据写到该单元的中8 位。
IN 单元给出高8 位应写入的数据,连续两次按动时序与操作台的开关ST,将IN 单元的数据写到该单元的高8 位。
⑤重复①、②、③、④四步,将表5-1-2 的微代码写入2816 芯片中。
(2) 手动校验微程序①将时序与操作台单元的开关KK1 置为‘停止’档,KK3 置为‘校验’档,KK4 置为‘控存’档,KK5 置为‘置数’档。
②使用CON 单元的SD05——SD00 给出微地址,连续两次按动时序与操作台的开关ST,MC 单元的指数据指示灯M7——M0 显示该单元的低8 位。
③将时序与操作台单元的开关KK5 置为‘加1’档。
④连续两次按动时序与操作台的开关ST,MC 单元的指数据指示灯M15——M8 显示该单元的中8 位,MC 单元的指数据指示灯M23——M16 显示该单元的高8 位。
⑤重复①、②、③、④四步,完成对微代码的校验。
如果校验出微代码写入错误,重新写入、校验,直至确认微指令的输入无误为止。
(3) 手动写入机器程序①将时序与操作台单元的开关KK1 置为‘停止’档,KK3 置为‘编程’档,KK4 置为‘主存’档,KK5 置为‘置数’档。
②使用CON 单元的SD07——SD00 给出地址,IN 单元给出该单元应写入的数据,连续两次按动时序与操作台的开关ST,将IN 单元的数据写到该存储器单元。
③将时序与操作台单元的开关KK5 置为‘加1’档。
④IN 单元给出下一地址(地址自动加1)应写入的数据,连续两次按动时序与操作台的开关ST,将IN 单元的数据写到该单元中。
然后地址会又自加1,只需在IN 单元输入后续地址的数据,连续两次按动时序与操作台的开关ST,即可完成对该单元的写入。
⑤亦可重复①、②两步,将所有机器指令写入主存芯片中。
(4) 手动校验机器程序①将时序与操作台单元的开关KK1 置为‘停止’档,KK3 置为‘校验’档,KK4 置为‘主存’档,KK5 置为‘置数’档。
②使用CON 单元的SD07——SD00 给出地址,连续两次按动时序与操作台的开关ST,CPU内总线的指数据指示灯D7——D0 显示该单元的数据。
③将时序与操作台单元的开关KK5 置为‘加1’档。
④连续两次按动时序与操作台的开关ST,地址自动加1,CPU 内总线的指数据指示灯D7 ——D0 显示该单元的数据。
此后每两次按动时序与操作台的开关ST,地址自动加1,CPU 内总线的指数据指示灯D7——D0 显示该单元的数据,继续进行该操作,直至完成校验,如发现错误,则返回写入,然后校验,直至确认输入的所有指令准确无误。
⑤亦可重复①、②两步,完成对指令码的校验。
如果校验出指令码写入错误,重新写入、校验,直至确认指令码的输入无误为止。
2) 联机写入和校验联机软件提供了微程序和机器程序下载功能,以代替手动读写微程序和机器程序,但是微程序和机器程序得以指定的格式写入到以TXT 为后缀的文件中,微程序和机器程序的格式如下:本次实验程序如下,程序中分号‘;’为注释符,分号后面的内容在下载时将被忽略掉:选择联机软件的“【转储】—【装载】”功能,在打开文件对话框中选择上面所保存的文件,软件自动将机器程序和微程序写入指定单元。
选择联机软件的“【转储】—【刷新指令区】”可以读出下位机所有的机器指令和微指令,并在指令区显示,对照文件检查微程序和机器程序是否正确,如果不正确,则说明写入操作失败,应重新写入,可以通过联机软件单独修改某个单元的指令,以修改微指令为例,先用鼠标左键单击指令区的‘微存’TAB 按钮,然后再单击需修改单元的数据,此时该单元变为编辑框,输入6 位数据并回车,编辑框消失,并以红色显示写入的数据。
3. 运行程序方法一:本机运行将时序与操作台单元的开关KK1、KK3 置为‘运行’档,按动CON 单元的总清按钮CLR,将使程序计数器PC、地址寄存器AR 和微程序地址为00H,程序可以从头开始运行,暂存器A、B,指令寄存器IR 和OUT 单元也会被清零。
将时序与操作台单元的开关KK2 置为‘单步’档,每按动一次ST 按钮,即可单步运行一条微指令,对照微程序流程图,观察微地址显示灯是否和流程一致。
每运行完一条微指令,观测一次CPU 内总线和地址总线,对照数据通路图,分析总线上的数据是否正确。
当模型机执行完JMP 指令后,检查OUT 单元显示的数是否为IN 单元值的2 倍,按下CON单元的总清按钮CLR,改变IN 单元的值,再次执行机器程序,从OUT 单元显示的数判别程序执行是否正确。
方法二:联机运行将时序与操作台单元的开关KK1 和KK3 置为‘运行’档,进入软件界面,选择菜单命令“【实验】—【简单模型机】”,打开简单模型机数据通路图。
按动CON 单元的总清按钮CLR,然后通过软件运行程序,选择相应的功能命令,即可联机运行、监控、调试程序,当模型机执行完JMP 指令后,检查OUT 单元显示的数是否为IN 单元值的2 倍。
在数据通路图和微程序流中观测指令的执行过程,并观测软件中地址总线、数据总线以及微指令显示和下位机是否一致。
图5-1-5 实验接线图实验结果输入数据助记符机器指令代码结果备注00010001 IN 00100000 R0=11 从IN单元读入数据到R0中ADD 00000000 R0=22 R0和自身相加结果送到R0中OUT 00110000 OUT=22 把R0的数据传送到OUT单元显示JMP 11100000 跳转到00H地址HLT 01010000 停机操作实验结果如图所示:结果分析在IN单元中输入数据00010001,使用CON 单元的SD27——SD20 给出指令IN、ADD、OUT、TMP、HLT的数据00100000、00000000、00110000、11100000、01010000,连续按动时序与操作台的开关ST,观察电脑中的数据通路图记录数据。
(1)当CON单元输入指令代码00100000时,数据通路图中IN中的数据传送到R0中,R0中显示R0=11,实现了从IN单元读入数据传送到R0中过程。
(2)当CON单元输入指令代码00000000时,数据通路图中A=11、B=11通过ALU运算器实现自加后把结果传送给R0,R0中显示R0=22,实现了R0和自身相加结果送到R0中的过程。