计算机组成原理设计实现CU.docx
《计算机组成原理设计实现CU.docx》由会员分享,可在线阅读,更多相关《计算机组成原理设计实现CU.docx(15页珍藏版)》请在冰豆网上搜索。
计算机组成原理设计实现CU
计算机组成原理大作业——设计实现控制单元CU
微程序设计控制单元的主要任务是编写对应各条机器指令的微程序,具体步骤是:
1、首先写出对应机器指令的全部微操作及节拍安排;
2、然后确定微指令格式
3、最后编写出每条微指令的二进制代码(称为微指令码点)。
写出对应机器指令的微操作及节拍安排
不考虑间接寻址和中断的情况。
下面分别按取指阶段和执行阶段列出其微操作序列。
(1)取指阶段的微操作及节拍安排
T0PC->MAR,1->R
T1M(MAR)->MDR,(PC)+1->PC
T2MDR->IR,OP(IR)->微地址形成部件
(编码器:
指令码->微地址)
(此步为组合逻辑,自动完成,不需要控制信号)
(2)执行阶段的微操作及节拍安排
执行阶段的微操作由操作码性质而定,同时也需要考虑下地址的形成问题。
1)CLA指令
T00->AC
2)COM指令
T0~AC->AC
3)SHR指令
T0L(AC)->R(AC),AC0->AC0
4)CSL指令
T0R(AC)->L(AC),AC0->ACn
5)STP指令
T00->G
6)ADD指令
T0Ad(IR)->MAR,1->R
T1M(MAR)->MDR
T2(AC)+(MDR)->AC
7)STA指令
T0Ad(IR)->MAR,1->W
T1AC->MDR
T2MDR->M(MAR)
8)LDA指令
T0Ad(IR)->MAR,1->R
T1M(MAR)->MDR
T2MDR->AC
9)JMP指令
T0Ad(IR)->PC
10)BAN指令
T0A0*Ad(IR)+~A0*(PC)->PC
确定微指令格式
微指令的格式包括微指令的编码方式、下地址的形成方式和指令字长3方面。
(1)微指令的编码方式
直接编码。
具体如下表。
第0位表示控制PC->MAR
第1位表示控制1->R
第2位表示控制M(MAR)->MDR
第3位表示控制(PC)+1->PC
第4位表示控制MDR->IR
第5位表示控制0->AC
第6位表示控制~AC->AC
第7位表示控制L(AC)->R(AC),AC0->AC0
第8位表示控制R(AC)->L(AC),AC0->ACn
第9位表示控制0->G
第10位表示控制Ad(IR)->MAR
第11位表示控制(AC)+(MDR)->AC
第12位表示控制1->W
第13位表示控制AC->MDR
第14位表示控制MDR->M(MAR)
第15位表示控制MDR->AC
第16位表示控制Ad(IR)->PC
第17位表示控制A0*Ad(IR)+~A0*(PC)->PC
(2)下地址形成方式
采用微指令的下地址字段和指令的操作码编码两种形成方式。
设置一控制位,0表示前一种方式,1表示后一种方式,作为二路数据选择器的控制端输入。
第18位表示控制下地址形成方式0表示选择顺序控制字段1表示选择操作码编码结果
(3)微指令字长
假设模型机存储字长和指令字长均为16位,地址字长为8位。
采用16位定长指令,操作码为前5位,中间3位保留,地址码为后8位。
指令系统如下:
18个微操作,19条微指令。
不考虑指令系统的扩充,操作控制字段取18位(0~17),下地址控制字段取1位(18),顺序控制字段(下地址)取5位(19~23)。
确定CU的输入输出
输入:
OP操作码,CLK时钟信号
输出:
18位控制信号
确定CU各部件内部逻辑
(1)CMDR
24位寄存器。
(2)微地址形成部件
5位。
操作码左移1位末位补零,形成微程序入口地址。
(3)多路选择
5位2选1多路选择器,A18为控制输入端。
(4)控制存储器
24位×32个存储单元的ROM。
附带5-32译码器。
学习用VHDL借助Xilinx软件实现CU
学习流程大致如下:
(1)画出CU各部件连接图,同课本418页图14.16。
(2)阅读博客,了解VHDL语言的功能、语法、设计思路,以及Xilinx的安装、使用。
(3)寻找CU各部件单独实现的代码,借助已有代码的语法结构,修改以实现自己需要的功能。
对于过程中出现的错误,通过XX出的技术博客、英文原版的标准库说明、同学的经验,一一解决。
(4)学习编写testbench,同样也是找相似的代码,读懂,仿照着写出自己的测试要求。
(5)元件调用。
各模块编写完成后,通过XX学习元件调用的方法,从网上优秀课件中找到元件实例化的语法、用法,最终实现整个CU各模块的协同工作。
(6)整个过程都反复的在看VHDL的系统讲解,一开始没有实例,系统讲解不知所云何物,随着在实例中碰到各种问题,再回过头看理论讲解,才不断有所收获。
大约反复5~7遍,可以大体上了解VHDL语言的各个要素以及编写思想。
代码及仿真波形
代码
(1)微地址形成部件
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity uaddr_gen is
Port ( op :
in STD_LOGIC_VECTOR (4 downto 0);
op_add :
out STD_LOGIC_VECTOR (4 downto 0));
end uaddr_gen;
architecture Behavioral of uaddr_gen is
begin
process(op) begin
op_add <= op(3 downto 0)&'0';
end process;
(2)5位2选1多路选择器
library IEEE;
use IEEE.STD_LOGIC_1164.ALL,IEEE.NUMERIC_STD.ALL;
entity MUX is
PORT(
mode :
IN STD_LOGIC; 输入控制信号
next_add:
IN STD_LOGIC_VECTOR(4 DOWNTO 0); 5位下地址数据端
op_addr :
IN STD_LOGIC_VECTOR(4 DOWNTO 0); 5位微程序入口地址数据端
out_add :
OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); 5位下地址输出
end MUX;
architecture Behavioral of MUX is
signal tmp:
STD_LOGIC;
begin
tmp <= mode;
process(tmp,next_add,op_addr) begin
case tmp is
when'0'=>out_add<=next_add;
when others=>out_add<=op_addr;
end case;
end process;
end Behavioral;
(3)控制存储器
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.ALL; CONV_INTEGER
entity ROM is
Port ( add :
in STD_LOGIC_VECTOR (4 downto 0);
data_out :
out STD_LOGIC_VECTOR (0 to 23));
end ROM;
architecture Behavioral of ROM is
type microcode_array is array(28 downto 0) of std_logic_vector(0 to 23);
constant code :
microcode_array:
=(
0=> "110000000000000000000001",
1=> "001100000000000000000010",
2=> "0000100000000000001UUUUU",
4=> "000001000000000000000000",
6=> "000000100000000000000000",
8=> "000000010000000000000000",
10=> "000000001000000000000000",
12=> "000000000100000000000000",
14=> "010000000010000000001111",
15=> "001000000000000000010000",
16=> "000000000001000000000000",
18=> "000000000010100000010011",
19=> "000000000000010000010100",
20=> "000000000000001000000000",
22=> "010000000010000000010111",
23=> "001000000000000000011000",
24=> "000000000000000100000000",
26=> "000000000000000010000000",
28=> "000000000000000001000000",
others=>"000000000000000000000000");
begin
data_out <= code(conv_integer(add));
end Behavioral;
(4)CMDR
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity CMDR is
GENERIC(n :
Positive :
= 24); size of counter/shifter
Port (
clock :
IN Std_logic; serial inputs
u_op :
in STD_LOGIC_VECTOR (0 TO (n1));
control :
out STD_LOGIC_VECTOR (0 TO 17);
mode_sel:
out STD_LOGIC;
next_add :
out STD_LOGIC_VECTOR (4 DOWNTO 0));
end CMDR;
architecture Behavioral of CMDR is
SIGNAL int_reg :
Std_logic_vector(0 TO 23);
BEGIN
main_proc :
PROCESS
BEGIN
WAIT UNTIL rising_edge(clock);
int_reg <= u_op;
END PROCESS;
connect internal register to dataout port
control <= int_reg(0 TO 17);
mode_sel<= int_reg(18);
next_add <= int_reg(19 TO 23);
end Behavioral;
(5)总的CU
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity CU is
Port ( clk :
in STD_LOGIC;
op_code :
in STD_LOGIC_VECTOR (4 downto 0);
ctrl_signal :
out STD_LOGIC_VECTOR (17 downto 0));
end CU;
architecture Behavioral of CU is
component CMAR
GENERIC(n :
Positive :
= 24); size of counter/shifter
Port (
clock :
IN Std_logic; serial inputs
u_op :
in STD_LOGIC_VECTOR (0 TO (n1));
control :
out STD_LOGIC_VECTOR (0 TO 17);
mode_sel:
out STD_LOGIC;
next_add :
out STD_LOGIC_VECTOR (4 DOWNTO 0));
end component;
component uaddr_gen
Port ( op :
in STD_LOGIC_VECTOR (4 downto 0);
op_add :
out STD_LOGIC_VECTOR (4 downto 0));
end component;
component MUX
PORT(
mode :
IN STD_LOGIC; 输入控制信号
next_add:
IN STD_LOGIC_VECTOR(4 DOWNTO 0); 5位下地址数据端
op_addr :
IN STD_LOGIC_VECTOR(4 DOWNTO 0); 5位微程序入口地址数据端
out_add :
OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); 5位下地址输出
end component;
component ROM
Port ( add :
in STD_LOGIC_VECTOR (4 downto 0);
data_out :
out STD_LOGIC_VECTOR (0 to 23));
end component;
signal op_add_MUX:
std_logic_vector(4 downto 0);
signal mode_MUX :
std_logic;
signal next_add_MUX:
std_logic_vector(4 downto 0);
signal MUX_CM :
std_logic_vector(4 downto 0);
signal CM_CMAR :
std_logic_vector(0 to 23);
begin
u1:
uaddr_gen port map(op_code, op_add_MUX);
u2:
MUX port map(mode_MUX, next_add_MUX, op_add_MUX, MUX_CM);
u3:
ROM port map(MUX_CM, CM_CMAR);
u4:
CMAR port map(clk, CM_CMAR, ctrl_signal, mode_MUX, next_add_MUX);
end Behavioral;