计算机组成原理课程设计

  1. 设计任务
  1. 指令:12号、30号、41号、46号58号指令设计;
  2. 模型机硬件:寄存器组R0-R3设计与实现;
  3. 数字电路:奇偶发生器74LS180设计与实现;
  1. 设计总要求

总线结构:单总线,数据总线位数8位、地址总线8位;

存储器:内存容量64K*8bit l

控制器:用硬联线控制器实现26位微操作控制信号 l

运算器:单累加器,实现加、减等8种操作 l

外设:n

输入:用开关输入二进制量n

输出:7段数码管和LED显示 l

指令系统规模:64条指令,7种类型,5种寻址方式

三、设计报告的内容

  1. 设计题目与设计任务
  1. 指令系统设计

表1:指令系统设计

编号

指令

机器码1

机器码 2

注            释

12

ADDC  A,  #II

001010

I I

将立即数II加入累加器A中带进位

30

MOV  A,  @R?

011101

 

将间址存储器的值送到累加器A中

41

JC      MM

101000

MM

当进位标志R_CY=1时,跳转到MM地址

46

CMP   A,  R?

101101

 

比较A与R?是否相等,即A-R,置标志位Z

58

CPL    A

111001

 

寄存器A 取反,再放入累加器A中

  1. 模型机硬件设计:寄存器组R0-R3

图1:寄存器组原理图

  1. 奇偶发生器74LS180:9位奇偶产生器/校验器

74ls180有8个数据位(A~H)及一个奇偶位(ODD,EVEN)。通过级联可拓展字长。

引出端符号:

A~H:数据输入端

EVEN:偶控制输入端

FEV:偶输出端

FOD:奇输出端

ODD:奇控制输入端    

  1. 前言(绪论)(设计的目的、意义等)
  1. 设计的目的主要是回顾课本和实际设计的训练,指令的设计是对计算机组成原理实验课的复习和应用。
  2. 用VHDL硬件描述语言实践设计寄存器组R0-R3,可以培养学生的动手实践能力,增强对计算机硬件组成与连线的认识,了解片选寄存器和寄存器的具体构造。
  3. 对奇偶产生器74LS180的设计可以同样帮助学生理解计算机芯片组成,提高电路设计能力。
  1. 设计主体(各部分设计内容、分析、结论等)

系统设计

  1. 模型机逻辑框图

图2:模型机逻辑框图

  1. 芯片引脚图

图3:芯片引脚图

  1. CPU逻辑结构框图

图4:CPU逻辑结构框图

 

  1. 指令系统设计

表2:指令系统设计

编号

指令

指令类型

寻址方式

12

ADDC  A,  #II

算术运算指令

立即数寻址

30

MOV  A,  @R?

数据传送指令

寄存器间接寻址

41

JC      MM

程序跳转控制类指令

存储器直接寻址

46

CMP   A,  R?

逻辑运算指令

寄存器直接寻址

58

CPL    A

逻辑运算指令

累加器寻址

 

  1. 微操作控制信号

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:将数据总线DBUS上的地址打入地址寄存器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做何种运算

 

  1. 指令执行流程

表3:指令执行流程

编号

助记符

功能

机器码

周期总数CT

节拍数

微操作

控制信号

涉及的硬件

 

1

_FATCH_

取指令

000000XX

010

T0

PC→MAR

PCOE MAREN

PC, MAR , EM, W , IR

T1

EM→W

EMEN EMRD WEN

T2

W→IR

PC + 1→PC

IREN

12

 

 

ADDC  A,  #II

将立即数II加入累加器A中带进位

 

 

001010

I I

101

T3

PC→MAR

PCOE MAREN

PC, MAR, EM, W, A,ALU, F

T4

EM→DBUS→W PC+1→PC

EMRD EMEN WEN

T5

A,W→ALU→F ALU→A

FEN AEN

30

 

 

MOV  A,  @R?

将间址存储器的值送到累加器A中

011101

101

T3

R?→MAR

PCOE MAREN

PC, MAR, EM, W, DBUS, R

T4

EM→DBUS→W PC+1→PC

