一、实验目的、实验设备名称(或实验环境)

1.基本要求

了解计算机的硬件组织体系与结构,熟悉计算机各大功能部件的功能特性、时间特性,数据通路等知识。

掌握微程序设计型计算机CPU的基本结构和工作原理,建立计算机整机概念。

熟练掌握计算机核心部件控制器的工作原理及设计方法,培养工程设计能力。

2.实验任务与目标

在掌握部件单元电路实验的基础上,进一步将单元电路组成系统,构造一台基本模型计算机。

定义多条(5-8条)机器指令,并编写相应的微程序,上机调试,掌握计算机整机概念。掌握微程序的设计方法,学会编写二进制微指令代码表。

通过熟悉较完整的计算机的设计,全面了解并掌握微程序控制方式计算机的设计方法。

3.实验目的

深入理解基本模型计算机的功能、组成知识;

深入学习计算机各类典型指令的执行流程;

学习微程序控制器的设计过程和相关技术,掌握LPM_ROM的配置方法。

4.实验平台

QuartusⅡ9.0开发集成环境与FPGA硬件平台

5.设计流程

设计输入–原理图或VHDL等输入;

功能仿–前仿真,不考虑延时和硬件,验证设计输入在逻辑上是否正确;

布局布线–布局是将已分割的逻辑小块放到器件内部逻辑资源的具体位置,使易于连线,且连线最少;布线是利用器件的布线资源完成各功能块之间和反馈信号之间的连接;

时序仿真–后仿真,验证功能和时序是否正确,并且考虑延时;

程序配置–把适配后生成的下载或配置文件,通过编程电缆向FPGA实验箱进行下载,以便进行硬件调试和验证。

二、实验原理

1.总体介绍

在部件实验过程中,各部件单元的控制信号是人为模拟产生的,而本实验将能在微过程控制下自动产生各部件单元控制信号,实现特定的功能。实验中,计算机数据通路的控制将由微过程控制器来完成,CPU从内存中取出一条机器指令到指令执行结束的一个指令周期,全部由微指令组成的序列来完成,即一条机器指令对应一个微程序。

2.指令格式

指令格式采用寄存器直接寻址方式

image-20221222105736988

其中,OP-CODE为操作码,rs为源寄存器,rd为目的寄存器。00表示R0寄存器,01表示 R1寄存器,10表示R2寄存器。

image-20221222105742852

其中IN为单字长(8位二进制),其余为双字长指令,XX H 为addr对应的十六进制地址码。为了向RAM中装入程序和数据,检查写入是否正确,并能启动程序执行,还必须设计三个控制台操作微程序。

存储器读操作(KRD):下载实验程序后按总清除按键(CLR)后,控制台SWA、SWB为“0 0”时,可对RAM连续手动读出操作。

存储器写操作(KWE):下载实验程序后按总清除按键(CLR)后,控制台SWA、SWB为“0 1”时,可对RAM连续手动写操作。

启动程序(RP):下载实验程序后按总清除按键(CLR)后,控制台SWA、SWB为“1 1”时,即可转入到微地址“01”号“取指令”微指令,启动程序运行。

24位微代码中各信号的功能

(1) uA5—uA0:微程序控制器的微地址输出信号,是下一条要执行的微指令的微地址。

(2) S3、S2、Sl、S0:由微程序控制器输出的ALU操作选择信号,以控制执行16种算术操作或16种逻辑操作中的某一种操作。

(3) M:微程序控制输出的ALU操作方式选择信号端。M=0执行算术操作;M=l执行逻辑操作。

(4) /Cn:微程序控制器输出的进位信号,/Cn=0表示ALU运算时最低位有进位,/Cn=1则表示无进位。

(5) WE:微程序控制器输出的RAM控制信号。当/CE=0时,如WE=0为存储器读;如WE=1为存储器写。

(6) A9、A8——译码后产生CS0、CS1、CS2信号,分别作为SW_B、RAM、LED的选通控制信号。

(7) A字段(15、14、13)——译码后产生与总线相连接的各单元的输入选通信号(见表6-1)。

(8) B字段(12、11、10)——译码后产生与总线相连接的各单元的输出选通信号。

(9) C字段(9、8、7) ——译码后产生分支判断测试信号P(1)~P(4)和LDPC信号

三、实验步骤

1.微程序的输入

根据表1-3所对应的二进制微代码,编辑LPM_ROM配置文件ROM_11.mif(参考demoD_cpu5文件夹中的同名文件),并将其保存在与实验电路b100_c.bdf工程所在的文件夹中,与实验电路b100_c.bdf一同编译后,得到下载文件b100_c.sof。下载配置文件bus_c.sof下载到实验系统。实验板上的时钟clock0选择输入频率为1.5MHz。图1-3是示例原理图,详见b100_c.bdf。

