硬连线控制器设计.docx
《硬连线控制器设计.docx》由会员分享,可在线阅读,更多相关《硬连线控制器设计.docx(22页珍藏版)》请在冰豆网上搜索。
![硬连线控制器设计.docx](https://file1.bdocx.com/fileroot1/2023-2/2/67e3e9ae-90bb-4233-8234-df5507cfb250/67e3e9ae-90bb-4233-8234-df5507cfb2501.gif)
硬连线控制器设计
模型机硬连线控制器设计
一、实验目的
(1)融会贯通计算机组成原理与体系结构课程各章教学内容,通过知识的综合运用,加深对CPU个模块工作原理及相互联系的认识;
(2)掌握硬连线控制器的设计方法;
(3)培养科学研究能力,取得设计和调试的实践经验。
二、实验设备
(1)TEC-8实验系统1台
(2)Pentium3以上的PC1台
(3)双踪示波器1台
(4)直流万用表1块
(5)逻辑测试笔(在TEC-8实验台上)1支
三、设计与调试任务
(1)设计一个硬连线控制器,和TEC-8模型计算机的数据通路结合在一起,构成一个完整的CPU,对该CPU要求:
●能顾完成控制台操作,包括启动程序运行、读存储器、写存储器、读寄存器、写寄存器。
●能够执行表3.1中的指令,完成规定的指令功能。
表3.1中,XX代表任意值,Rs代表源寄存器号,Rs代表目的寄存器号。
在条件转移指令中,@代表当前PC的值,offset是一个四位的有符号数,第三位是符号位,0代表正数,1代表负数。
注意:
@不是当前指令的PC值,而是当前指令的PC值加1。
表3.1新设计CPU的指令系统
名称
助记符
功能
指令格式
IR7IR6IR5IR4
IR3IR2
IR1IR0
加法
ADDRd,Rs
Rd←Rd+Rs
0001
Rd
Rs
减法
SUBRd,Rs
Rd←Rd-Rs
0010
Rd
Rs
逻辑与
ANDRd,Rs
Rd←RdandRs
0011
Rd
Rs
加1
INCRd
Rd←Rd+1
0100
Rd
XX
取数
LDRd,[Rs]
Rd←[Rs]
0101
Rd
Rs
存数
STRs,[Rd]
Rs→[Rd]
0110
Rd
Rs
C条件转移
JCoffset
若C=1,则PC←@+offset
0111
offset
Z条件转移
JZoffset
若Z=1,则PC←@+offset
1000
offset
无条件转移
JMPRd
PC←Rd
1001
Rd
XX
输出
OUTRs
DBUS←Rs
1010
XX
Rs
停机
STP
暂停运行
1110
XX
XX
●在Quartus||下对硬连线控制器进行编程的编译。
●将编译后的硬连线控制器下载到TEC-8实验台的可编程器件EPM7128S中去,使得EPM7128S成为一个硬连线控制器。
●根据指令系统,编写检测硬连线控制器正确性的测试程序,并用测试程序对硬连线控制器在单微指令方式下进行调试,直到成功。
(2)在调试成功的基础上,整理出设计文件。
1.硬连线控制器逻辑模块图;
2.硬连线控制器指令周期流程图;
3.硬连线控制器的硬件描述语言源程序;
4.测试程序;
5.设计说明书;
6.调试总结。
四、硬连线控制器逻辑模块图
本实验要求设计硬连线控制器,而仍然利用实验台的数据通路和其他模块。
因此我们只需对硬连线控制器部分进行编程就行了。
TEC-8模型计算机电路框图如下图1。
图1TEC-8模型计算机电路框图
从电路框图中可知,硬连线控制器与微程序控制器不同,其产生的控制信号除了受译码器输出信号SWC~SWA、IR7~IR4,节拍电位信号T1~T3,状态条件信号Z、C,以及CLR#的控制外,还受时序发生器产生的节拍脉冲信号W3~W1的控制。
硬连线控制器的逻辑模块图为:
图2硬连线控制器的逻辑模块图
五、硬连线控制器指令周期流程图
与微程序控制器不同,硬连线控制器以节拍电位W3~W1为时间单位。
其指令周期流程图为:
图3硬连线控制器参考流程图
一个执行框代表一个节拍电位时间,TEC-8实验系统中采用了可变节拍数来执行一条机器指令。
从上图中可知,大部分指令只需要两个节拍电位W1和W2,少数指令还需要W3。
因此当需要W3时在W2时产生一个信号LONG。
时序信号发生器收到信号LONG后产生W3。
有的操作如写寄存器需要四个节拍电位,将该操作化成两条机器指令的节拍,通过信号ST0联系在一起。
还可以只产生W1,通过SHORT信号实现。
根据硬连线流程图还可以得到组合逻辑译码表,如下表2:
表2组合逻辑译码表
IR
ADD
SUB
AND
INC
LD
ST
JMP
OUT
STP
JC
JZ
LIR
W1
W1
W1
W1
W1
W1
W1
W1
W1
W1
W1
M
W2
W2
W2/W3
W2
W2
S3
W2
W2
W2
W2/W3
W2
W2
S2
W2
W2
W2
S1
W2
W2
W2/W3
W2
W2
S0
W2
W2
W2
W2
CIN
W2
LDC
W2
W2
W2
LDZ
W2
W2
W2
W2
DRW
W2
W2
W2
W2
W3
ABUS
W2
W2
W2
W2
W2
W2/W3
W2
W2
LAR
W2
W2
PCADD
C,W2
Z,W2
LPC
MBUS
W3
MEMW
W3
LONG
W2
W2
STOP
W2
PCINC
W1
W1
W1
W1
W1
W1
W1
W1
W1
W1
W1
根据译码表,对以后的编程和错误查找有很大的帮助。
六、程序编写过程
利用Verilog语言,在Modelsim环境下进行编程和仿真。
刚开始做实验时心里是茫然的,不知道从哪里开始,无从下手,不知道采用什么方法,加上对Verilog语言的掌握还不够熟练,因此第一次实验课几乎没有什么进展。
后来通过王教员和唐教员的耐心讲解和指导,明白了可以用两种不同的实现方法进行编程,但因为个人觉得利用状态机的方法进行编程理解起来思路较为简单,而且逻辑较为清楚,于是决定利用状态机的方法进行编程。
本程序是在唐教员的程序基础上进行修改的(唐教员的还没有完成),但在编程过程中还是遇到了很多的问题,比如时序问题等。
在同学和教员的帮助下,完成了一部分工作,但程序依然存在着一些问题,结果实验还是没有完全做完。
把整个控制器分为四个状态:
state0表示初始状态,对所有的信号进行初始化,表示clear以后的状态,只有STOP有效;state1表示W1有效时的状态,具体又可以按照SWC~SWA的不同进行不同的赋值与操作;state2表示W2有效时的状态,再根据SW的不同进行赋值;state3表示W3有效时的状态。
正常情况下一个状态完成以后进入下一状态,但有很多情况下是不行的,比如写存储器、读存储器、写寄存器等操作。
于是需要根据对ST0信号、SHORT信号、LONG信号等进行判别来进行不同状态之间的转化。
具体为:
从state0开始,若sw符合要求(<5),进入state1,否则回到state0;
state1:
若执行程序且ST0=0或读存储器或写存储器,则下一状态仍为state1,否则下一状态为state2;
state2:
若为执行指令的LD或ST,则下一状态为state3,若为写寄存器操作且ST0=0或执行指令但不为LD或ST,则下一状态为W1,若都不符合,下一状态为初始状态state0;
state3:
直接回到state1;
源程序压缩包:
CPU为源程序,其余程序为测试程序,程序名字表示所测试的指令或工作台模式。
七、Modelsim仿真过程
程序编译成功后,开始编写仿真程序,进行仿真。
因为对仿真程序的掌握不是很完善,刚开始我们组就出了很多问题,不是时序的问题就是赋值的问题。
感谢同学和教员的耐心指导和帮助。
因为篇幅问题,在此仅贴出操作台操作和部分有代表性的指令的仿真过程,(ADD,AND,LD,JC,JMP,STP)其余仿真代码在程序包里,因为并没有烧到芯片里,也没有真正的实现,所以实际源程序可能还存在着一些问题。
(一)操作台模式仿真过程
1.写存储器过程仿真(SW为001)
写存储器只需要W1,仿真图如图4所示:
图4写存储器过程仿真图
2.读存储器过程仿真(SW为010)
读存储器的过程在时序上与写存储器类似,都只需W1。
仿真图如图5所示:
图5读存储器过程仿真图
3.读寄存器过程仿真(SW为011)
读寄存器过程需要W1和W2。
图6读寄存器过程仿真图
4.写寄存器过程仿真(SW为100)
写寄存器过程各需要两个W1,W2。
并用ST0作为时序判定条件
图7写寄存器过程仿真图
(二)指令执行过程仿真
1.ADD指令执行过程仿真(SW为000,IR7~4为0001)
SUB与ADD类似。
图8ADD指令执行仿真图
2.AND指令仿真过程(SW为000,IR7~4为0011)
INC与AND类似。
图9AND指令执行仿真图
3.LD指令仿真过程(SW为000,IR7~4为0101)
ST与LD类似。
图10LD指令执行仿真图
4.JC指令仿真过程(SW为000,IR7~4为1000,此时C=1)
JZ与JC类似。
图11JC指令执行仿真图
5.JMP指令仿真过程(SW为000,IR7~4为1001)
图12JMP指令执行仿真图
6.STP指令仿真过程(SW为000,IR7~4为1110)
图13STP指令执行仿真图
八、测试程序
测试程序是在源程序编写完成并仿真成功并烧到芯片里以后用于在模型计算机上完整的测试源程序的。
测试程序的编写过程中,我们组尽可能的利用上所有的指令,使得每条指令都能测试一遍,以便更好的测试性能和正确性,但因为并没有烧到芯片里,所以测试程序并没有起到作用。
地址
指令
十六进制机器代码
二进制机器代码
00H
LD
53H
01010011
01H
INC
4CH
01001100
02H
SUB
21H
00100001
03H
JZ0CH
8CH
10001100
04H
ST
68H
01101000
05H
LD
53H
01010011
06H
INC
4CH
01001100
07H
ADD
11H
00010001
08H
JC0CH
7CH
01111100
09H
JMP
9CH
10011100
0AH
INC
48H
01001000
0BH
STP
0E0H
11100000
0CH
08H
08H
00001000
0DH
15H
15H
00010101
0EH
FFH
0FFH
11111111
0FH
01H
01H
00000001
10H
AND
31H
00110001
11H
OUT
0A2H
10100010
12H
STP
0E0H
11100000
九、设计说明书
1.源程序的设计
利用状态机的思想,把整个控制器分为四个状态:
state0、state1、state2、state3。
不同state表示的状态为:
state0表示初始状态,对所有的信号进行初始化,表示clear以后的状态,只有STOP有效;state1表示W1有效时的状态,具体又可以按照SWC~SWA的不同进行不同模式下的赋值与操作;state2表示W2有效时的状态,再根据SW的不同进行赋值;state3表示W3有效时的状态,主要是指执行指令LD和ST时才有可能会进入的状态(其他情况下不需要W3)。
定义两个变量,state和next_state。
state表示当前状态,next_state表示下一状态。
state完成本状态内的所有操作以后进入next_state,正常情况下next_state就是state加1,但有很多情况下是不行的,比如写存储器、读存储器、写寄存器等操作不能直接的加一。
于是需要根据对ST0信号、SHORT信号、LONG信号等进行判别来确定下一状态。
具体为:
从state0开始,判断SW,若SW符合要求(值<5),进入state1(next_state=state1),否则回到state0(next_state=state0);
state1:
判断SW、ST0,若执行程序(SW=000)且ST0=0或读存储器(SW=010)或写存储器(SW=001),则next_state=state1,否则next_state=state2;
state2:
判断SW、IR、ST0,若为执行指令(SW=000)的LD(IR7~4=0101)或ST(IR7~4=0110),则next_state=state3,若为写寄存器操作(SW=100)且ST0=0或执行指令但不为LD或ST,则next_state=W1,若都不符合,next_state=state0;
state3:
next_state=state1;
因此,参考流程图可知,对于不同的操作模式和指令的状态转换为:
写存储器:
state0——state1——state1
读存储器:
state0——state1——state1
读寄存器:
state0——state1——state2
写寄存器:
state0——state1——state2——state1——state2
指令:
LD/ST:
state0——state1——state1——state2——state3
其他:
state0——state1——state1——state2
2.测试程序的设计
源程序完成以后,要进行仿真,因此需要设计测试程序。
设计测试程序是为了给出各输入信号的值,并产生与工作台模式或指令要求相符的机器周期(如执行LD指令时,依据指令产生的机器周期为W1,W1,W2,W3,W1),观察仿真波形是否会产生有效的输出信号。
因此,在设计测试程序时,重点和难点便是产生符合源程序执行情况的机器周期。
因为测试的目的主要是看源程序在正确的机器周期下,对于不同的模式和指令是否会产生正确的信号,因此可以把每个工作台模式和各个指令都写一个仿真程序进行单独仿真。
十、实验总结
表面上看,本次实验仅仅是要我们设计一个CPU的硬连线控制器部分,而实际上却需要我们综合运用以往所学的很多关于计算机组成结构方面的知识。
这次的实验让我真正明白了什么叫大实验,相比前几次的实验。
因为实验的前期准备不充分,使得进展较为缓慢,不知道从何下手,浪费了很多时间。
通过教员的讲解和指导,并经过组内的讨论决定运用状态机的方法进行编程。
因为对Verilog语言的掌握还不够熟练,所以编程过程中也出现了很多或大或小的问题,比如说赋值的时候是用=还是<=(=和<=表达的意义是不同的,只有在assign语句中用=,而在其他的赋值语句中一般用<=),状态之间的转化条件的确定,判断转移条件时是用信号判断(LONG、SHORT等)还是利用操作模式和IR值判断(我们后来利用SW、IR和ST0判断)等等。
遇到问题,积极的向同学和教员请教,在大家的帮助下,我们也确实解决了很多问题。
很感谢教员和其他同学的帮助和耐心讲解,帮助我们找到了一些程序上的错误,让我们少走了一些弯路。
但在编写仿真程序时,又遇到了很多障碍,很多概念有点搞不清,比如说刚开始对于知道了T3和W1~3的关系,却不明白怎么实现QD和T3,W1~3之间的协同配合,多亏了教员的仿真程序,看了很多遍以后才慢慢理解了如何实现它。
总的来说,没有在规定的实验课程安排里完成本次实验,还是觉得很遗憾,也有一点失落感。
因为没有烧到芯片里,程序中存在的一些问题也没法找出来,可能依然存在着很多的漏洞和不足。
通过这次实验也让我对CPU各模块的工作原理和相互联系有了更加清晰的认识,收获良多。
十一、心得体会
这次实验让我收获了很多,让我真正的明白了理解和掌握是不一样的!
以前总觉得自己对于CPU的原理已经理解了,但本次实验不仅仅需要我们动脑,更重要的是要求我们动手。
由画出控制器流程图到Verilog语言的源代码的实现,再到编写仿真程序进行仿真,其间过程会出现很多的问题,需要很大的耐心和细心,当中不仅要对TEC-8实验台的操作相当熟悉,而且要对机器周期与时序的关系以及控制器各模块的理解很透彻才行。
而自己显然还需要很大的提高。
从这次实验中我也发现了自己身上的很多不足,如基础知识的掌握还不够全面,分析问题往往不够透彻,做一件事情时自己的思路往往会受到各种因素的打扰,不够清晰。
我也会在以后的学习生活中努力加以改正。
通过本次实验我也明白了坚持和合作的重要性。
科学需要一种探究精神,而在这个过程中会遇到很多的问题与障碍,会做很多无头绪或者繁琐的工作,比如这次的面对源程序的编译产生的各种错误,面对仿真波形得不到想要的结果,这个时候就需要我们坚持下去,耐下心去一点点分析,请教。
只要踏实的静下心去,肯付出努力,问题终会解决。
合作是必须的,团结就是力量,很多的事情和工作一个人是完不成的,团队之间的互相配合和相互帮助会使得很多麻烦的事情简单很多,遇到问题时通过和同学或教员进行交流,也都得到了较好的解决。
计算机组成原理的实验终于全部做完了,整体来讲效果还是很好的,对于自己的帮助也还是很大的,通过这几次实验,我也更加明白了计算机的运行原理和基本构造,锻炼了自己的动手实践能力,收获很多!