
东北大学秦皇岛分校计工学院
计算机组成与结构课程设计
指令系统及译码器设计
| 专业名称 | 计算机科学与技术 |
| 班级学号 | |
| 学生姓名 | |
| 指导教师 | |
| 设计时间 |
题目:16位模型机设计-指令系统及译码器设计
1、指令系统设计:
本次课程设计要设计的指令使第5、19、29、34号指令,要清楚各条指令的功能、指令类型、寻址方式等内容,本次设计用到指令的相关内容如表1所示。
表1 本次要设计的指令
| 指令编号 | 助记符 | 指令类型 | 功能 | 寻址方式 |
5 | ADD A, R? | 算术运算指令 | 将寄存器R?的值加入累加器A中 | 直接寻址 |
19 | SUBC A,MM | 算术运算指令 | 从累加器A中减去MM地址的值,减进位 | 直接寻址 |
29 | MOV A,R? | 逻辑运算指令 | 将寄存器R?的值送到累加器A中 | 直接寻址 |
34 | MOV @R?, A | 逻辑运算指令 | 将累加器A的值送入间址存储器中 | 间接寻址 |
题目:模型机硬件设计—— 主存地址寄存器MAR设计
MAR是主存和CPU之间的接口,可以接收由程序计数器(PC)的指令地址或来自运算器的操作数的地址,以确定要访问的单元。
3、逻辑电路设计:
题目: 八进制可逆计数器设计
根据计数控制信号的不同,在时钟脉冲作用下,计数器可以进行加1或者减1操作的一种计数器。可逆计数器有一个特殊的控制端,这就是up端。当up='1'时,计数器进行加1操作,当up='0'时,计数器就进行减1操作。
【系统设计】
1、模型机逻辑框图(整机逻辑框图、芯片引脚及CPU逻辑框图如下图1、图2、图3所示)
图1 整机逻辑框图
图2 芯片引脚
图3 CPU逻辑框图
2、指令系统设计
指令类型及寻址方式见表1。
3、微操作控制信号
1、XRD :外部设备读信号,当给出了外设的地址后,输出此信号,从指外设读数据。
2、EMWR:程序存储器EM写信号。
3、EMRD:程序存储器EM读信号。
4、PCOE:将程序计数器PC的值送到地址总线ABUS上(MAR)。
5、 EMEN:将程序存储器EM与数据总线DBUS接通,由EMWR和EMRD 决定是将DBUS数据写到EM中,还是从EM读出数据送到DBUS。
6、 IREN:将程序存储器EM读出的数据打入指令寄存器IR。
7、 EINT:中断返回时清除中断响应和中断请求标志,便于下次中断。
8、 ELP:PC打入允许,与指令寄存器IR3、IR2位结合,控制程序跳转。
9、 FSTC:进位置1,CY=1
10、FCLC:进位置0,CY=0
11、MAREN:将地址总线ABUS上的地址打入地址寄存器MAR。
12、MAROE:将地址寄存器MAR的值送到地址总线ABUS上。
13、OUTEN:将数据总线DBUS上数据送到输出端口寄存器OUT里。
14、STEN:将数据总线DBUS上数据存入堆栈寄存器ST中。
15、RRD:读寄存器组R0-R3,寄存器R?的选择由指令的最低两位决定。
16、RWR:写寄存器组R0-R3,寄存器R?的选择由指令的最低两位决定。
17、CN:决定运算器是否带进位移位,CN=1带进位,CN=0不带进位。
18、FEN:将标志位存入ALU内部的标志寄存器。
19、WEN:将数据总线DBUS的值打入工作寄存器W中。
20、AEN:将数据总线DBUS的值打入累加器A中。
21-23: X2~ X0:X2、X1、X0三位组合来译码选择将数据送到DBUS上的寄存器。
24-26: S2~ S0:S2、S1、S0三位组合决定ALU做何种运算。
4、指令执行流程
| 编号 | 助记符 | 功能 | 机器码 | 周期总数CT | 节拍数 | 微操作 | 控制信号 | |
| 0 | _FATCH_ | 取指令 | 000000XX | 010 | T2 | PC→MAR | PCOE MAREN | |
| T1 | EM→W | EMEN EMRD WEN | ||||||
| T0 | W→IR PC+1->PC | IREN | ||||||
| 5 | ADD A, R? | 将寄存器R?的值加入累加器A中 | 000100XX | 100 | T4 | R?->W | RRD,X2~X0,WEN | |
| T3 | ALU(A+W)->DBUS DBUS->A | S2~S0,X2~X0, AEN,CN=0,FEN | ||||||
| 19 | SUBC A, EM | 从累加器A中减去间址存储器的值,带进位 | 010010XX | 111 | T7 | PC->MAR | PCOE,MAREN | |
| T6 | EM->MAR PC+1->PC | EMEN,EMRD, MAREN | ||||||
| T5 | EM->MAR | EMEN,EMRD, MAREN | ||||||
| T4 | EM->W | EMEN,EMRD, WEN | ||||||
| T3 | ALU(A-W)->DBUS DBUS->A | S2~S0,X2~X0, AEN,CN=1,FEN | ||||||
29 | MOV A,R? | 将R?中的值送入A中 | 011100XX | 100 | T4 | R?->W | RRD,X2~X0,WEN | |
| T3 | W->A | AEN | ||||||
34 | MOV @R?, A | 将累加器A的值送入间址存储器中 | 100001XX | 101 | T4 | R?->DBUS->MAR | X2~X0 RRD,MAREN | |
| T3 | A->EM | EMEN | ||||||
开始
T2 PCOE;MAREN
T1 EMEN;EMRD;WEN
T0 IREN
ADD A, R? SUBC A, EM MOV A,R? MOV @R?, A
T4
T7 T4 T4
T3
T6 T5 T3 T3
T5
T4 T3
T3
【系统实现】
1、模型机实现(主存地址寄存器MAR的实现)
(1)逻辑电路的图形符号表示、功能
主存地址寄存器MAR电路图形符号如图5所示:
图5 主存地址寄存器MAR图形符号表示
主存地址寄存器MAR的功能如表3(其中cp作为时钟,pcoe,maren,pcadr,dadr是输入端,marout是输出端,pcoe=1表示将程序计数器PC地址输入到寄存器MAR中, maren=1表示将数据总线中的地址输入到寄存器MAR中,当pcoe=0,maren=0,寄存器输出0000):
表3 程序计数器PC的功能表
| 输入端 | 输出端 | |||
| pcoe | maren | pcadr | dadr | marout |
| 1 | 0 | 1010 | 0100 | 1010 |
| 0 | 0 | 0110 | 1000 | 0000 |
| 0 | 1 | 1011 | 0111 | 0111 |
(2)指令所涉及的微操作控制信号
PCOE:将程序计数器PC的值送到主存地址寄存器MAR上。
MAREN:将数据总线DBUS的值送到主存地址寄存器MAR上。
(3)系统实现
实现主存地址寄存器MAR的VHDL源代码:
library IEEE;
use IEEE.STD_LOGIC_11.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity z is
Port ( cp : in STD_LOGIC;
pcoe : in STD_LOGIC;
maren : in STD_LOGIC;
pcadr : in STD_LOGIC_VECTOR(3 DOWNTO 0);
dadr : in STD_LOGIC_VECTOR(3 DOWNTO 0);
marout : out STD_LOGIC_VECTOR(3 DOWNTO 0));
end z;
architecture Behavioral of z is
signal mout:STD_LOGIC_VECTOR(3 DOWNTO 0);
begin
process(pcoe,maren,pcadr,dadr) is
begin
if(pcoe='0' and maren='0') then
mout<="0000";
else if(pcoe='1')then
mout<=pcadr;
else if(maren='1')then
mout<=dadr;
end if;
end if;
end if;
end process;
marout<=mout;
end Behavioral;
2、逻辑电路设计(八进制可逆计数器的设计)
(1)逻辑电路的图形符号表示、功能
八进制可逆计数器的电路图形符号如图6所示:
图6 八进制可逆计数器图形符号表示
功能:clk为计数器时钟信号,rst为复位信号,高电平有效,当rst为低电平时,计数器不计数,当为高电平时,开始计数,en为计数器的使能端(高电平计数器工作),up为可逆控制信号,当up为高电平时,递增计数,当up为低电平时,递减计数,sum是计数器的输出端,cout是计数器在计数一个周期后翻转一次,使计数器的一个周期更为清晰。
(2)指令所涉及的微操作控制信号
八进制可逆计数器用到的控制信号就是clk,rst,en,up是控制计数器的工作状态和输出,当clk为上升沿时,计数器根据其他控制信号开始计数,功能表如表4如下:
表4 八进制可逆计数器功能表
当up=0,计数器递减计数:
| 控制信号 | 输出端 | ||||
| clk | rst | en | up=0 | sum | cout |
| 0 | 1 | 0 | 000 | 1 | |
| 1 | 1 | 0 | 111 | 0 | |
| 1 | 1 | 0 | 110 | 0 | |
| 1 | 1 | 0 | 101 | 0 | |
| 1 | 1 | 0 | 100 | 0 | |
| 1 | 1 | 0 | 011 | 0 | |
| 1 | 1 | 0 | 011 | 0 | |
| 1 | 1 | 0 | 010 | 0 | |
| 1 | 1 | 0 | 001 | 0 | |
| 1 | 1 | 0 | 000 | 1 | |
| 控制信号 | 输出端 | ||||
| clk | rst | en | up=1 | sum | cout |
| 0 | 1 | 1 | 000 | 0 | |
| 1 | 1 | 1 | 001 | 0 | |
| 1 | 1 | 1 | 010 | 0 | |
| 1 | 1 | 1 | 011 | 0 | |
| 1 | 1 | 1 | 100 | 0 | |
| 1 | 1 | 1 | 101 | 0 | |
| 1 | 1 | 1 | 110 | 0 | |
| 1 | 1 | 1 | 111 | 1 | |
| 1 | 1 | 1 | 000 | 0 | |
| 1 | 1 | 1 | 001 | 0 | |
实现八进制可逆计数器的VHDL源代码如下:
Library ieee;
Use ieee.std_logic_11.all;
Use ieee.std_logic_unsigned.all;
Entity up_down is
Port(clk,rst,en,up: in std_logic;
Sum: out std_logic_vector(2 downto 0);
Cout: out std_logic);
End up_down;
Architecture a of up_down is
Signal count: std_logic_vector(2 downto 0);
Begin
Process(clk,rst)is
Begin
If rst='0' then
Count<=(others=>'0');
Elsif rising_edge(clk) then
If (en='1') then
Case up is
When '1' => count<=count+1;
When others =>count<=count-1;
End case;
End if;
End if;
End process;
Sum<=count;
Cout <='1' when en='1' and ((up='1' and count=7) or (up='0' and count=0)) else '0';
End a;
【系统测试】
(一)、模型机测试(主存地址寄存器MAR测试)
1、功能仿真
仿真时用到的输入波形如图7所示:
图7 仿真时用到的输入波形图
仿真得到的波形图如图8所示:
图8 主存地址寄存器MAR仿真结果波形图
结果分析:从图8中可以看出主存地址寄存器MAR的各个输入端的在每一时刻得到的输出都与表3主存地址寄存器的功能表中期待的输出一致,所以程序主存地址寄存器MAR的设计是正确的。
2、RTL级逻辑电路
主存地址寄存器MAR的RTL级电路图如图9、图10、图11所示:
图9 主存地址寄存器MAR RTL级电路图
图10 主存地址寄存器MAR RTL级电路图
图10 主存地址寄存器MAR 详细电路图
(二)硬件测试(八进制可逆计数器测试)
1、功能仿真
八进制可逆计数器仿真用到的输入波形如图12所示:
图12八进制可逆计数器仿真时的输入波形
仿真得到的结果波形如图13所示:
图13 仿真得到的结果波形图
结果分析:对照得到的结果波形图图12和八进制可逆计数器的功能表表4可以看出,得到的结果和功能所期望的结果一样,所以此设计是正确的。
2、RTL级逻辑电路
八进制可逆计数器的RTL级逻辑电路如下各图所示:
图 14 八进制可逆计数器的内部芯片图
图 15 八进制可逆计数器的芯片图
图16 八进制可逆计数器芯片控制端连接逻辑图
图17 八进制可逆计数器片内部的逻辑图
【总结与体会】
此次课程设计遇到了好多问题,特别是软件的安装和使用问题,仿真软件ModelSim安装好后老是打不开,装了好多次都不行,经过不断地查找资料终于找到是因为license.dat文件设置的错误;还有就是Xilinx ISE软件没法调用仿真软件ModelSim进行仿真,解决的办法是因为新建文件时没有选用用ModelSim软件仿真选项;还有就是建好测试波形进行测试时,Process中没有ModelSim Simulator选项,本以为是软件的错误就有进行了安装,可是还是这个样子,后来不经意点了一下Sources中的那个波形文件,ModelSim Simulator选项就出来了。还有就是进行测试时要选择合适的波形文件然后调用仿真软件进行仿真,否则得到的波形图是红线,就是错误的。
【参考资料】
[1] 袁静波,丁顺利,王和兴,宋欣 . 计算机组成与结构[M] .北京:机械工业出版社,2011.
[2] 胡越明 . 计算机组成与设计[M] . 北京:科学出版社,2006.
[3] 王爱英 . 计算机组成与结构[M] . 北京:清华大学出版社,2007.
熟悉实验设备、收集资料:2 天
设计图纸、实验、计算、程序编写调试:5 天
编写课程设计报告:2 天
答辩:1 天
