一、实验目的
- 熟悉模型计算机的数据通路;
- 锻炼分析问题与解决问题的能力,在出现故障的情况下,独立分析故障现象,并排除故障。
二、实验设备
- TEC-4计算机组成原理实验仪一台;
- 导线若干。
三、实验电路
附图中示出了数据通路实验电路图。该数据通路的一部分是通用寄存器堆RF(寄存器组)与ALU、暂存寄存器连接在一起形成的。通用寄存器堆连接算术逻辑运算模块,本实验涉及其中的操作数寄存器DR2。
DR2在运算器的实验中使用过。通用寄存器堆RF(U32)由一个ISP1016实现,功能上与两个4位的MC14580并联构成的寄存器堆类似。RF内含四个8位的通用寄存器R0、R1、R2、R3,带有一个写入端口和两个输出端口,从而可能同时写入一路数据,读出两路数据。写入端口取名为WR端口,连接一个8位的暂存寄存器(U14)ER,这是一个74HC374。输出端口取名为RS端口(B端口)、RD端口(A端口),连接运算器模块的两个操作数寄存器DR1、DR2。RS端口(B端口)的数据输出还可通过一个8位的三态RS0(U15)直接向DBUS输出。
双端口的通用寄存器堆模块的控制信号中,RS1、RS0用于选择从RS端口(B端口)读出的通用寄存器,RD1、RD0用于选择从RD端口(A端口)读出的通用寄存器。
而WR1、WR0则用于选择从WR端口写入的通用寄存器。WRD是写入控制信号,当WRD=1时,在T2上升沿时刻,将暂存寄存器ER中的数据写入通用寄存器堆中, WR1、WR0选中的寄存器;当WRD=0时,ER中的数据不写入通用寄存器中。LDER信号控制ER从DBUS写入数据,当LDER=1时,在T4的上升沿,DBUS上的数据写入ER。RS BUS#信号则控制RS端口到DBUS的输出三态门,是一个低有效信号。以上控制信号各自连接一个二进制开关K0-K15。
四、实验内容
(1)
将实验电路与控制台的有关信号进行线路连接,方法同前面的实验1。
(2)
用8位数据开关向RF中的四个通用寄存器分别置入以下数据:R0=0FH,R1=F0H,R2=55H,R3=AAH。
给R0置入0FH的步骤是:先用8位数码开关SW0-SW7将0FH置入ER;并且选择WR1=0、WR0=0、WRD=1,产生脉冲T2, 可将ER的数据置入RF。给其他通用寄存器置入数据的步聚与此类比。
(3)
分别将R0至R3中的数据读入到DR2寄存器中和DBUS上,观察其数据是否是存入R0至R3中的数据,并记录数据。其中DBUS上的数据可直接用指示灯显示,DR2中的数据可通过运算器ALU,用直通方式将其送往DBUS,在数据指示灯上显示。
(4)
根据图中数据通路的连接关系,从R0 读出数据送ALU的B端,从R1读出数据送ALU的A端,控制S2S1S0完成加法和直通运算。
五、实验步骤
(1)接线
IAR BUS#接VCC,禁止中断地址寄存器IAR向数据总线DBUS送数据。CER接GND,CEL#=VCC,禁止存储器工作。
M1(M2):当M1 (M2)= 0时,操作数寄存器DR1从寄存器堆RF接收数据。 M2接GND,使DR2选择寄存器堆RF作为数据来源。M1接GND, 使DR1选择寄存器堆RF作为数据来源
置DP=1,DZ=0,DB=0,使实验系统开机后处于单拍状态。
将开关IR/DBUS至于DBUS位置。
K0-K15对应与图中数据通路中的控制信号相连接。记下对应关系。
合上电源。按CLR#按钮,使实验系统处于初始状态。
脉冲产生,按QD。
(2)向RF中的四个通用寄存器分别写入数据
根据数据在数据通路中的流向,正确控制数据通路中各部件。写出每一步中各个部件控制信号(Ki)取值。形成操作序列。
(3)从RF中的四个通用寄存器分别读取数据
分别将R0至R3中的数据读出到DR2寄存器中和DBUS上,观察其数据是否是存入R0至R3中的数据。形成操作序列。
根据数据在数据通路中的流向,正确控制数据通路中各部件。写出每一步中各个部件控制信号(Ki)取值。形成操作序列。
(4)从RF中的R0、R1寄存器中读取数据并做加法和直通运算
从R0读出数据送ALU的B端,从R1读出数据送ALU的A端,控制S2S1S0完成加法和直通运算。形成操作序列。
六、操作序列
(1)向RF中的四个通用寄存器分别写入数据
各开关所处状态的理由(以将OFH写入R0为例):
Step1,将SW的数据通到暂存器中
- 由于需要从SW处传入数据,因此系统总线中需要将SW_BUS置为有效(即令SW_BUS# =0),其余总线置为无效。
- 因为本实验不需要使用RAM,所以将CEL始终置为无效(即令CEL# =1)。
- 当LDER=l时,遇到上升沿后,系统会将数据总线DBUS上的数据打入暂存寄存器 ER。
Step2,将暂存器中的数据通到R0寄存器中
- 由于需要将数据存入R0寄存器中,因此令WR1=0,WR2=0,表示数据存入00寄存器(即R0)。
- 当WRD=1时,遇到上升沿后,系统会将ER暂存器中的数据写入由WR1、WR0选中的寄存器中(即R0)。
操作汇总:
操作内容 | 操作步骤 |
将OFH写入R0 | 置SW_BUS# =0,LDER=1,WRD=0 置WR1=0,WR0=0 将SW的数值设为0000 1111 按下QD 置WRD=1 再次按下QD |
将FOH写入R1 | 置SW_BUS# =0,LDER=1,WRD=0 置WR1=0,WR0=1 将SW的数值设为1111 0000 按下QD 置WRD=1 再次按下QD |
将55H写入R2 | 置SW_BUS# =0,LDER=1,WRD=0 置WR1=1,WR0=0 将SW的数值设为0101 0101 按下QD 置WRD=1 再次按下QD |
将AAH写入R3 | 置SW_BUS# =0,LDER=1,WRD=0 置WR1=1,WR0=1 将SW的数值设为1010 1010 按下QD 置WRD=1 再次按下QD |
(2)从RF中的四个通用寄存器分别读取数据
1:读出R0-R3的内容从DR2端经ALU输出
各开关所处状态的理由(以将R0的内容从DR2端经ALU输出为例):
- 当M2=0且LDDR2=1时,遇到下降沿后,DR2接收来自寄存器堆A端口的数据。
- 由于需要从ALU输出数据,因此系统总线中需要将ALU_BUS置为有效(即令ALU_BUS=1),其余总线置为无效(即令RS_BUS# =1,SW_BUS# =1)。
- 因为本实验不需要使用RAM,所以将CEL始终置为无效(即令CEL# =1)。
- 由于需要将R0寄存器的数据输出,因此令RD1=0,RD0=0,其中RD1和RD0表示从寄存器A端选择数据。
操作汇总:
操作内容 | 操作步骤 |
从A端读出寄存器R0的值 | 置RS_BUS# =1,SW_BUS# =1, 置RD1=0,RD0=0 按下QD |
从A端读出寄存器R1的值 | 置RS_BUS# =1,SW_BUS# =1, 置RD1=0,RD0=1 按下QD |
从A端读出寄存器R2的值 | 置RS_BUS# =1,SW_BUS# =1, 置RD1=1,RD0=0 按下QD |
从A端读出寄存器R3的值 | 置RS_BUS# =1,SW_BUS# =1, 置RD1=1,RD0=1 按下QD |
2:读出R0-R3的内容从寄存器B端口输出
各开关所处状态的理由(以将R0的内容从B端经RS0输出为例):
- 由于需要从RS输出数据,因此系统总线中需要将RS_BUS置为有效(即令RS_BUS# =0),其余总线置为无效(即令ALU_BUS# =0,SW_BUS# =1)。
- 因为本实验不需要使用RAM,所以将CEL始终置为无效(即令CEL# =1)。
- 由于需要将R0寄存器的数据输出,因此令RS1=0,RS0=0,其中RS1和RS0表示从寄存器B端选择数据。
操作汇总:
操作内容 | 操作步骤 |
从B端读出寄存器R0的值 | 置RS_BUS# =0,SW_BUS# =1,ALU_BUS=0 置RS1=0,RS0=0 无需按下QD,后者同理 |
从B端读出寄存器R1的值 | 置RS_BUS# =0,SW_BUS# =1,ALU_BUS=0 置RS1=0,RS0=1 |
从B端读出寄存器R2的值 | 置RS_BUS# =0,SW_BUS# =1,ALU_BUS=0 置RS1=1,RS0=0 |
从B端读出寄存器R3的值 | 置RS_BUS# =0,SW_BUS# =1,ALU_BUS=0 置RS1=1,RS0=1 |
(3)从RF中的R0、R1寄存器中读取数据,(R0为B端,R1为A端)并做加法和直通运算
各开关所处状态的理由如(2)中所示。
操作汇总:
操作内容 | 操作步骤 |
从B端读出寄存器R0的值并输向ALU | 置RS_BUS# =0,SW_BUS# =1,ALU_BUS=0 置RS1=0,RS0=0 按下QD |
从A端读出寄存器R1的值并输向ALU | 置RS_BUS# =1,SW_BUS# =1, 置RD1=0,RD0=1 按下QD |
R0值+R1值 | 置RS_BUS# =1,SW_BUS# =1,ALU_BUS=1 置S2=0,S1=1,S0=0(做加法) |
直通R1值 | 置RS_BUS# =1,SW_BUS# =1,ALU_BUS=1 置RD1=0,RD0=1 置S2=0,S1=0,S0=1(做直通) |
直通R0值 | 置RS_BUS# =0,SW_BUS# =1,ALU_BUS=0 置RS1=0,RS0=0 |
ALU中
S2、S1、S0的选择与对应的操作:
七、实验总结
调试中出现的问题:
1:当通过A端输出寄存器值的时候,最开始的S0、S1、S2的连线有错误,没有选择直通的操作序列,导致输出结果与写入数据的结果有差异。
2:当通过ALU计算R0值和R1值的求和结果的时候,S2、S1、S0忘记重新选择求和的操作序列,导致输出结果为直通的结果。
解决方法(针对问题序号):
1:将S2、S1、S0重新设置为0、0、1,然后重新观察输出的结果。
2:将S2、S1、S0重新设置为0、1、0,然后重新观察输出的结果。
实验心得:
- 将R0数据经过A口读出来并通过“数据指示灯”显示,设置控制信号的步骤:
首先置LDDR2=1,M2接GRD接地,RD0=0,RD1=0。之后按QD,R0就被置入到了DR2中。之后置ALU_BUS=1,S2=0,S1=0,S0=1,此时ALU功能为“直通”,ALU将R0的数据输送到DBUS,此时数据指示灯显示R0的数据。 - 将R0数据经过B口读出来并通过“数据指示灯”显示,设置控制信号的步骤:
置RS0=0,RS1=0,RS_BUS#=0,此时R0的通过B口传输至DBUS,此时数据指示灯显示R0的数据。 - 数据总线是CPU与内存或其他器件之间的数据传送的通道,其宽度决定了CPU和外界的数据传送速度。
- RF寄存器为双端口寄存器,在操作不同的存储单元的时候,可以同时进行写入和读取的操作。例如,经ER暂存器向R1写入数据,经RS0寄存器读出R0的数据。由于此时数据总线上只是涉及R0的值,而不涉及R1的值(R1的值通过ER和RF之间的数据线写入),因此数据总线上不存在多值的冲突,可以进行此类操作。
- 在本实验中,系统通过RS1、RS0控制B端的寄存器数值读取,通过RD1、RD0控制A端的寄存器数值读取。
- 在本实验中,寄存器中的数据可以通过A端被读取到DR2寄存器中,但是如果ALU的S2~S0的操作序列未选择为直通操作时,会导致DR2中的数据无法通过ALU直通到DBUS上,从而数据指示灯处显示有误。
八、课后思考题
根据数据通路图,说明ADD R2,R3(R2+R3-> R2)的执行过程(假设取指过程已完成)、数据通路的各部件的作用与操作序列。
执行过程:
- 从寄存器R2中读取数据,存放到ALU的DR2寄存器中。
- 从寄存器R3中读取数据,存放到ALU的DR1寄存器中。
- ALU对DR2和DR1中的数据进行加法运算,计算结果自动存入寄存器DR2中。
- 从寄存器DR2中读取数据,直通到DBUS中,并将数据存入暂存器ER中。
数据通路的各部件作用:
- DR2:存放R2的数据。
- DR1:存放R3的数据。
- ALU:对DR2和DR3中的数据做加法运算。
- RF:提供R2和R3的初始数据,把R2作为最终寄存器存放求和结果。
- ER:暂存DR2的数据,便于存放到R2中。
操作序列:
操作内容 | 操作步骤 |
从B端读出寄存器R3的值并输向ALU的寄存器DR1 | 置RS_BUS# =0,SW_BUS# =1,ALU_BUS=0 置RS1=1,RS0=1 按下QD |
从A端读出寄存器R2的值并输向ALU的寄存器DR2 | 置RS_BUS# =1,SW_BUS# =1, 置RD1=1,RD0=0 按下QD |
R0值+R1值,ALU自动存入寄存器DR2 | 置RS_BUS# =1,SW_BUS# =1,ALU_BUS=1 置S2=0,S1=1,S0=0(做加法) |
直通DR2的数据,存入暂存器ER中 | 置RS_BUS# =1,SW_BUS# =1, 置S2=0,S1=0,S0=1(做直通) 置LDER=1 按下QD |
将暂存器ER的值存入RF中的寄存器R2中 | 置RS_BUS#=1,SW_BUS# =1,ALU_BUS=0 置LDER=1 置WRD=1,WR1=1,WR0=0 按下QD |