搜索
您的当前位置:首页北邮计算机组成原理课程设计 代码与实验报告

北邮计算机组成原理课程设计 代码与实验报告

来源:乌哈旅游
北京邮电大学课程设计报告

课程设计 名称 班 级 采用硬布线控制器的顺序模型处理器设计与调试 学 院 计算机学院 指导教师 学生姓名 颜力琦 戴志涛 成绩 班内序号 学 号 教学目的:融会贯通计算机组成原理各章节内容,加深对CPU各模块工作原理及相互联系的认识,掌握硬布线控制器的设计方法,学习运用可编程逻辑技术进行逻辑设计和调试的基本步骤和方法 课 程 设 计 内 容 基本内容:设计一个硬布线控制器,和TEC-8模型的数据通路结合在一起,构成一个完整的CPU 实验方法:使用VHDL语言编写程序,使用TEC-8实验台调试程序 团队分工: 颜力琦:组长,负责程序流程图、算法设计、控制台部分代码的编写、拓展指令编写程序调试、实验报告编写 潘自成:负责微程序部分代码的编写、程序调试、资料收集 周卓彬:负责控制台部分代码的编写、时序信号的控制代码编写、PC指针代码编写、程序调试,实验报告编写 学生 课程设计 报告 (附页) 遵照实践教学大纲并根据以下四方面综合评定成绩: 1、课程设计目的任务明确,选题符合教学要求,份量及难易程度 2、团队分工是否恰当与合理 3、综合运用所学知识,提高分析问题、解决问题及实践动手能力的效果 4、是否认真、独立完成属于自己的课程设计内容,课程设计报告是否思路清晰、文字通顺、书写规范 课 程 设 计 成 绩 评 定 评语: 成绩: 指导教师签名: 年 月 日 注:评语要体现每个学生的工作情况,可以加页。

计算机组成原理课程设计实验报告

采用硬布线控制器的顺序模型处理器设计与调试

一、实验目的

(1)融会贯通计算机组成原理各章节教学内容,通过知识的综合应用,加深对CPU各模块工作原理(2)掌握硬布线控制器的设计方法。

(3)学习运用可编程逻辑技术进行逻辑设计和调试的基本步骤和方法 (4)学习运用VHDL语言,用编写编译下载程序到altera芯片运行。 (5)培养科学研究的独立工作能力,获得工程设计与组装调试的实践经验 及相互联系的认识,建立清晰的整机概念。

二、实验设备

TEC-8实验系统 一台 PC计算机 一台 逻辑笔 一只 USB下载器 一根

三、设计与调试任务

(1)设计一个硬连线控制器,和TEC-8模型计算机的数据通路结合在一起,构成一个完整的CPU,该CPU要求:能够完成控制台操作:启动程序运行、读存储器、写存储器、读寄存器、写寄存器;能够执行表中的指令,完成规定的操作。

(2)在Quarts下对硬布线控制器设计方案进行编辑和编译。

(3)将编译后的硬布线控制器下载到TEC-8实验台上的EPM7128中,使其成为一个硬布线控制器。 (4)根据指令系统,编写检测硬布线控制器正确性的测试程序,并用测试程序对硬布线控制器在单

拍方式下进行调试,直到成功。

四、实验原理

(1)硬布线控制器基本原理

硬布线控制器是一种把控制部件看作产生专门固定时序控制信号的逻辑电路,这种逻辑电路是一种由门电路和触发器构成的复杂树形逻辑网络。当执行不同机器指令时,通过激活一系列彼此很不相同的控制信号来实现对指令的解释。

每个微操作控制信号C是一系列输入量的逻辑函数,即用组合逻辑来实现

C=f(Im,Mi,Tk,Bj)

Im是机器指令操作码译码器的输出信号,Mi是节拍电位信号,Tk是节拍脉冲信号,Bj表示来自执行部件的反馈信息,是状态条件信号。

在TEC-8实验系统中,节拍脉冲信号Tk,(T1~T3)已经直接输送给数据通路。4位指令操作码IR4~IR7直接成为Im的一部分;SWC、SWB、SWA可以看做是Im的另一部分。Mi是时序发生器产生的节拍信号W1~W3;Bi包括ALU产生的进位信号C、结果为0信号Z等。

