实验七 指令译码器的设计与调试含框图30793共19页.docx
《实验七 指令译码器的设计与调试含框图30793共19页.docx》由会员分享,可在线阅读,更多相关《实验七 指令译码器的设计与调试含框图30793共19页.docx(18页珍藏版)》请在冰豆网上搜索。
实验七指令译码器的设计与调试含框图30793共19页
实验(shíyàn)七控制器-指令(zhǐlìng)译码器的设计与调试
1实验(shíyàn)目的
(1)理解(lǐjiě)控制器中“指令译码器”的作用和重要性。
(2)学习设计指令译码器。
2实验原理
指令译码器是计算机控制器中最重要的部分。
所谓“组合逻辑控制器”就是指指令译码电路是由组合逻辑实现的。
组合逻辑控制器又称硬连线控制器,是早期设计计算机的一种方法。
这种控制器中的控制信号直接由各种类型的逻辑门和触发器等组合产生。
这样,一旦控制部件构成后,除非重新设计和物理上对它重新连线,否则要想增加新的功能是不可能的。
结构上的这种缺陷使得硬连线控制器的设计和调试变得非常复杂而且代价很大。
所以,硬连线控制器曾一度被“微程序控制器”所取代。
但是随着新一代机器及VLSI技术的发展,这种控制器又得到了重视,如RISC机广泛使用这种控制器。
1).组合逻辑控制器原理
图1组合逻辑控制器的结构方框图
图1是组合逻辑控制器的结构方框图。
逻辑网络的输入信号来源有三个:
(1)指令操作码译码器的输出In;
(2)来自时序发生器的节拍电位信号Tk;(3)来自执行部件的反馈信
号Bj。
逻辑网络的输出信号就是微操作控制信号,用来对执行部件进行控制。
组合逻辑控制器可描述(miáoshù)为:
某一微操作控制信号Cm是指令(zhǐlìng)操作码译码器的输出In、时序(shíxù)信号(节拍电位信号Tk)和状态(zhuàngtài)条件信号Bj的逻辑函数。
即
Cm=f(In,Tk,Bj)
用这种方法设计控制器,需要根据每条指令的要求,让节拍电位和时序脉冲有步骤地去控制机器的各有关部分,一步一步地执行指令所规定的微操作,从而在一个指令周期内完成一条指令所规定的全部操作。
一般来说,组合逻辑控制器的设计步骤如下。
(1)绘制指令流程图
为了确定指令执行过程所需的基本步骤,通常是以指令为线索,按指令类型分类,将每条指令归纳成若干微操作,然后根据操作的先后次序画出流程图。
(2)安排指令操作时间表
指令流程图的进一步具体化,把每一条指令的微操作序列分配到各个机器周期的各个时序节拍信号上。
要求尽量多的安排公共操作,避免出现互斥。
(3)安排微命令表
以指令流程图为依据,表示出在哪个机器周期的哪个节拍有哪些指令要求哪些微命令。
(4)进行微操作逻辑综合
根据微操作时间表,将执行某一微操作的所有条件(哪条指令、哪个机器周期、哪个节拍和脉冲等)都考虑在内,加以分类组合,列出各微操作产生的逻辑表达式,并加以简化。
(5)实现电路
根据上面所得逻辑表达式,用逻辑门电路的组合或大规模集成电路来实现。
3实验要求
1).实验设计目标
本实验要求根据所给的指令系统(见附件1,硬件结构参见附件2)设计指令译码器,本实验指令译码器的设计相对比较简单,节拍(t1、t2和t3)因素只在存储器读写时需要对存储器地址分时使用时需要考虑,这里暂不考虑节拍脉冲t,也就是说微操作控制信号只是指令操作码In和Bj的函数:
Cm=f(In,Bj)
式中的In主要代表指令操作码IR[15..12],还有辅助操作码(如算术逻辑指令时的IR[2..0],我们这里要求只考虑指令操作码IR[15..12]及反馈信号Bj,(进位标志C和零标志Z)。
要求产生的微操作控制信号如下:
op_code控制ALU进行8种运算操作的3位编码。
c_z_j_flag为1表示需要条件转移。
lj_instruct为1表示本条指令是条“JMPADR”指令。
DRWr为1表示在t3的下降沿将本条指令的执行结果写入目的寄存器。
Mem_Write为1表示本条指令有存储器写操作,存储器的地址是目的寄存器的内容。
DW_intruct为1表示本条指令是双字指令。
change_z为1表示本条指令可能改变(gǎibiàn)z(结果为0)标志。
change_c为1表示本条指令可能(kěnéng)改变c(进位)标志。
sel_memdata为1表示本条(běntiáo)指令写入目的寄存器的值来自读存储器。
2).顶层设计实体(shítǐ)的引脚要求
引脚要求的对应关系如下:
(1)指令IR[15..12]对应实验台开关SD3—SD0input
进位C对应实验台开关SD4
结果为0标志Z对应实验台开关SD5
(2)控制信号对应如下:
output
op_code[2..0]指示灯R2、R1、R0
c_z_j_flag指示灯R3
lj_instruct指示灯R4
DRWr指示灯R5
Mem_Write指示灯R6
DW_intruct指示灯R7
change_z指示灯R8
change_c指示灯R9
sel_memdata指示灯R10
4实验步骤
(1)实验台设置成FPGA-CPU独立调试模式
REGSEL=0、CLKSEL=1、FDSEL=0。
使用实验台上的单脉冲,即STEP_CLK短路子短接,短路子RUN_CLK断开。
(2)将设计在QuartusⅡ下输入,编译后下载到TEC-CA上的FPGA中。
(3)拨动实验台上的开关SD5—SD0,改变IR[15..12]、进位标志C和结果为0标志Z,观察指示灯R10-R0显示的控制信号,并填写表1和表2。
5补充题
(1)如果考虑辅助指令操作码,指令译码器如何改进?
(2)如果加上PUSHSR、POPDR、CALLADDR和RET等指令,指令译码器如何设计?
(3)如果指令集改为MIPS指令集,指令译码器如何设计?
(选)
6实验记录
观察实验中相关信号灯的变化情况,记录并且填写表1、表2;
7.实验报告
1.分析(fēnxī)VHDL程序结构。
2.填写(tiánxiě)实验表1和表2及说明(shuōmíng)。
表1指令(zhǐlìng)译码器实验(C=0且Z=0)
指令
IR[15..12]
OP[2..0]
c_z_j_flag
lj_instruct
DRWr
Mem_Write
DW_intruct
change_z
change_c
sel_memdata
ADDDR,SR
0000
000
0
0
1
0
0
1
1
0
INCDR
SUBDR,SR
DECDR
ANDDR,SR
ORDR,SR
NOTDR
MOVDR,SR
JMPADR
JNCADR
JNZADR
MVRDDR,DATA
LDRDR,SR
STRSR,DR
表2指令(zhǐlìng)译码器实验(C=0且Z=1或者C=1且Z=0或者C=1且Z=1)
指令
IR[15..12]
OP[2..0]
c_z_j_flag
lj_instruct
DRWr
Mem_Write
DW_intruct
change_z
change_c
sel_memdata
ADDDR,SR
INCDR
SUBDR,SR
DECDR
ANDDR,SR
ORDR,SR
NOTDR
MOVDR,SR
JMPADR
1000
111
0
1
0
0
0
0
0
0
JNCADR
JNZADR
MVRDDR,DATA
LDRDR,SR
STRSR,DR
附录(fùlù)1:
指令系统介绍
设计CPU首先要设计指令(zhǐlìng)系统。
由于实验CPU采用16位字长,指令系统只有15条指令,因此比8位CPU的指令系统设计容易得多。
1.指令系统(zhǐlìnɡxìtǒnɡ)
ADDDR,SR
指令(zhǐlìng)编码:
0000DRSR
00000111
功能:
DR←DR+SR,影响C和Z标志。
PC←PC+1。
INCDR
指令编码:
0001DRSR
00000111
功能:
DR←DR+1,影响C和Z标志。
PC←PC+1。
SUBDR,SR
指令编码:
0010DRSR
00000111
功能:
DR←DR–SR,影响C和Z标志。
PC←PC+1。
DECDR
指令编码:
0011DRSR
00000111
功能:
DR←DR–1,影响C和Z标志。
PC←PC+1。
ANDDR,SR
指令编码:
0100DRSR
00000011
功能:
DR←DRandSR,影响Z标志。
PC←PC+1。
ORDR,SR
指令编码:
0101DRSR
00000011
功能:
DR←DRorSR,影响Z标志。
PC←PC+1。
NOTDR
指令(zhǐlìng)编码:
0110DRSR
00000011
功能(gōngnéng):
DR←notDR,影响(yǐngxiǎng)Z标志。
PC←PC+1。
MOVDR,SR
指令(zhǐlìng)编码:
0111DRSR
00000001
功能:
DR←SR,不影响标志位。
PC←PC+1。
JMPADR
指令编码:
10000000
00000000
ADR
功能:
PC←ADR。
JNCADR
指令编码:
10010000
ADR-@-1
功能:
如果C=0,则PC←ADR;如果C=1,则PC←PC+1。
JNZADR
指令编码:
10100000
ADR-@-1
功能:
如果Z=0,则PC←ADR;如果Z=1,则PC←PC+1。
MVRDDR,DATA
指令编码:
11000000
00000000
DATA
功能:
DR←DATA。
PC←PC+2。
LDRDR,SR
指令编码:
1101DRSR
00000001
功能:
DR←[SR]。
PC←PC+1。
STRSR,DR
指令编码:
1110DRSR
00000000
功能(gōngnéng):
[DR]←SR。
PC←PC+1。
NOP
指令(zhǐlìng)编码:
01110000
00000000
功能(gōngnéng):
PC←PC+1。
说明(shuōmíng):
1.本CPU中含有4个通用寄存器器,用R0、R1、R2和R3表示。
源寄存器用SR表示,目的寄存器用DR表示,因此DR和SR在指令编码中各用2bit编码。
2.指令编码中的@代表该指令当前的PC值。
2指令系统设计说明
设计指令系统时首要考虑的是指令要满足功能上的需求。
这个指令系统除了PUSH、POP、CALL和RET等少数指令没有包括外,其本上是齐全的。
它包括了运算指令、转移指令和存储指令等三类,有代表性。
这三类指令根据IR15—IR14进行分类:
IR15为0时运算指令;为1其他指令
IR15、IR14为10时转移指令;
IR15、IR14为11时存储指令。
除了要满足功能上的要求外,设计的指令格式要考虑指令译码方便,减少硬件资源的消耗。
本指令系统采取了如下措施:
(1)算术逻辑指令的IR14—IR12对应运算器ALU的3位运算操作码。
(2)当IR0=1时,本指令中有对DR的写操作。
(3)当IR1=1时,本指令影响标志位Z。
(4)当IR2=1时,本指令影响标志位C。
(5)NOP指令实际上是一条“MOVR0,R0”指令,只是不改变目的寄存器的内容。
附录2:
硬件构成-CPU的总体结构
实验CPU由5部分组成:
取指部分instru_fetch、指令译码部分decoder_unit、执行部分exe_unit、存储器部分memory_unit和通用寄存器组fegfile。
另外,还有一个程序包exe_cpu_components,将各低层设计实体作为元件存储,供各设计实体使用。
顶层设计实体exe_cpu完成5个组成部分的连接。
实验CPU总体框图见下图。
2.1一条指令执行需要3拍时间
t1取指。
在t2的上升沿,将从存储器取出的指令写入指令寄存器IR。
t2根据指令寄存器IR的内容进行指令译码;根据指令译码得到的控制信号(xìnhào)进行运算和其它操作。
t3存储器读、写操作(cāozuò);在t3的下降沿将运算结果写入目的寄存器,改变(gǎibiàn)C标志和Z标志(biāozhì);在t3的下降沿,改变PC的值,为取下一条指令做好准备。
由于取指阶段和存储器读写阶段都要访问存储器,速度较慢;而指令译码和运算都由CPU本身完成,因此取指阶段和存储器读写阶段各占一拍时间,指令译码和运算共占一拍时间。
2.2实验CPU的总体构成
实验CPU由5部分组成:
取指部分instru_fetch、指令译码部分decoder_unit、执行部分exe_unit、存储器部分memory_unit和通用寄存器组fegfile。
另外,还有一个程序包exe_cpu_components,将各低层设计实体作为元件存储,供各设计实体使用。
顶层设计实体exe_cpu完成5个组成部分的连接。
实验CPU总体框图见图2-1。
图2-1实验(shíyàn)CPU总体框图
1.通用寄存器组regfile
通用寄存器组内包含4个16位寄存器。
这是一个具有1个写入端口、2个读出端口的通用寄存器组。
写入端口将指令执行后得到的目的寄存器的值在t3的下降沿写入目的寄存器。
只有具有写目的寄存器功能的指令执行结束时才写目的寄存器。
有些指令,如JMP指令等执行结束后不改变通用寄存器组的值。
通用寄存器组的2个读出端口,一个是目的寄存器读出端口,一个是源寄存器读出端口,从这2个端口读出的内容供执行部分(bùfen)exe_unit和存储器部分memory_unit使用。
通用寄存器组内还有2个标志位:
z_out和c_out,在t3的下降(xiàjiàng)沿根据指令执行的结果改变或者不改变它们的值。
这2个标志位的值送执行部分exe_unit使用。
传统(chuántǒng)上通用寄存器组属运算器部分。
2.取指部分(bùfen)instru_fetch
取指部分完成4项工作:
(1)产生时钟信号t1、t2和t3,供实验CPU各部分使用。
(2)在复位信号reset为低时将PC复位为0;在一条指令执行结束后,根据指令执行的结果在t3的下降沿改变PC的值。
(3)将从存储器读出的指令的第一个字在t2的上升沿送指令寄存器IR。
(4)计算PC+1的值pc_inc,为双字指令取第二个指令字做准备。
传统上取指部分属控制器部分。
3.指令译码部分decoder_unit
指令译码部分根据指令寄存器IR的值产生实验CPU所需要的各种控制信号和其他信号:
SR源寄存器号(编址)。
DR目的寄存器号(编址)。
op_code控制ALU进行8种运算操作的3位编码。
zj_instruct为1表示本条指令是条“JNZADR”指令。
cj_instruct为1表示本条指令是条“JNCADR”指令。
lj_instruct为1表示本条指令是条“JMPADR”指令。
DRWr为1表示在t3的下降沿将本条指令的执行结果写入目的寄存器。
Mem_Write为1表示本条指令有存储器写操作,存储器的地址是源寄存器的内容。
DW_intruct为1表示本条指令是双字指令。
change_z为1表示本条指令可能改变z(结果为0)标志。
change_c为1表示本条指令本条指令可能改变c(进位)标志。
sel_memdata为1表示本条指令写入目的寄存器的值来自读存储器。
r_sjmp_addr计算条件转移指令转移地址所需要的16位相对地址。
它是由条件转移指令中的8位相对地址经过符号扩展生成的。
从上述控制信号(xìnhào)看,实验CPU的指令译码器是很简单的。
指令译码器在传统上属于控制器部分,是控制器的核心。
所谓组合逻辑控制器是指指令译码器是由组合逻辑构成的,所谓微程序控制器是指指令译码器主要由控制存储器ROM和少许组合逻辑构成的。
1.执行(zhíxíng)部分exe_unit
执行部分完成(wánchéng)下列任务:
(1)8种算术逻辑运算(yùnsuàn):
加、加1、减、减1、与、或、非和数据传送,并临时将运算结果存放在result中。
根据运算结果产生进位标志,临时存放在c_tmp中;根据运算结果产生结果为0标志,临时存放在z_tmp中。
(2)产生存储器读写所需要的存储器地址Mem_Addr。
存储器地址是根据下列情况决定的:
在t1节拍时选择pc,在双字指令时选择pc_inc,在LDR指令时选择SR(源寄存器)内容,在STR指令时选择DR(目的寄存器)内容。
(3)产生条件转移指令(JNC和JNZ)所需要的转移标志c_z_j_flag(为1表示转移)和转移地址sjmp_addr。
执行部分的核心传统上属于运算器,是运算器的核心。
2.存储器部分memory_unit
存储器部分主要完成对存储器的读写:
(1)它和TEC—CA实验台上存储器的接口部分。
向实验台上的存储器送出16存储器地址总线Mem_addr,16位双向数据总线ob,读写信号rw。
当rw为1时,实验台上的存储器作为读存储器信号处理;当rw信号为0时,实验台上的存储器作为读存储器信号处理。
实验台上的存储器由2片静态存储器6116和少量附加电路构成。
在TEC—CA实验台上,2片6116并联构成16位字长的存储器,6116所需的片选信号cs为低,读信号oe由rw反相产生,写信号we直接选用rw。
(2)存储器地址Mem_addr来自执行部分,写信号Mem_Write由指令译码部分产生。
当Mem_Write为1时在t3节拍完成写操作,其余情况下均进行读操作。
(3)在t1节拍中完成读指令的第1个字。
(4)对双字指令,在t3完成读指令的第2个字。
(5)对JMP指令,在t3读出转移地址,放在data_read中。
(6)对MVRD指令,在t3读出立即数DATA,放在data_read中。
(7)对LDR指令,在t3读出存储器的值,放在data_read中。
(8)对STR指令,在t3将源寄存器的值写入存储器中。
(9)对在t3下降沿写入目的寄存器的值进行选择。
在LDR指令中,选中读出的存储器的值;在其他指令中,选中执行部分送来的运算结果result。
实验CPU中存储器部分传统上属于控制器部分,实验台上的存储器属于计算机的存储器部分。
3.程序包exp_cpu_components
程序包exp_cpu_components把实验CPU中除顶层设计实体exp_cpu以外的设计实体作为元件(component)予以说明(shuōmíng),供实验CPU中的其它设计实体作为元件予以引用。
4.顶层设计(shèjì)实体exp_cpu
顶层设计(shèjì)实体exp_cpu把5个二级设计实体regfile、instru_fetch、decoder_unit、exe_unit和memory_unit作为元件引用,每个例化一次,用信号把它们连接起来,构成实验CPU。
exp_cpu同时(tóngshí)也定义了实验CPU对外的接口:
clk外部输入的时钟。
reset外部输入的CPU复位信号,低电平有效。
AR向外部输出的16位存储器地址总线。
OB16位双向存储器数据总线。
WE向外部输出的存储器读写信号。
当高电平时,对存储器进行读操作;当低电平时,对存储器进行写操作。
在一个工程(project)中,较低层的设计实体其实相当于元件,与一块印制板上的电路差不多;顶层设计实体对较低层设计实体每例化一次,相当于在印制板上上安放一个元件,而顶层设计实体中的信号相当于印制板上的连线。
因此,在一个工程中,如果有一个非顶层设计实体从来没有被其他设计实体例化过,那么这个设计实体在这个工程中就是多余的,起不到任何作用。
顶层设计实体中除了由较低层设计实体构成的元件外,通常还有一些由process语句、信号赋值语句等构成的其他独立电路块,通过信号把元件和独立电路块互相连接,最后形成了一个完整的电路设计。
附录3:
参考程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityinstruction_decoderis
port(IRH:
instd_logic_vector(3downto0);
c,z:
instd_logic;
op_code:
outstd_logic_vector(2downto0);--控制ALU进行8种运算操作的3位编码
c_z_j_flag:
outstd_logic;--为1表示需要条件转移
lj_instruct:
outstd_logic;--为1表示本条指令是条"JMPADR"指令
DRWr:
bufferstd_logic;--为1时写DR寄存器
Mem_Write:
outstd_logic;--为1时进行存储器读
DW_intruct:
bufferstd_logic;--为1表示本条指令是双字指令
change_z:
outstd_l