EMRD EMEN WEN

T5

W→DBUS→A

S()

41

JC      MM

当进位标志R_CY=1时,跳转到MM地址

101000MM

110

R_CY=1

PC→MAR

PCOE

MAREN

PC,MAR,EM,,DBUS, W,ST

T3

T4

EM→PC

PC+1→PC

EMEN

EMRD

ELP

R_CY=0

PC+1→PC

 

T3

46

CMP  A,  R?

比较A与R?是否相等,即A-R,置标志位Z

101101

011

 

T3

R?→W

RRD,WEN

PC, MAR, EM, W,

 

T4

A→W

S2S1S0(001),

FEN(R_ZF)

58

CPL    A

寄存器A 取反,再放入累加器A中

111001XX

011

T3

Not A->A

AEN,S=100

A,

ALU

 

图5:指令流程图

(5)组合逻辑控制器设计

EMRD=M0*T1+M1*INS37*T5+M1*(INS8+INS37)*T4

POCE=M0*T2+M1*(INS37*T6+INS8*T5)

EMEN=M0*T1+M1*(INS37*T5+INS8*T4)

IREN=M0*T0

MAREN=M0*T2+M1*INS37*T6+M1*(INS8+INS37)*T5

RRD=M1*INS9*T4

WEN=M0*T1+M1*(INS8+INS9+INS37)*T4+M1*INS37*T3

AEN=M0*T1+M1*T3

X=M1*T3*(INS8+INS9+INS58)*(100)