(2)硬布线控制器逻辑模块图

硬布线控制器的某一操作控制信号 C在某条特定指令和状态条件下,在某一序号的特定节拍电位和节拍脉冲时间间隔中起作用,从而激活这条控制信号线,对执行部件实施控制。图中芯片的输出信号就是微操作控制信号,它用来对执行部件进行控制。另有一些信号则根据条件变量来改变时序发生器的计数顺序,以便跳过某些状态,从而可以缩短指令周期。其中IR7~IR4,SWA,SWB,SWC是机器指令操作码译码器的输出信号,W1,W2,W3是节拍电位信号,T1,T2,T3是节拍脉冲信号,C,Z是结果反馈信息,图中树形逻辑网络N在接收三个输入信号来源的信号后输出LDZ,LDC,CIN,LIR,SELCTL,STOP等微操作控制信号,用来对执行部件进行控制。

(3)TEC-8数据通路图

控制器:

CLR: IN STD_LOGIC; C,Z: IN STD_LOGIC; LDZ: OUT STD_LOGIC;

器。

LDC: OUT STD_LOGIC; CIN: OUT STD_LOGIC; M: OUT STD_LOGIC;

ABUS: OUT STD_LOGIC; DRW: OUT STD_LOGIC; PCINC: OUT STD_LOGIC; LPC: OUT STD_LOGIC; LAR: OUT STD_LOGIC; PCADD: OUT STD_LOGIC; ARINC: OUT STD_LOGIC; SELCTL: OUT STD_LOGIC; MEMW: OUT STD_LOGIC; STOP: OUT STD_LOGIC; LIR: OUT STD_LOGIC;

--当它为1时,在T3的上升沿将运算得到的进位保存到C标志--进位输出。

--控制算术逻辑运算类型

--当它为1时,将开关数据送到数据总线DBUS;当它为0时,--为1时,在T3上升沿对RD1、RD0选中的寄存器进行写操作,--当它为1时,在T3的上升沿PC加1。

--当它为1时,在T3的上升沿,将数据总线DBUS上的D7~D0--当它为1时,在T3的上升沿,将数据总线DBUS上的D7~D0--当它为1时,将当前的PC值加上相对转移量,生成新的PC。 --当它为1时,在T3的上升沿AR加1。

--当它为1时,TEC-8实验系统处于实验台状态,当它为0时,--当它为1时,在T2为1期间将数据总线DBUS上的D7~D0--当它为1时,在T3结束后时序发生器停止输出节拍脉冲T1、--当它为1时,在T3的上升沿将从双端口RAM的右端口读出寄存器。

-- 清零信号 --时序信号 -- 标志信号

--当它为1时,如果运算结果为0,在T3的上升沿,将1写入

T3, W1,W2,W3: IN STD_LOGIC;

到Zbiaozhi寄存器;如果运算结果不为0,将0保存到Z标志寄存

禁止开关数据送数据总线DBUS。

将数据总线DBUS上的数D7~D0写入选定的寄存器。

写入程序计数器PC。 写入地址寄存器AR。

TEC-8实验系统处于运行程序状态。

写入双端口RAM。写入的存储器单元由AR7~AR0指定。 T2、T3。

的指令INS7~INS0写入指令寄存器IR。读出的存储器单元由PC7~PC0指定。

SBUS: OUT STD_LOGIC; MBUS: OUT STD_LOGIC; SHORT: OUT STD_LOGIC; LONG: OUT STD_LOGIC;

--当它为1时,数据开关SD7~SD0的数送数据总线DBUS。 --当它为1时,将双端口RAM的左端口数据送到数据总线DBUS --只产生节拍W1。 --产生节拍W1、W2、W3。

-- 即IR7-IR4 ,指令的操作码

SW: IN STD_LOGIC_VECTOR(2 DOWNTO 0); -- 即SWC SWB SWA,控制台方式控制信号 IR:I N STD_LOGIC_VECTOR(3 DOWNTO 0);

S: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -- ALU的方式控制,与M配合以选择逻辑或算数运算 SEL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -- 寄存器选择向量

(4)机器指令流程图设计

五、设计步骤与实验过程