2.输入模型机的程序(示例工程文件是b100_c.bdf )

(一)手动输入程序

(1)使用控制台KWE和KRD微程序将机器指令程序(“实验程序1”:按地址输入指令代码,如地址00、01、02、03、04…分别对应指令码00、10、0A、20、0B…)装入模型机CPU的程序RAM(LPM_RAM_DQ)中,并进行检查。根据图1-4控制台微程序流程图,在微指令的控制下,依次输入机器指令代码:

  1. 以下将数据35、C4依次装入00、01地址为例:选择实验模式NO.0,输入数据显示于数码2、1上;
  2. 将控制开关SWB、SWA(键4、键3)设置为:0、1;模型机的复位控制信号RST(键8)=1;
  3. 机器指令代码的数据输入由键2、键1输入,先键入35,再按两次键7,即0->1->0,产生一个写入正脉冲,这时观察右上液晶屏上的输入端口IN=35;PC=00(当前将要输入的地址);MC=018110微指令。再按两次键7(地址寄存器加1),根据图1-4控制台微程序流程图,进入到KWE(01)分支,进入并执行了微地址“21”中的操作,这时控制此操作的微指令码 MC=01ED94,PC自动加1,PC=1。
  4. 按键7,再产生一个脉冲,进入并执行了微地址“24”中的操作;观察液晶,数据35进入总线BUS=35,35进入RAM=35,此时微指令码MC=062011,此时将机器指令代码数据写入了LPM_RAM中;
  5. 此后每当出现MC=062011时,即可利用键2,键1输入待写入RAM的数据,此时如C4,连续按键7,再产生2个脉冲,即将C4写入RAM,PC加1,微指令码变成MC=062011;
  6. 重复③—⑤的步骤,将“实验程序1”的全部机器指令代码输入RAM。
(二)自动配置LPM_RAM

如果程序量大,手动输入效率太低,可以在计算机上编译好代码文件,并随同模型CPU设计文件一同编译进SOF下载文件中,直接下载进入FPGA。

(1)在QuartusII环境下,打开工程文件b100_c.bdf,修改b100_C.bdf中LPM_RAM_DQ的参数,将初始化文件LPM_FILE设置为:“./5_ram.mif”;打开“5_ram.mif”(在示例中已有此文件),根据“实验程序1”,在5_ram.mif中输入全部机器指令代码(示例中已经输入)。

(2)将工程文件重新编译后,下载到实验台中,即完成LPM_RAM的配置。

(3)根据以上的方法,复位信号RST(键8)=1;将控制开关SWB、SWA(键4、键3)设置为:0、0,按键7,每两个2次单步运行(产生2个正脉冲),检验配置进入FPGA中的程序代码。

(三)执行程序

(1)按1次系统复位键8,并置键8为高电平,使CPU允许正常工作;

(2)控制开关(键4、键3)设置为SWB、SWA=1,1,处于程序执行方式,观察图1-4控制台:RP(11)

(3)通过键2、键1输入运算数据,如56H,按4次单步键7,产生2个脉冲,执行2条微指令,进入到图1-4控制台的RP(11),此时的微指令地址是“23”,微指令码MC=008001;IN=56H

(4)再用键7产生1个脉冲,执行1条微指令,微程序流程进入图1-4左的“运行微程序”的最上块:此时PC=00送地址寄存器AR=00,PC自动加1,PC=01,MC=00ED82,IN=56;

注意。

1、实验箱上数码管7、6显示的是下一节拍将要执行的微指令的微地址码;

2、数码管3显示的是进位情况,有进位,LED3显示1,无进位LED3显示0。

(5)键7产生1个脉冲,执行微指令MC=00C048(图1-4),RAM中的第一条指令码00进入BUS,再由BUS进入指令寄存器IR=00。键7再进1个脉冲,进入MC=001001,执行指令IN,送数INR0=56;

(6)键7产生1个脉冲,执行完IN指令后,返回到初始端,执行微指令MC=00ED82;

(7)键7产生2个脉冲后,执行微指令MC=00ED83,即执行ADD指令的第1步:PC送AR=02,PC+1=03,这时RAM中在02地址的0AH进入BUS=0A;

(8)键7产生1个脉冲,执行微指令MC=00E004,即执行ADD指令的第2步:BUS数据送AR=0A,由实验程序1可知,0A是ADD指令的加数的间接地址,而在地址0A中放有34H, 最后完成的加法是34+56;

(9)键7产生1个脉冲, MC=00B005,执行ADD的第3步:将RAM中0A地址的数据34送BUS,再送DR1=34H。注意,此时指令寄存器IR中仍放有ADD的操作码10H,PC=03指向下一条指令STA;

