第一篇:非常简单CPU数据通路设计实验报告
非常简单CPU数据通路设计
【实验目的】
1.掌握CPU的设计步骤 2.学会芯片的运用及其功能 【实验环境】
Maxplus2环境下实现非常简单CPU数据通路的设计 【实验内容】
绘制非常简单CPU的寄存器:一个8位累加器AC,一个6位的地址寄存器AR,一个6位的程序计数器PC,一个8位的数据寄存器DR,一个2位的指令寄存器IR。其数据通路详见教材P。
1、零件制作
6位寄存器
(自行设计)
6位计数器
(自行设计)
8位寄存器
(可选择74系列宏函数74273)
8位计数器
(由两个74161构成)
2位寄存器
(由D触发器构成,自行设计)
6三态缓冲器
(自行设计,可由74244内部逻辑修改而成)
8三态缓冲器
(选择74系列宏函数74244,或作修改)
alu模块
(自行设计,限于时间,其内部逻辑不作要求)
2、选择器件,加入数据通路顶层图
8位累加器AC:选择8位计数器
6位地址寄存器AR:reg6
6位的程序计数器PC:cou6
8位的数据寄存器DR:选择8位寄存器
2位的指令寄存器IR:选择2位寄存器
3、为PC、DR加入三态缓冲器。
4、调整版面大小,器件位置。
5、设计地址引脚、数据引脚、8位内部总线,加入数据引脚到内部总线的缓冲器。
6、连接各器件之间以及到内部总线的线路,设计并标注各控制信号。
7、(选做)编译之后,给出微操作 AR<-PC 的测试方法及仿真结果。
8、实验报告中应给出各元部件的实现方法、内部逻辑贴图、打包符号说
明及顶层的“非常简单CPU”数据通路图。
实验报告
一、实验步骤
基于前面非常简单CPU的讲解,我掌握了非常简单CPU的指令集结构及非常简单CPU的指令读取过程和执行过程,本次实验是在上次实验的基础之上完成非常简单CPU数据通路的设计,其步骤如下:(1)、AC累加器原理图如下:
打包后得到如下:
(2)、两位高地址寄存器IR的设计如下:
打包后得电路图如下:
(3)、6位地址寄存器AR设计如下:
打包后AR如下:
(4)、八位地址寄存器DR如下:
打包后如下:
(5)、程序计数器PC如下:(老师已给出)
打包后得:
(6)、控制8位地址总线的三态缓冲器电路如下:
打包图如下:
同理有控制6位地址总线的三态缓冲器:
打包图如下:
最重要的部分ALU设计如下:
由一个八与门电路和并行加法器连入一个16位输入的数据选择器,在受到SEL和GN控制时分别选择and8或者并行加法器得到的结果并送到AC的输入端
打包如下:
其中八输入与门为下图:
并行加法器为下图:
十六位数据选择器为下图:
最后得到简单CPU设计数据通路如下:
仿真波形为下图:
说明:从图中可以看出当PC输入为100011时AR的输出也为10011,即该CPU实现了PC到AR的功能。CPU功能验证完毕!实验结论:
整体来看,简单CPU的设计基本完工,但是有些地方不够完善,所以还没能够实现所有的 功能。实验感想:
本次实验是在对基本CPU的设计的理解上完成的,其中运用到了很多数电方面的知识。所以这对知识的融会贯通很有好处。设计该简单CPU时比较难的地方就是ALU部分,这里用到了并行加法器,数据选择器和门电路的等,由于在EDA实验时有了比较好的基础,所以在设计这个部分时不时非常难,但是我也明白了以前知识的用处是很大的,做好复习很重要!
第二篇:计算机组成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.进行仿真并验证其正确性:
第三篇:数据通路实验报告
数据通路实验报告
数据通路实验报告
一. 实验概述。
1.数据通路的设计原则。
数据通路的设计直接影响到控制器的设计,同时也影响到数字系统的速度指标和成本。一般来说,处理速度快的数字系统,其中独立传递信息的通路较多。当然,独立数据传送通路的数量增加势必提高控制器设计复杂度。因此,在满足速度指标的前提下,为使数字系统结构尽量简单,一般小型系统中多采用单一总线结构。在较大系统中可采用双总线结构或者三线结构。2.数据通路的结构。
① 算术逻辑单元ALU:有S3,S2,S1,S0,M,CN等6个控制端,用于选择运算类型。
② 暂存器A和B:保存通用寄存器组读出的数据或BUS上来的数据。③ 通用寄存器组R:暂时保存运算器单元ALU算出的结果。④ 寄存器C:保存ALU运算产生的进位信号。
⑤ RAM随机读写存储器:受读/写操作以及时钟信号等控制。⑥ MAR:RAM的专用地址寄存器,寄存器的长度决定RAM的容量。⑦ IR:专用寄存器,可存放由RAM读出的一个特殊数据。
⑧ 控制器:用来产生数据通路中的所有控制信号,它们与各个子系统上的使能控制信号一一对应。
⑨ BUS:单一数据总线,通过三态门与有关子系统进行连接。
数据通路实验报告
二. 实验设计及其仿真检测。
一,运算器。
8位运算器VHDL
数据通路实验报告
数据通路实验报告
二波形仿真
存储器。
顶层设计:
其中sw_pc_ar的VHDL语言描述:,数据通路实验报告
波形仿真
三,原仿真实验电路。
数据通路实验报告
仿真结果:
四,修改电路。
因为此次实验结果需要下载到FPGA板中进行操作及观察,而原始电路中,需要输入的变量数量过多,导致电板中的输入按键不够用,所以需要对电路进行修改。此时我们引入一个计数器PC来代替需要手动输入的指令alu_sel[5..0]以及数据d[7...0]。同时还需要引入数码管的位选信号译码器choose和段选信号译码器xianshi。计数器PC的VHDL语言描述
数据通路实验报告
位选信号译码器choose的VHDL语言描述
数据通路实验报告
段选信号译码器的VHDL语言描述
经过修改和完善以后的电路图为
数据通路实验报告
完善后的电路的引脚分配情况
数据通路实验报告
三. 实验过程。
a)进行数学运算以及将运算结果储存在某个固定的内存地址处。然后从该地址处读出结果 i.ii.打开pc_sel[2],重置地址计数器。
打开总线开关bus_sel[0],和PC_sel[2],pc_sel[1],pc_sel[0],让地址计数器开始计数,跳变到某个地址x时关闭。
iii.打开总线开关BUS_SEL[4],打开暂存器r1的开关ld_reg[4],然后打开计数器开关en计数器开始计数,当计数到需要的数字a时,关闭计数器开关en,此时数字a存入暂存器r1,关闭暂存器的开关ld_reg[4],后再关闭总线开关BUS_SEL[4],然后再打开计数器的清零开关clr再关闭。iv.v.同理第iii步,在暂存器r2中存入数据b。打开总线开关
bus_sel[0].地址计数器开关
ld_reg[0]和pc_sel[2],pc_sel[1],pc_sel[0]选择存储地址 vi.打开运算器到总线的开关bus_sel[1],打开计数器en计数开关en当计数器跳
数据通路实验报告
变到加法指令011001时,关闭计数开关en,然后代开rom的地址开关pc_sel[2],以及可写开关we_rd[1]。将从运算器中计算出来的运算结果a+b存储到ram中的x地址中,关闭可写开关we_rd[1],关闭pc_sel[2]和总线开关,最后将计数器清零。
vii.打开ram的可读开关,读取x地址处的数据a+b。
四. 实验现象。
输入数据a
输入数据b
数据通路实验报告
进行运算并将运算结果写入内存
数据通路实验报告
从内存中读取计算结果
数据通路实验报告
五. 实验心得。
第一次在电板上进行这么多的操作。操作过程虽然很多,但只要理解操作过程,明白各个按键所设置的引脚作用,实验其实并不难,重点在于要理解过程,明白数据的输入,存入寄存器,运算以及往内存中进行存取值的操作,那么数据通路的按键很容易记住。
在实验过程中还是存在很多问题的,尤其的刚开始做实验的时候,不理解数据通路实验过程中各个门的输入的意义和顺序,但真正懂得的时候,实验就变得简单了。
第四篇:运算器数据通路实验报告
运算器数据通路实验
设计报告
学号: 姓名: 成绩: 学号: 姓名: 成绩:
一、实验名称:
总线、半导体静态存储器实验
二、实验目的.1.熟悉函数功能发生器的功能、使用方法。2.熟悉运算器的数据传送通路。
3.完成几种算逻运算操作,加深对运算器工作原理的理解。
三、实验原理
运算器是计算机中对数据进行运算操作的重要部件,它的核心是ALU 函数功能发生器(由EPM7064S 构成),其次还要有存放操作数和运算的中间结果之寄存器以及传送数据的总线等部分。选用不同的控制信号,运算器可以完成不同的运算功能。1.函数功能发生器(ALU)的功能。
该函数功能发生器(ALU),当输入为Aj、Bj,对应输出为Fj(j=0,1,2,3,4,5,6,7),它可 实现8 种不同的算术运算和逻辑算,而且通过对控制参数SEL2~SEL0S0 来选择。2.数据传送通路实验电路方案
实验方案框图见图2—5 所示。
图中SA、SB 为存放两个现行操作的缓冲寄存器,其中SA 兼作存放中间结果的累加器,并且可以通过SA 所连接的八个数据灯显示。SA、SB 接收来自总线的数据信息送入ALU 进行 算术或逻辑操作。通过移位门将运算操作结果送到总线。并且ALU 和总线之间需用三态门隔 离(采用74LS245)。
四、实验内容
1.按照实验电路方案框图,设计一个能完成下列八种补码运算指令的八位运算器。该运算器实现的八种功能如表2—1 所示。
表2—1:
2.根据运算器设计,选择所需元器件,画出实验电路的详细逻辑图,对开关,单脉冲等 定义。因为和上次实验类似,也是绝大多数的器件在“数据通路”中已安排好,只要控制各 个控制点即可,除了开关组通过三态传输门(74LS245)的接法和实验一一样外,设置一个指令寄存器(IR),用74LS573 担当IR。通过八根连接线和“数据通路”中的八位总线连接起来。存放ALU 的控制信息SEL2~SEL0。为了便于观察IR 中内容,可以在IR 的输出端同时接上三 个电平显示灯。有的同学如用三个电平开关设置SEL2~SLE0。当然可以得出结果,但是由于 IR 是一个不可缺少的计算机部件,为了达到完整熟悉计算机各组成部分的目的,这里专门设置了指令寄存器IR。
3.在电路上进行表2—1 所列的八种指令的手动操作,每次一条指令。实验时可由数据 开关输入指令码及操作数,予以功能的验证。4.本实验应实现的操作
K→SA(开关输入的第一个操作数置入SA,LED 显示)K→SB(开关输入的第二个操作数置入SB,无显示)K→IR(开关输入的ALU 控制代码置入IR)
ALU 运算结果通过ALU-244→SA(将运算结果送SA 显示)具体实验过程(仅仅作为参考)如下:
1)从输入设备(八个钮子开关)置入第一个数据,74LS245 的E=0,74LS573 的C 由“0”变为“1”(锁存)后再变为“0”(保持);送入Sa(该寄存器接有LED 显示); 2)从输入设备(八个钮子开关)置入第一个数据,74LS245 的E=0,74LS573 的C 由“0”变为“1”(锁存)后再变为“0”(保持);送入Sb(该寄存器没有接LED 显示); 3)从输入设备(八个钮子开关)将需要进行运算操作(如加法操作)的控制代码(具体内容可见表3-4)置入到IR,74LS245 的E=0,74LS573 的C 由“0”变为“1”(锁存)后再变为“0”(保持);
4)控制接通ALU-244,使运算结果上总线;
5)将结果置入Sa,并通过所接的LED 将结果显示出来。
五、测试结果与性能分析
1、测试结果:
1)数据A准备→三态门①打开→给寄存器Sa脉冲→数据进入Sa;
数据B准备→给寄存器Sb脉冲→数据进入Sb; 数据准备(指令)→给指令寄存器IR脉冲→指令进入IR→三态门①关闭; 2)ALU按照指令进行计算,结果进入总线→三态门②(寄存器Sa往显示灯)打开→给寄存器Sa脉冲→显示灯显示计算结果
实验输入三组数据进行计算 00010000 – 00000001 = 00001111;00010101 & 00001010 = 00000000;00001000 + 00000110 = 00001110;
2、性能分析
单总线结构数据传送慢,使用多总线结构可以提高数据传送效率 另外,EPM7064S 器件性能介绍:
高性能和EEPROM的可编程逻辑器件(PLD)的第二代基于Max 架构 5.0-V在系统可编程能力(ISP)具有完整的EPLD的逻辑密度
5纳秒引脚到引脚的逻辑延时高达175.4 MHz的计数器频率(包括互连)
六、课程设计总结(包括设计的总结和需要改进之处及体会)
通过这次实验设计,我们可以了解运算器数据通路的工作原理,各组数据的走向和时间逻辑关系,也更清楚认识了指令控制的重要性。另外这是第一次在电脑上对运算器芯片的引脚进行设置,稍微有一点差错就会造成实验结果的差异,因此使得我们在实验中更加专注和仔细。这次实验的分工也很明确,我负责在实验台上搭线,张成涛同学负责在电脑上设置运算器引脚。但最终因为实验台的更换问题,实验结果没有调试出来。换了一个电脑进行引脚设置后,终于成功了。由于有协调的合作,实验操作过程也不会复杂繁琐,这次实验过程很有趣,并且让我们对机器内部数据通路的理解有更进一步的启发。
教师评语:
教师签字:
日期:
第五篇:实验4 数据通路 实验报告
班级:计算机科学与技术3班
学号: 20090810310
姓名:
康小雪
日期: 2011-10-14
实验3 存储器实验
预习实验报告
疑问:
1、数据通路是干嘛的?
2、数据通路如何实现其功能?
3、实验书上的存储器部分总线开关接在高电平上,是不是错了?
实验报告
一、波形图:
参数设置:
Endtime:2.0us
Gridsize:100.0ns 信号设置:
clk:
时钟信号,设置周期为100ns占空比为50%。
bus_sel:
sw|r4|r5|alu|pc_bus的组合,分别代表的是总线(sw_bus)开关,将
存储器r4的数据显示到总线上,将存储器r5的数据显示到总线上,将alu的运算结果显示到总线上,将pc的数据打入AR中二进制输入,低电平有效。
alu_sel:
m|cn|s[3..0]的组合,代表运算器的运算符号选择,二进制输入,高
电平有效。
ld_reg:
lddr1|lddr2|ldr4|ldr5|ld_ar的组合,分别表示将总线数据载入寄存器
r1,r2,r4, r5或AR中,二进制输入,高电平有效。
pc_sel:
pc_clr|ld|en的组合,分别代表地址计数器PC的清零(pc_clr)、装
载(pc_ld)和计数使能信号(pc_en),二进制输入,低电平有效。
we_rd:
信号we和rd的组合,分别代表对ram的读(we)与写(rd)的操作,二进制输入,高电平有效
k:
k [7]~ k [0],数据输入端信号,十六进制输入。
d:
d[7]~d[0],数据输出中间信号,十六进制双向信号。
d~result:
d [7] result ~d[0] result,最终的数据输出信号,十六进制输出。ar:
ar[7]~ ar[0],地址寄存器AR的输出结果,十六进制输出。pc:
pc [7]~ pc [0],地址计数器PC的输出结果,十六进制输出。
仿真波形
以在01H单元中写入05H、02H单元中写入0AH并进行【(A加B)减(非A与B)加B】为例:
1)初始状态:bus_sel=11111,alu_sel=00000,ld_reg=00000,pc_sel=100,we_rd=00,k=00H,总线上无数据,呈高阻态。2)读取01H单元的05A:
① 置数法PC=01H:bus_sel=01111,pc_sel=101 ② PC->AR:bus_sel=11110,ld_reg=00001 ③ 读01H单元的数据放入R1中:bus_sel=11111,ld_reg=10000,we_rd=01 3)读取02H单元的0AH:
① PC+1,PC->AR:bus_sel=11110,ld_reg=00001,pc_sel=111 ② 读01H单元的数据放入R2中:bus_sel=11111,ld_reg=01000,we_rd=01 4)将地址加到03H :bus_sel=11110,ld_reg=00001,pc_sel=111 5)验证数据并运算: bus_sel=11101 ① 读取R1中的数据:alu_sel=010000,得到R1=05H ② 读取R2中的数据:alu_sel=101010,得到R2=0AH ③ 计算(A加B)结果存于R4中:alu_sel=011001,ld_reg=00100,结果为0FH ④ 计算(非A与B)结果存于03H单元中:alu_sel=100010,we_rd=10,结果为0AH ⑤ 计算((A加B)加B)结果存于04H单元中:
R4->R1:bus_sel=10111,ld_reg=10000 PC+1,PC->AR:bus_sel=11110,ld_reg=00001,pc_sel=111 计算((A加B)加B)结果存于04H单元中:bus_sel=11101,alu_sel=011001,we_rd=10 ⑥ 计算(((A加B)加B)减(非A与B))结果存于05H中:
((A加B)加B)->R1:bus_sel=11111,ld_reg=10000,we_rd=01 (非A与B)->R2:
PC=03H:k=03H,bus_sel=01111,pc_sel=101 PC->AR:bus_sel=11110,ld_reg=00001 (非A与B)->R2:bus_sel=11111,ld_reg=01000,we_rd=01 PC=05H:
PC=05H:k=03H,bus_sel=01111,pc_sel=101 PC->AR:bus_sel=11110,ld_reg=00001
(((A加B)加B)减(非A与B))结果存于05H中:bus_sel=11101,alu_sel=000110,we_rd=10 最后结果为0FH。结论:
本实验的设计能结合了运算器和存储器,能实现在mif文件中进行初始化,将固定地址单元中存储的数据读取到运算器中进行(((A加B)加B)减(非A与B))的运算并将结果存于指定的内存单元中,与实验要求一致,故电路设计正确。
二、实验日志
预习疑问解答:
1.通路是干嘛的?
在数字系统中,各个子系统通过数据总线连接形成的数据传送路径称为数据通路.2.通路如何实现其功能?
在这次的实验中,数据通路主要是由运算器部分和存储器部分组成的,通过运算器的运算结合存储器在mif文件的中的操作进行数据的传输与存储,从而构成一个数据通路.错
3.书上的存储器部分总线开关接在高电平上,是不是错了? 事实证明没有接错.
思考题:
1. 画数据通路电路图时,如何连结单一总线? 如图:
ALU模块的sw_bus依然连接bus_sel,存储器部分的sw_bus连接高电平.2. 如何统一两个模块的总线输入端k[7..0]及inputd[7..0]?
答:如图: 输入放在运算器部分,存储器部分无输入,存储器部分的数据要么来自总线传输,要么从mif文件中读取.实验中遇到的问题:
1.把之前的alu和ram的原理图拷到了当前工程下面。直接生成该工程的符号文件,连接起来,但是仿真有问题。
几乎是在每一次和总线交换数据的时候都得不到正确的值。下面是解决的过程:
我怀疑是两个模块之间通过总线传输的数据没有传输成功,于是把alu模块的d引了一个输出端口d_alu,从ram模块的d引出了一个输出端口d_ram,在仿真波形图上,然后就可以看到了数据到达总线上了,而且这个时候d的值也能看到了,只是后面的最后一个读操作出来的数据不对,本来应该是写进去的07,但现在是17,再仿真就会变成别的数据。2.在连接电路图的时候,我以为存储器部分的sw_bus连在高电平上是错的,然后又连到了bus_sel[4],所以得到了上一个部分的仿真结果,后来不研究了一下那个高电平,发现是用来处理单一总线问题的,就改成了与书上一样的图,我以为上面出现的错误结果和这个有关,改了之后波形图有变化,但是,还是是错误的.但是在两种情况下功能仿真的结果都是正确的:
问题解决了~
原因是周期太短,计算结果还来不及存入到内存单元中,把写入内存的时间周期延长一个周期结果就出来了。电路本身没有问题。
实验心得:
这次实验是基于前两次实验的成果而成的综合,之前没有发现验收成果后模块中还存在什么问题,把两个模块一拼在一起,问题就出来了,而且不止我一个人出现这样的状况,一直没弄明白这是为什么,后来经过反反复复的仿真和观察,终于找出了问题的原因,并顺利解决了。这一次又学到了许多东西。