(1)设计步骤 1、学习硬布线控制器基本原理

2、设计机器指令周期流程图 3、设计组合逻辑译码表

4、根据组合逻辑译码表和控制器流程图写出VHDL代码 5、分配各输入输出信号管脚 6、下载程序到芯片 7、反复调试

(2)实验日志、故障及排除方案

2016.8.29 日志:熟悉实验台

遇到问题及解决方案:由于学习tec8实验台已有一段时间,操作不熟练,按照以前的实验步骤,写存储器,读存储器,写寄存器,读寄存器。

2016.8.30

日志:复习用VHDL语言编写程序

遇到问题及解决方案:1、语法记不清,重新理解了ENTITY、PROCESS、ARCHITECTURE等意义和使用方法。

2、Quartus操作方法也已忘记,重新找到以前的课件,按照课件一步一步练习操作,

2016.8.31

日志:尝试建立一个可以编译下载到EMP7128SLC84-15芯片的工程,并将示例程序编译后分配管脚,下载到芯片。

遇到问题及解决方案:1、因为一开始使用的是64位的quartus,分配管脚报错:license文件不支持该芯片,用32位的重新建工程就编译通过。

2、因为用的是自己的win10的电脑,无法识别USB下载器,又将工程拷贝到实验室电脑上成功下载到芯片。

3、一开始不清楚从哪输入IR7~IR4、C、Z,和同学讨论后,理解了将程序先存入存储器,连线后可执行微程序。 2016.9.1

日志: 1、研究输入输出信号的具体作用。2、根据硬布线控制器参考流程图写组合逻辑译码表。3、按要求编写程序VHDL代码。

遇到问题及解决方案:1、循环操作中读寄存器的ST0判断与取值难以直接改变,ST0作为一个signal,不可以在两个process中同时有赋值语句,所以 设置了SST0控制,SST0为1时ST0置1。 2、不知道如何利用T3控制,后经和组员讨论利用T3下降沿来完成时序同步。 2016.9.2

日志:1、继续编写程序。2、初步在实验台调试编写的程序

遇到问题及解决方案:1、初次调试运行程序时指令输出不正确,检查程序后发现需要每次进入进程时初始化。

2、前几次调试时写寄存器操作跳转出错,检查代码发现未给SST0置0。 3、SST0对ST0的控制需要同步处理,即在一个拍结束后再对ST0控制。 2016.9.5

日志:1、逐条验证编写的指令。2、运行老师给的检验程序 遇到问题及解决方案:

1、老师的检验程序运行至JMP时IR显示出错,查找原因,发现LD命令未能正确运行,排除法找出是代码错误引起。一共找出两个错误。(1)课本程序框图中LD语句W3的节拍里未注明S的取值,写程序时理解为初始化为0,请教同学后,理解了S应保持W2时的值不变;(2)修改代码后仍运行不正确,检查管脚配置发现漏掉了M,加上后编译运行,结果正确

2、欲添加自己的指令,不能确定指令相应的输出信号与代码,经查书和上网查找后解决问题。

六、算法设计(伪代码)

1、首先是时序

PROCESS,伪代码描述如下:

PROCESS (RST0,SST0,T3,SW,CLR)

BEGIN

IF CLR='0' THEN

ST0清零;

ELSIF SW有意义 THEN -- SW四种情况均要用到ST0控制

if 同步信号到来 then -- 通过T3实现标记置位/复位同步

完成对ST0的复位和置位; END IF;

else NULL; end if;

END IF;

END PROCESS;

2、其次是指令控制PROCESS,设计思想涉及到两级的译码结构(两重SWITCH-CASE)结构,由

于要实线“可以在任何地方开始程序”,在取值时需要做一些调整。用伪代码描述如下:

PROCESS(SW,W3,W2,W1,IR,CLR) BEGIN

初始化;

CASE SW IS

WHEN \"100\"=> IF ST0='0' THEN 写R0和R1;

SST0有效;

ELSIF ST0='1' THEN 写R2和R3;

RST0有效;

END IF; WHEN \"011\"=> 每拍读两个; WHEN \"010\"=> IF ST0='0' THEN 给首地址;

SST0有效;

ELSIF ST0='1' THEN 自增; END IF; WHEN \"001\"=> IF ST0='0' THEN 给首地址;