S=M1*T3*(IINS8*(000)+INS9*(100)+INS58*(110)

其他信号逻辑表达式恒为假。

(6)微程序控制器设计

微指令格式分为 3 个字段:

微命令字段:26 位,对应 26 个微信号(采用直接控制法)。

操作控制字段:1 位,用于控制下址的形成。

下址字段:8 位,对应 256 个微指令。

微命令字段(26位)

P0

A7A6A5A4A3A2A1A0

 

系统实现

  1. 模型机实现
  1. 逻辑电路的图形符号表示、功能            

图6:单个寄存器(原理图)

图7:设计后实现效果图

 

图8:寄存器组R0-R3电路图(原理图)

 

图9:实现的效果图

 

 

功能是传输(输入输出)以及暂存。工作原理是通过片选选择一个寄存器,00/01/10/11分别对应四个寄存器。

 

  1. 指令所涉及的微操作控制信号

D为数据输入(d_input[7:0])

R为数据输出(DR_data[7:0]、SR_data[7:0])

CLK为时序控制,有统一的时钟信号

EN为读写控制端(DRWr)

RST为复位端(reset),清零

Sel为片选信号

  1. 系统实现

模型机硬件:寄存器组R0-R3设计与实现

library IEEE;

use IEEE.STD_LOGIC_1164.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 regfile is

Port (   DR: in std_logic_vector(1 downto 0);

SR: in std_logic_vector(1 downto 0);   

reset:   in std_logic;

DRWr:    in std_logic;                           

clk: in std_logic;

d_input: in  std_logic_vector(7 downto 0);

DR_data: out std_logic_vector(7 downto 0);        

SR_data:   out std_logic_vector(7 downto 0)   

  );

end regfile;





architecture struct of regfile is

-- components

-- 8 bit Register for register file

component reg

port (

clr: in std_logic;

D: in std_logic_vector(7 downto 0);

clock: in std_logic;

write:  in std_logic;

    sel: in std_logic;

Q: out std_logic_vector(7 downto 0)

);

end component;



-- 2 to 4 Decoder

component  decoder_2_to_4

    port(

sel: in  std_logic_vector(1 downto 0);

sel00: out std_logic;

sel01: out std_logic;

sel02: out std_logic;

sel03: out std_logic

);

end component;



-- 4 to 1 line multiplexer

component mux_4_to_1

port (

input0,

input1,

input2,

input3:  in std_logic_vector(7 downto 0);

sel:  in std_logic_vector(1 downto 0);

out_put: out std_logic_vector(7 downto 0));

end component;





signal reg00, reg01, reg02, reg03

            :std_logic_vector(7 downto 0);



signal sel00 ,sel01 ,sel02 ,sel03

            : std_logic;



begin

Areg00: reg port map(

clr =>  reset,

D => d_input ,

clock => clk ,

write => DRWr ,

    sel => sel00 ,

Q =>  reg00

);



Areg01: reg port map(

clr =>  reset,

D => d_input ,

clock => clk ,

write => DRWr ,

    sel => sel01 ,

Q =>  reg01

);



Areg02: reg port map(

clr =>  reset,

D =>  d_input ,

clock => clk ,

write => DRWr ,

    sel => sel02 ,

Q =>  reg02

);



Areg03: reg port map(

clr =>  reset,

D => d_input ,

clock => clk ,

write => DRWr ,

    sel => sel03 ,

Q =>  reg03

);



-- decoder

des_decoder: decoder_2_to_4 port map

(

sel => DR,

     sel00 => sel00 ,

sel01 => sel01 ,

sel02 => sel02 ,

sel03 => sel03

);



mux1: mux_4_to_1 PORT MAP(

Input0 => reg00 ,

    Input1 => reg01 ,

Input2 => reg02 ,

Input3 => reg03 ,

sel => DR ,

out_put => DR_data

);



mux2: mux_4_to_1 PORT MAP(

input0 => reg00 ,

    input1 => reg01 ,

input2 => reg02 ,

input3 => reg03 ,

sel => SR ,

out_put => SR_data

);



end struct;

测试激励文件:

library ieee;

use ieee.std_logic_1164.all;

entity reg is

port

(

clr: in std_logic;

D:   in std_logic_vector(7 downto 0);

clock: in std_logic;

write: in std_logic;

    sel: in std_logic;

Q:   out std_logic_vector(7 downto 0)

);



end reg;



architecture behav of reg is

begin

process(clr,clock)

begin

if clr = '0' then

Q <= x"00";

elsif (clock'event and clock = '1') then

if sel = '1' and write = '1' then

Q <= D;

end if;

end if;

end process;

end behav;

  1. 逻辑电路设计

图10:图形符号表示

实现的功能是:取反

Verilog HDL描述:

`timescale 1ns / 1ns
module Even_Odd ( d ,even ,odd );

input [0:8] d ;
wire [0:8] d ;

output even ;
wire even ;
output odd ;
wire odd ;

wire [0:3]e;
wire [0:1]f;
wire h;

not
xodd (odd, even);

xor
x0 (e[0], d[0], d[1]),
x1 (e[1], d[2], d[3]),
x2 (e[2], d[4], d[5]),
x3 (e[3], d[6], d[7]),

xf0 (f[0], e[0], e[1]),
xf1 (f[1], e[2], e[3]),

xh0 (h, f[0], f[1]),
xeven (even, h, d[8]);

endmodule

测试文件:

`timescale 1ns / 1ns

module Even_Odd_tb;

//Internal signals declarations:

reg [0:8]d;

wire even,odd;

// Unit Under Test port map

Even_Odd UUT (

.d(d),

.even(even),

.odd(odd));

initial

begin:TEST

reg [0:8] pal;

begin

for (pal = 0; pal< 256; pal = pal +1)

begin

#10;

d = pal;

end

end

end

endmodule

 

【系统测试】

(一)、模型机测试

    1. 功能仿真

图11:仿真波形图

    1. RTL级逻辑电路

图12:RTL级逻辑电路

 

结论:显然上面的波形图是错误的,应该实现的效果是

图13:理论效果图

由于RST为1,虽然D端输入数据为:1111100010101011,输出端仍为0(从波形可以看出来),EN为0,表示写数据。而下面的RTL级电路图实现了片选操作。

(二)硬件测试

1、功能仿真

图15:Zoom fit

图16:Zoom in

图17:Zoom out

2、RTL级逻辑电路

图18:RTL级逻辑电路

结论:根据波形图,显然实现了取反功能,对rtl电路图分析,是通过异或门取反的,原理是A异或1都为A取反的结果。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章