(10)键7产生1个脉冲,MC=01A206,执行ADD的第4步(微地址是05),R0送DR0=56;

(11)键7产生1个脉冲,MC=919A01,执行ADD的最后一步,DR0+DR1=8AH,通过总线BUS(=8A),送R0=8AH。键7再产生1个脉冲,返回到初始端,执行微指令MC=00ED82;

(12)键7产生2个脉冲,MC=00ED87,执行STA指令;键7再两2个脉冲后,和8A被写入RAM,地址单元是0B。键7一个脉冲后,返回到初始端,执行微指令MC=00ED82;

(13)键7产生2个脉冲,MC=00ED8E,执行OUT指令;此时OUT的功能是将RAM中指定地址的数据送到输出口“OUT”处(见图1-2液晶屏)。此时PC=7,AR=6;

(14)键7产生1个脉冲,MC=00E00F,首先BUS中地址0BH被锁进AR,于是RAM中对应地址0BH的数据8AH被送入BUS。键7再产生1个脉冲,MC=00A015,BUS中的数据8AH被锁进DR0;

(15)键7产生1个脉冲,MC=070A01,进入OUT指令的最后一步;8AH从DR0送入OUT口;

(16)键7产生1个脉冲,返回到初始端,执行微指令MC=00ED82;

(17)键7产生2个脉冲,MC=00ED96,指令寄存器IR=40操作码,开始执行JMP指令,此时PC=9,AR=8,故RAM中此地址的12H进入BUS=12H。注意PC!BUS的数据12H将进入PC成为下一条指令的执行地址;

(18)键7产生1个脉冲,MC=00D181,RAM=12,BUS=12,AR=08H,PC=12,IR=40开始执行JMP指令。

(19)键7产生1个脉冲,返回到初始端,执行微指令MC=00ED82;RAM=00(下一条指令码)。结束!

四、实验数据记录

本次设计的基本模型机包含七条机器指令:IN(输入)、XOR(二进制异或)、AND(二进制与运算)、OR(二进制或运算)、SUN(二进制减法)、ADD(二进制加法)、OUT(输出),其指令格式如下表所示。

助记符 机器指令码 Addr地址码 功能说明
IN 00H “INPUT”中的数据→R0
XOR Addr 10H XXH R0 ^ [Addr] → R0
AND Addr 20H XXH R0 & [Addr] → R0
OR Addr 30H XXH R0 | | [Addr] → R0
SUB Addr 40H XXH R0 + [Addr] → R0
ADD Addr 50H XXH R0 - [Addr] → R0
OUT Addr 60H XXH [Addr] → BUS

表1——指令表

本次设计任务:首先输入数X,将该数与RAM中Addr地址下的内容Y分别进行异或、与、或、相加、相减运算,最后将内存里Y地址下的数输出。

根据设计的机器指令与设计任务综合考虑,绘制流程图。image-20221222105806449

图1——操作台微程序图

由上图可知,首先要实现的是操作台微程序,目的是为了向RAM中装入程序和数据,检查写入是否正确,并能启动程序执行。无论手动还是自动配置RAM,都需要在微指令的控制下,依次检查LPM_RAM中已输入的机器指令代码。检查无误后才能运行程序,并将地址指向微程序的开始位置。

image-20221222105814910

图二——运行微程序图

上图为运行微程序的流程图,每条微指令运行结束后,会得到微程序控制器的微地址输出信号,根据所得到的微地址,在ROM中找到下一条要执行的微指令。当每一条机器指令结束时,根据地址,会重新回到微程序的起始位置运行。各条机器指令依次执行,直到微程序结束。

根据绘制的流程图,将每条微指令代码化。为了能够更加清晰体现微程序内部微指令之间地联系,个人按照相似的微指令并列排放的原则,对二进制微代码表进行了重写。下表为微程序流程图按照微指令格式逻辑转化而成的“二进制微代码表”。