SST0有效;

ELSIF ST0='1' THEN 自增; END IF; WHEN \"000\"=>

IF ST0 = '0' THEN

给首地址; SST0有效;

ELSIF ST0 = '1' THEN

取指,并保证ST0永远为1; CASE IR IS

0001-1111操作码译码; END CASE;

END IF;

END CASE; END PROCESS;

七、实验VHDL代码

LIBRARY IEEE;

USE IEEE.std_logic_1164.ALL;

ENTITY CPU IS PORT(

CLR:IN STD_LOGIC; -- 清零信号 T3,W1,W2,W3:IN STD_LOGIC; --时序信号 C,Z:IN STD_LOGIC; -- 标志信号 LDZ:OUT STD_LOGIC; --当它为1时,如果运算结果为0,在T3的上升沿,将1写入到Zbiaozhi寄存器;如果运算结果不为0,将0保存到Z标志寄存器。 LDC:OUT STD_LOGIC; --当它为1时,在T3的上升沿将运算得到的进位保存到C标志寄存器。 CIN:OUT STD_LOGIC; --进位输出。 M:OUT STD_LOGIC; --控制算术逻辑运算类型 ABUS:OUT STD_LOGIC; --当它为1时,将开关数据送到数据总线DBUS;当它为0时,禁止开关数据送数据总线DBUS。 DRW:OUT STD_LOGIC; --为1时,在T3上升沿对RD1、RD0选中的寄存器进行写操作,将数据总线DBUS上的数D7~D0写入选定的寄存器。 PCINC:OUT STD_LOGIC; --当它为1时,在T3的上升沿PC加1。 LPC:OUT STD_LOGIC; --当它为1时,在T3的上升沿,将数据总线DBUS上的D7~D0写入程序计数器PC。 LAR:OUT STD_LOGIC; --当它为1时,在T3的上升沿,将数据总线DBUS上的D7~D0写入地址寄存器AR。 PCADD:OUT STD_LOGIC; --当它为1时,将当前的PC值加上相对转移量,生成新的PC。 ARINC:OUT STD_LOGIC; --当它为1时,在T3的上升沿AR加1。 SELCTL:OUT STD_LOGIC; --当它为1时,TEC-8实验系统处于实验台状态,当它为0时,TEC-8实验系统处于运行程序状态。 MEMW:OUT STD_LOGIC; --当它为1时,在T2为1期间将数据总线DBUS上的D7~D0写入双端口RAM。写入的存储器单元由AR7~AR0指定。 STOP:OUT STD_LOGIC; --当它为1时,在T3结束后时序发生器停止输出节拍脉冲T1、T2、T3。 LIR:OUT STD_LOGIC; --当它为1时,在T3的上升沿将从双端口RAM的右端口读出的指令INS7~INS0写入指令寄存器IR。读出的存储器单元由PC7~PC0指定。 SBUS:OUT STD_LOGIC; --当它为1时,数据开关SD7~SD0的数送数据总线DBUS。 MBUS:OUT STD_LOGIC; --当它为1时,将双端口RAM的左端口数据送到数据总线DBUS SHORT:OUT STD_LOGIC; --只产生节拍W1。 LONG:OUT STD_LOGIC; --产生节拍W1、W2、W3。 SW:IN STD_LOGIC_VECTOR(2 DOWNTO 0); -- 即SWC SWB SWA,控制台方式控制信号 IR:IN STD_LOGIC_VECTOR(3 DOWNTO 0); -- 即IR7-IR4 ,指令的操作码 S: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -- ALU的方式控制,与M配合以选择逻辑或算数运算 SEL:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -- 寄存器选择向量 COMB:OUT STD_LOGIC_VECTOR(2 DOWNTO 0) --错误信号。 );

END CPU;

ARCHITECTURE logic of CPU is

SIGNAL ST0: STD_LOGIC:='0'; -- 循环开关,用来实现首地址输入

SIGNAL SST0: STD_LOGIC:='0'; -- ST0的置位信号,将ST0置逻辑1,通过T3实现时序同步 BEGIN PROCESS (SST0,T3,SW,CLR) -- ST0和CLR控制过程 BEGIN IF CLR='0' THEN ST0 <= '0'; ELSIF SW=\"010\" OR SW=\"001\" OR SW = \"100\" OR SW=\"000\" THEN -- SW四种情况均要用到ST0控制 if T3'EVENT AND T3='0' then -- 通过T3实现标记置位/复位同步 IF SST0='1' THEN --ST0置位。 ST0<='1'; ELSIF SST0 = '0' THEN --ST0复位。 ST0<='0';

END IF; else NULL; end if; END IF; END PROCESS;

PROCESS(SW,W3,W2,W1,IR,CLR) -- 译码 BEGIN -- 初始化过程 LDZ<='0'; LDC<='0'; CIN<='0'; S<=\"0000\"; M<='0'; ABUS<='0'; DRW<='0'; PCINC<='0'; LPC<='0'; LAR<='0'; PCADD<='0'; ARINC<='0'; SELCTL<='0'; MEMW<='0'; STOP<='0'; LIR<='0'; SBUS<='0'; MBUS<='0'; SHORT<='0'; LONG<='0'; SEL<=\"0000\";

-- SW译码 CASE SW IS

WHEN \"100\"=> -- 写寄存器 IF ST0='0' THEN

SBUS<=W1 OR W2; SEL(2)<=W2; SEL(1)<=W1; SEL(0)<=W1;

SELCTL<=W1 OR W2; DRW<=W1 OR W2; STOP<=W1 OR W2; SST0<=W2;

ELSIF ST0='1' THEN SBUS<=W1 OR W2; SEL(3)<=W1 OR W2; SEL(2)<=W2; SEL(1)<=W2; SEL(0)<=W1;

SELCTL<=W1 OR W2; DRW<=W1 OR W2; STOP<=W1 OR W2; SST0<=NOT W2;

END IF;

WHEN \"011\"=> -- 读寄存器 SEL(3)<=W2; SEL(1)<=W2;

SEL(0)<=W1 OR W2; SELCTL<=W1 OR W2; STOP<=W1 OR W2;

WHEN \"010\"=> -- 读存储器 IF ST0='0' THEN SBUS<=W1; LAR<=W1; STOP<=W1; SST0<=W1;

SHORT<=W1; SELCTL<=W1; ELSIF ST0='1' THEN MBUS<=W1; ARINC<=W1; STOP<=W1; SHORT<=W1; SELCTL<=W1; END IF;

WHEN \"001\"=> -- 写存储器 IF ST0='0' THEN SBUS<=W1; LAR<=W1; STOP<=W1;

SST0<=W1;

SHORT<=W1; SELCTL<=W1; ELSIF ST0='1' THEN SBUS<=W1; MEMW<=W1; ARINC<=W1; STOP<=W1; SHORT<=W1; SELCTL<=W1; END IF;

WHEN \"000\"=> LIR<=W1; PCINC<=W1; S<=\"0000\"; CASE IR IS WHEN \"0001\"=> S(3)<=W2; S(0)<=W2; CIN<=W2; ABUS<=W2; DRW<=W2; LDZ<=W2; LDC<=W2; WHEN \"0010\"=> S(2)<=W2; S(1)<=W2; ABUS<=W2; DRW<=W2; LDZ<=W2; LDC<=W2; WHEN \"0011\"=> S(3)<=W2; S(1)<=W2; S(0)<=W2; M<=W2; ABUS<=W2; DRW<=W2; LDZ<=W2; WHEN \"0100\"=> ABUS<=W2; DRW<=W2; LDZ<=W2; LDC<=W2; WHEN \"0101\"=> M<=W2; S(3)<=W2 OR W3; S(1)<=W2 OR W3; ABUS<=W2; LAR<=W2; LONG<=W2; DRW<=W3; MBUS<=W3; WHEN \"0110\"=> M<=W2 OR W3; S(3)<=W2 OR W3; S(2)<=W2; S(1)<=W2 OR W3; S(0)<=W2; ABUS<=W2 OR W3; LAR<=W2; LONG<=W2; MEMW<=W3; WHEN \"0111\"=> IF C='1' THEN PCADD<=W2; END IF; WHEN \"1000\"=> IF Z='1' THEN PCADD<=W2; END IF; WHEN \"1001\"=> M<=W2; S(3)<=W2; S(2)<=W2; S(1)<=W2;