微地址 微指令 S3 S2 S1 S0 M CN WE A9 A8 A B C UA5——UA0
0 0 018101 0 0 0 0 0 0 0 1 1 000 000 100 000001
0 1 01ED85 0 0 0 0 0 0 0 1 1 110 110 110 000101
0 2 01ED84 0 0 0 0 0 0 0 1 1 110 110 110 000100
0 3 008007 0 0 0 0 0 0 0 0 1 000 000 000 000111
0 4 062002 0 0 0 0 0 1 1 0 0 010 000 000 000010
0 5 00A001 0 0 0 0 0 0 0 1 1 010 000 000 000001
0 7 01ED88 0 0 0 0 0 0 0 1 1 110 110 110 001000
1 0 00C049 0 0 0 0 0 0 0 0 1 100 000 001 001001
1 1 001007 0 0 0 0 0 0 0 0 0 001 000 000 000111
1 2 01ED10 0 0 0 0 0 0 0 1 1 110 110 110 010000
1 3 01ED11 0 0 0 0 0 0 0 1 1 110 110 110 010001
1 4 01ED12 0 0 0 0 0 0 0 1 1 110 110 110 010010
1 5 01ED13 0 0 0 0 0 0 0 1 1 110 110 110 010011
1 6 01ED14 0 0 0 0 0 0 0 1 1 110 110 110 010100
1 7 01ED15 0 0 0 0 0 0 0 1 1 110 110 110 010101
2 0 00E016 0 0 0 0 0 0 0 0 1 110 000 000 010110
2 1 00E017 0 0 0 0 0 0 0 0 1 110 000 000 010111
2 2 00E018 0 0 0 0 0 0 0 0 1 110 000 000 011000
2 3 00E019 0 0 0 0 0 0 0 0 1 110 000 000 011001
2 4 00E01A 0 0 0 0 0 0 0 0 1 110 000 000 011010
2 5 00E01B 0 0 0 0 0 0 0 0 1 110 000 000 011011
2 6 00B01C 0 0 0 0 0 0 0 0 1 011 000 000 011100
2 7 00B01D 0 0 0 0 0 0 0 0 1 011 000 000 011101
3 0 00B01E 0 0 0 0 0 0 0 0 1 011 000 000 011110
3 1 00B01F 0 0 0 0 0 0 0 0 1 011 000 000 011111
3 2 00B020 0 0 0 0 0 0 0 0 1 011 000 000 100000
3 3 00A021 0 0 0 0 0 0 0 0 1 010 000 000 100001
3 4 01A222 0 0 0 0 0 0 0 1 1 010 001 000 100010
3 5 01A223 0 0 0 0 0 0 0 1 1 010 001 000 100011
3 6 01A224 0 0 0 0 0 0 0 1 1 010 001 000 100100
3 7 01A225 0 0 0 0 0 0 0 1 1 010 001 000 100101
4 0 01A226 0 0 0 0 0 0 0 1 1 010 001 000 100110
4 1 01A007 0 0 0 0 0 0 0 1 1 010 000 000 000111
4 2 A99A07 1 0 1 0 1 0 0 1 1 001 101 000 000111
4 3 B99A07 1 0 1 1 1 0 0 1 1 001 101 000 000111
4 4 E99A07 1 1 1 0 1 0 0 1 1 001 101 000 000111
4 5 619A07 0 1 1 0 0 0 0 1 1 001 101 000 000111
4 6 919A07 1 0 0 1 0 0 0 1 1 001 101 000 000111

表2——二进制微代码表

我们将得到的二进制微代码表写入仿真软件的MIF文件中作为基本模型机的ROM。调整视图为8位便于与二进制微代码表对应。

image-20221222105833757

图三——ROM数据图

由于执行微指令的过程中,不仅需要有ROM中的机器微代码,还需要读取RAM中的数据。所以我们需要对RAM进行初始化,使得程序能够正常运行。

地址(二进制) 内容(二进制) 助记符 说明
0000 0000 0000 0000 IN INPUT DEVICE → R0
0000 0001 0001 0000 XOR[0DH] R0 ^ [0DH] → R0
0000 0010 0000 1101
0000 0011 0010 0000 AND[0DH] R0 & [0DH] → R0
0000 0100 0000 1101
0000 0101 0011 0000 OR[0DH] R0 || [0DH] → R0
0000 0110 0000 1101
0000 0111 0100 0000 SUB[0DH] R0 - [0DH] → R0
0000 1000 0000 1101
0000 1001 0101 0000 ADD[0DH] R0 + [0DH] → R0
0000 1010 0000 1101
0000 1011 0110 0000 OUT[0DH] [0DH] → LED
0000 1100 0000 1101
0000 1101 0000 0011 为自定数据

表3——RAM表

该RAM由两部分组成,分别为机器指令码与保存的数据,0000 0000——0000 1100为机器指令,0000 1101为存储的数据,通过运行机器指令不断调用数据,从而实现了基本模型机的功能。

image-20221222105849983

图四——RAM数据图

六、实验心得体会

通过本次实验,我掌握了基本模型机的设计与实现,理解了基本模型机的内部结构以及工作流程状态,了解了RAM与ROM在程序运行时所发挥的作用。在线上实现的过程中,我不断加深对于基本模型机的理解。更希望可以通过线下FPGA平台进行实践,巩固已学的知识。