--ADD --SUB --AND --INC --LD --ST --JC --JZ --JMP S(0)<=W2; ABUS<=W2; LPC<=W2; WHEN \"1010\"=> --OUT M<=W2; S(3)<=W2; S(1)<=W2; ABUS<=W2; WHEN \"1110\"=> --STP STOP<=W2; WHEN \"1100\"=> --OR S(3)<=W2; S(2)<=W2; S(1)<=W2; M<=W2; ABUS<=W2; DRW<=W2; LDZ<=W2; WHEN OTHERS=> COMB<=\"000\"; END CASE; WHEN OTHERS=> NULL; END CASE; END PROCESS; END ARCHITECTURE;

八、验收测试程序

地址 00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH 10H 11H 12H 13H 14H 指令 LD R0,[R2] INC R2 LD R1,[R2] ADD R0,R1 JC 06H AND R1,R0 SUB R0,R2 INC R1 STA R0,[R1] INC R3 JZ 0DH LD R2,[R3] JMP [R2] INC R3 INC R3 SUB R0,R2 LD R2,[R0] ADD R3,R2 LD R3,[R3] OUT R0 STP 52H 48H 56H 11H 71H 34H 22H 44H 64H 4CH 82H 5BH 98H 4CH 4CH 22H 58H 1EH 5FH A0H E0H 指令代码 0101 0010 0100 1000 0101 0110 0001 0001 0111 0001 0011 0100 0010 0010 0100 0100 0110 0100 0100 1100 1000 0010 0101 1011 1001 1000 0100 1100 0100 1100 0010 0010 0101 1000 0001 1110 0101 1111 1010 0000 1110 0000

九、测试结果

地址 指令 R0 67H E7H 86H 07H 04H 86H 83H 80H 80H R1 80H 80H 81H 82H 82H 83H 83H R2 60H 61H 03H 03H 60H 60H R3 FDH FEH FFH 00H 01H 02H 62H FDH FDH [60H] [61H] [62H] [80H] [81H] [82H] [83H] [FEH] [FFH] 67H 67H 80H 80H FDH FDH 60H 60H 86H 86H 04H 04H 83H 83H 03H 03H 03H 03H 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 结果 00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 03H 04H 06H 07H 08H 09H 0AH 0BH 0CH 03H 04H 05H 06H 07H 08H 09H 0AH 0DH 0EH 0FH 10H 11H 12H 13H 14H LD R0,[R2] INC R2 LD R1,[R2] ADD R0,R1 JC 06H AND R1,R0 SUB R0,R2 INC R1 STA R0,[R1] INC R3 JZ 0DH LD R2,[R3] JMP [R2] ADD R0,R1 JC 06H SUB R0,R2 INC R1 STA R0,[R1] INC R3 JZ 0DH LD R2,[R3] JMP [R2] ADD R0,R1 JC 06H AND R1,R0 SUB R0,R2 INC R1 STA R0,[R1] INC R3 JZ 0DH INC R3 INC R3 SUB R0,R2 LD R2,[R0] ADD R3,R2 LD R3,[R3] OUT R0 STP 计算可得,结果完全符合

十、实验结论

(1)时序逻辑的设计是一个难题,因为所有的控制信号都需要用来时序函数直接译码输出。这里其实体现

了硬布线和微程序控制器的本质区别:硬布线采用了时序逻辑,比起微程序控制器的存储逻辑,它少了一层。不难类比网络设计中的协议分层原则:好的分层(微程序控制器)的优点是普适性好,结构清晰,易于泛化;也存在缺点:效率低下。

(2)根据设计的硬布线控制器流程图设计译码电路,可先列出译码表作为逻辑设计的根据,然后用VHDL语言直接写出相应的语言描述,由于使用在系统可编程器件,集成度高,灵活性强,编程下载方便,用于硬连线控制器使调试简单。

(3)硬布线控制器和微程序控制器的不同:

1、微程序控制器的控制功能是在存放微程序存储器和存放当前正在执行的微指令的寄存器直接控制下实现的,而硬布线控制的功能则由逻辑门组合实现。微程序控制器的电路比较规整,各条指令信号的差别集中在控制存储器内容上。

2、微程序控制器一个机器指令对应一条微程序,一个微指令周期对应一个节拍电位时间。而硬布线控制器时序产生器除了产生节拍脉冲信号外还应产生节拍电位信号,用于在一个指令周期中顺序执行一系列微操作,需要设置若干节拍电位来定时。

3、在微程序控制器中,微操作控制信号由微指令产生,并且可以重复使用。而在硬布线控制器中某一微操作控制信号由布尔代数表达式描述的输出函数产生。

十一、中断设计方案

1、中断原理

中断方式是在外设为数据传送做好准备之后,就向CPU发出中断请求信号(相当于通知CPU)。CPU接收到中断请求信号之后立即作出响应,暂停正在执行的原程序(主程序),而转去外设的数据输入输出服务,待服务完之后,程序返回。CPU再继续执行被中断的原程序。

我们设计的是外部中断。外部中断以电平触发,通过PULSE按钮输入请求信号。

2、实现方案

模仿TEC-8中提供的中断系统,我们所设计的中断系统只支持单级中断、单个中断请求,有中断屏蔽功能。

在VHDL编写的CPU系统中有三条指令,开中断指令 EI(1101XXXX)、关中断指令 DI(1100XXXX)、中断返回指令 IRET(1011XXXX)。

在时序发生器中,设置了一个允许中断触发器EN_INT(DI or !EI),当它为1时,允许中断,当它为0时,禁止中断发生。复位脉冲CLR#使EN_INT复位为0。

中断地址寄存器IAR是74LS374。当信号LIAR为1时,在T3的上升沿,将PC保存在IAR中。当信号IABUS为1时,IABUS中保存的PC送数据总线DBUS。由于本实验系统只有一个断点寄存器而无堆栈,因此仅支持一级中断而不支持多级中断。

中断向量即中断服务程序的入口地址,TEC-8系统中由数据开关SD7~SD0提供。

除指令EI、DI外,每条指令执行过程的最后一条微指令都包含判断位P4,用于判断有无中断发生,根据中断信号INT是否为1决定VHDL程序分支。如果信号INT为1,则转如由SD7~SD0提供的中断向

量,进入中断处理;如果信号INT为0,则继续取下一条指令然后执行。

INT为1转到中断向量,根据VHDL语言改变INTDI信号,禁止新的中断发生,产生LIAR信号保存当前地址 (断点寄存器),产生STOP信号,等待手动设置中断向量(数据开关SD7~SD0设置中断地址),机器将中断向量读到PC后,转到中服务程序继续执行。

执行指令IRET,从中断地址返回,该指令产生IABUS信号,恢复断点地址,产生信号LPC,将断点从数据总线装入PC,恢复被中断的程序。

发生中断时,关中断由硬件负责。而中断现场(包括4个寄存器、进位标志C和结果为0标志Z)的保存和恢复由中断服务程序完成。中断服务程序的最后两条指令一般是开中断指令EI和中断返回指令IRET。为了保证从中断服务程序能够返回到主程序,EI指令执行后,不允许立即被中断。因此,EI指令执行过程中的最后一条微指令中不包含P4判别位。

使用VHDL语言描述TEC-8中的中断控制器 INT_EN_P:process(CLR,MF,INTEN,IBNTDI,PULSE,EN_INT)

begin

if CLR='0' then

EN_INT<='0';

EN_INT<= INTEN or (EN_INT and (not INTDI) ); elsif MF' event and MF='1' then end if;

INT<= EN_INT and PULSE;

INTR

返回

外设工作主程序响应

中断程序 end process

由于EPM7128引脚规定中没有PLUSE输入引脚,也没有IABUS输出引脚,因此无法实际进行试验。

如果有该引脚的话,测试程序如下:

地址 20H 指令 INTS 代码 10110000 21H 22H 23H 24H 25H 26H 27H 28H 29H LDA R0,[R2] ADD R0,R0 ADD R0,R0 ADD R0,R0 ADD R0,R0 ADD R0,R0 ADD R0,R0 ADD R0,R0 JMP[R1] 01011000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10000100 中断服务程序:

地址 0A0H 0A1H 指令 AND R0,R0 IRET 机器代码 00110000 1010xxxx

寄存器R1的值为21H.

当有PLUSE输入引脚时,执行上面的程序,则最初一直在20H-29H之间取指,输入PULSE信号后,在微指令的最后进入中断,输入中断服务程序地址0A0H,中断程序执行完毕后跳回被中断程序继续执行。

十二、小组成员实验心得与体会

周卓彬:

在此次计算机组成原理课程设计中,经过每位组员的通力合作,我们顺利完成了一个硬布线控制器的CPU设计,涵盖了基本的读写寄存器及存储器操作,支持执行基本的指令集。从流程设计,代码编写,芯片烧录到调试运行,整个过程使我受益良多。

一开始的时候无从下手,因为这个设计并不像是之前接触的代码任务,根据实验说明就可以直接写代码。所以一开始我们做的事是先分析,分析CPU由什么组成,各个组成部分又是怎么通过代码实现的。由于过了一个假期,对上学期做的TEC-8实验都忘得差不多了,所以一开始我先是看书,将上学期做的实验内容重新捡回来,理解完之后就开始码代码。码代码的时候也遇到了很多问题,庆幸的是都解决了,就不再赘述。其中令我印象深刻的一个小问题是在调试LD指令的时候,发现了错误,先是通过对ST指令的检查排除是W3节拍的问题,接着检查代码发现也没问题,纠结了一下午,最后才发现原来是M信号忘了分配管脚,这个小问题告诉了我,无论做什么,都要注意细节,千里之堤毁于蚁穴,做事要细心谨慎。

这次实验设计总算是顺利完成,这不仅仅依靠组员各自的专业知识,更依赖于团队协作,例如一开始的实验分析,每天的出勤时间协调,还有遇到问题时的团队讨论,等等。

颜力琦:

首先,本次实验是设计计算机控制器的实验,利用实验台等资源,深入理解了计算机最底层的工作原理。以前不理解只有0和1的机器代码是如何控制硬件工作,通过本次实验,建立了整个代码逻辑和硬件

细节的概念。初次接触硬布线控制器代码编写时,对如何处理T3、W1、W2、W3等信号毫无头绪,经过对原理的仔细摸索和上网查阅资料,终于有了思路并写出了代码,经过不断尝试,完成了整个程序的编写。这让我们很好地理解了机器指令是如何执行的,领悟了控制器的工作原理。

其次,本次实验需要手动测试,需要将指令一条一条地输入存储器,结果错误时还需要不断重新操作,这很好地考验和培养了我们的耐心和细心。在操作时,我们一个同学读出指令代码另一个同学输入,这也是一种培养团队合作精神的方式,是未来工作所必不可少的。

第三,以前的计算机组成原理实验是在老师一步一步指导下完成的,这次老师完全没有提供具体的步骤,实验的路得自己一点一点地探索出来,我们亲力亲为,把所学的理论知识与实践相结合起来,从理论中得出结论,在实验里验证理论,将每个步骤,每个细节弄清楚,实验后,还要反复思考,才取得最后的成果。

通过这次测试技术的实验,使我学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,甚至在我们未来的学习中工作中也是必须的,真正使我们受益匪浅。

潘自成:

在这两个礼拜的课程设计中,让我会想起很多上学计算机组成原理的内容,因为上学期做过和这个类似的微程序的实验,所以对于这次的硬布线的内容还是有一定理解。在编写代码的过程中,我负责的是各个功能指令代码的编写,对照着流程图和看书,再加上复习以前VHDL的内容,把指令部分完成,在编写每个代码的过程中,回想起了上学期微程序的内容,对于上学期的有些不明白的内容也理解了,比如JZ,JC两个跳转的指令,上学期只是知道他是跳转到哪一步,但是经过试验之后就了解到为什么相差1,因为PC有加1。另外在编写完成后的调试过程中,也增强了我的动手能力。在整个硬布线控制器的设计过程中,让我对计算机内部有了更深的了解,从最先开始的逻辑门实验,到后来微程序实验,再到这次的硬布线实验,感觉像是对计算机工作原理的一次又一次的深刻学习,了解到更多计算机硬件是如何工作的。收获很大。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top