您的位置:首页 > 理论基础

计算机组成原理课程设计——简单CISC模型机设计

2018-06-02 13:57 2091 查看

 

 

 

根据《计算机组成原理课程设计》的设计要求设计能够执行一定机器指令完成指定任务的CISC模型机。

 

1、课程设计的题目和内容

 

1.1 课程设计的题目

本次课程设计中本人选题为:输入包含10个整数(有符号数)的数组M,将其分成正整数数组P和负数数组N,依次输出正数数组P中的整数及正数的个数。

 

 

 

1.2 课程设计完成的内容

 

1.完成系统的总体设计,画出模型机数据通路框图;

2.设计微程序控制器(CISC模型计算机)的逻辑结构框图;

3.设计机器指令格式和指令系统;

4.设计时序产生器电路;

5.设计所有机器指令的微程序流程图;

 

6.设计操作控制器单元;在CISC模型计算机中,设计的内容包括微指令格式(议采用全水平型微指令)、微指令代码表(根   据微程序流程图和微指令格式来设计)和微程序控制器硬件电路(包括地址转移逻辑电路、微地址寄存器、微命令寄存和控制    存储器等。具体电路根据微程序控制器的逻辑结构框图、微指令格式和微指令代码来设计)。

7.设计模型机的所有单元电路,并用VHDL语言(也可使用GDF文件----图形描述文件)对模型机中的各个部件进行编程,并使之成为一个统一的整体,即形成顶层电路或顶层文件;

 

8.由给出的题目和设计的指令系统编写相应的汇编语言源程序;

9.根据设计的指令格式,将汇编语言源程序手工转换成机器语言源程序,并将其设计到模型机中的ROM中去;

 

10.使用EDA软件进行功能仿真,要保证其结果满足题目的要求;(其中要利用EDA软件提供的波形编辑器,选择合适的输入输出信号及中间信号进行调试。)

2、系统总体设计

2.1 嵌入式CISI模型机系统总体设计

 

 

 

图2-1 CISI模型机系统

 

 

 

2.2 嵌入式CISC系统控制器的逻辑结构框图

 

 

 

图2-2 CISC系统控制器的逻辑结构框图

 

 

 

 

说明:

 

在T4内形成微指令的微地址,并访问控制存储器,在T2的上边沿到来时,将读出的微指令打入微指令寄存器,即图中的微命令寄存器和微地址寄存器。

 

2.3 模型机的指令系统和所有指令的指令格式设计

    为了完成这次课程设计的功能,本次设计设计了10条指令:IN1(输入),MOV(将一个数送入寄存器),LAD(将寄存器内容送到内存),JMP(无条件跳转),INC(自加1),DEC(自减1),JNS(大于跳转),STO1(将源寄存器值送到目标寄存器),OUT1(输出),TEST(测试),如下用到的Rs和Rd分别表示源寄存器和目的寄存器。

2.3.1机器指令格式和指令系统

 

 

指令助记符

指令格式

功能

15——12

11  10

9  8

7——0

IN1 Rd

0001

xx

Rd

xxxxxxxx

输入设备→Rd

MOV Rd,im

0010

xx

Rd

im

立即数→Rd

LAD (Rs),Rd

0011

Rs

Rd

xxxxxxxx

((Rs)) →Rd

JMP addr

0100

xx

xx

addr

addr→PC

INC Rd

0101

xx

Rd

xxxxxxxx

将(Rd)+1→Rd,锁存SF和ZF

DEC Rd

0110

xx

Rd

xxxxxxxx

将(Rd)-1→Rd,锁存SF和ZF

JNS addr

0111

xx

xx

addr

若结果小于零,addr->pc

STO1 Rs,(Rd)

1000

Rs

Rd

XXXXXXXX

(Rs) →((Rd))

OUT1 Rs

1001

Rs

xx

XXXXXXXX

(Rs) →输出设备

TEST Rd

1010

XX

Rd

XXXXXXXX

测试(Rd)是否为负,锁存SF

2.3.2 对Rs和Rd格式规定

 

 

 

 

Rs或Rd

选定的寄存器

00

R0

01

R1

10

R2

11

R3

2.3.3  算数逻辑单元ALU的功能表

 

 

 

S2

S1

S0

功能

0

0

0

X+Y,修改SF和ZF

0

0

1

X-Y,修改SF和ZF

0

1

0

Y+1,修改SF和ZF

0

1

1

Y-1,修改SF和ZF

1

0

0

X∧Y,修改SF和ZF

1

0

1

Y是否大于零,修改SF和ZF

1

1

0

Y

2.3.4  程序计数器PC的功能表

 

 

CLR

LOAD

LDPC

功能

0

X

X

将PC清0

1

0

BUS-->PC

1

1

0

不装入,也不计数

1

1

PC+1

2.3.5  时序产生器

 

 

 

 

 

本实验采用的是微程序控制器的时序产生器,如下图

 

图2-3 微程序控制器的时序关系图

 

 

2.3.6  数据的表示

 

模型机规定数据的表示采用定点整数补码表示,单字长为8位,其格式如下:

7

6     5     4     3     2     1     0

符号位

尾数

3 微程序控制器的设计全过程

3.1 微程序控制器的设计

微程序控制器的设计包括以下几个阶段:

 (1)根据微处理器结构图、指令格式和功能设计所有机器指令的微程序流程图,并确定每条微指令的微地址和后继微地址;

 (2)设计微指令格式和微指令代码表;

 (3)设计地址转移逻辑电路;

 (4)设计微程序控制器中的其它逻辑单元电路,包括微地址寄存器、微命令寄存器和控制存储器;

 

 (5)设计微程序控制器的顶层电路(由多个模块组成)。

 

  3.2地址转移逻辑电路的设计

 

 

地址转移逻辑电路是根据微程序流程图中的棱形框部分及多个分支微地址,利用微地址寄存器的异步置“1”端,实现微地址的多路转移。

由于微地址寄存器中的触发器异步置“1”端低电平有效,与µA5~µA0对应的异步置“1”控制信号SE5~SE0的逻辑表达式为:

3.3 汇编语言程序

 

 

本题目的算法思想为:输入包含10个整数(无符号数)的数组M,将其分成正整数数组P和负数数组N,依次输出正数数组P中的整数及正数的个数。

汇编程序源码及对应注释如下:

 

 

 

MOV R0,00H    ;数据存放在RAM中的地址 

MOV R1,0AH    ;循环次数计数,从0A开始,到01时结束

MOV R3,00H    ;保存正整数的个数 (L3中)

 

L1:

IN1 R2        ;输入一个数到R2中

STO1 R2,(R0)  ;将输入的数据存放到地址为(R0)的RAM中

INC R0        ;RAM地址指针+1

DEC R1        ;循环次数-1 

TEST R1       ;测试循环次数是否达到10次

JNS L1        ;R1不为负时跳转到L1

MOV R0,00H    ;当10个数输入完成后,初始化RAM指针

MOV R1,0AH    ;重置循环次数

 

L2:

LAD (R0),R2   ;将内存中地址为(R0)的数据送到R2

TEST R2       ;测试(R2)是否大于零

JNS L3        ;(R2)大于零时跳转到L3

JMP L4        ;(R2)不大于零时跳转到L4

 

L3:

OUT1 R2       ;(R2)输出

INC R3        ;正整数计数+1

 

L4:

INC R0        ;RAM地址指针+1

DEC R1        ;循环次数-1

TEST R1       ;测试循环次数是否达到10次

JNS L2        ;(R2)不为负时跳转到L2

OUT1 R3       ;输出正整数的个数

 

3.4 汇编程序流程图

 

 

 

 

 

图3-1汇编程序流程图

 

 

 

3.5 汇编程序对应的地址与机器语言代码表:

 

 

地址

(十六进制)

汇编语言源程序

机器语言源程序

(二进制)

机器语言源程序

(十六进制)

00

MOV R0,00H

0010 00 00 00000000

2000

01

MOV R1,0AH

0010 00 01 00001010

210A

02

MOV R3,00H

0010 00 11 00000000

2300

03

L1:IN1 R2

0001 00 10 00000000

1200

04

STO1 R2,(R0)

1000 10 00 00000000

8800

05

INC R0

0101 00 00 00000000

5000

06

DEC R1

0110 00 01 00000000

6100

07

TEST R1

1010 00 01 00000000

A100

08

JNS L1

0111 00 00 00000011

7003

09

MOV R0,00H

0010 00 00 00000000

2000

0A

MOV R1,0AH

0010 00 01 00001001

210A

0B

L2:LAD (R0),R2

0011 00 10 00000000

3200

0C

TEST R2

1010 00 10 00000000

A200

0D

JNS L3

0111 00 00 00001111

700F

0E

JMP L4

0100 00 00 00010001

4011

0F

L3:OUT1 R2

1001 10 00 00000000

9800

10

INC R3

0101 00 11 00000000

5300

11

L4:INC R0

0101 00 00 00000000

5000

12

DEC R1

0110 00 01 00000000

6100

13

TEST R1

1010 00 01 00000000

A100

14

JNS L2

0111 00 00 00001011

700B

15

OUT1 R3

1001 11 00 00000000

9C00

 

表3-1 汇编语言与机器语言代码表

 

3.6  微程序流程图如下所示:

 

 

 

 

 

 

 

图 3-2微程序流程图

 

3.7 微指令的设计

 

 

CISC模型机系统使用的微指令采用全水平型微指令,字长位26位,其中微命令字段位18位,P字段2位,后继微地址为6位。

 

微地址

LOAD

LDPC

LDAR

LIR

LREG

LPSW

RS_B

S2

S1

S0

ALU

IN

OUT

RW

RCS

RD

ROM

ADR_B

P1

P2

uA5~uA0

00

1

1

0

1

0

0

1

0

0

0

1

1

1

1

1

1

0

1

1

0

000000

01

1

0

0

0

1

0

1

0

0

0

1

0

1

1

1

1

1

1

0

0

000000

02

1

0

0

0

1

0

1

0

0

0

1

1

1

1

1

1

1

0

0

0

000000

03

1

0

1

0

0

0

0

0

0

0

1

1

1

1

1

1

1

1

0

0

001011

04

0

1

0

0

0

0

1

0

0

0

1

1

1

1

1

1

1

0

0

0

000000

05

1

0

0

0

1

1

1

0

1

0

0

1

1

1

1

1

1

1

0

0

000000

06

1

0

0

0

1

1

1

0

1

1

0

1

1

1

1

1

1

1

0

0

000000

07

1

0

0

0

0

0

1

0

0

0

1

1

1

1

1

1

1

1

0

1

000000

08

1

0

1

0

0

0

1

1

1

0

0

1

1

1

1

1

1

1

0

0

001100

09

1

0

0

0

0

0

0

0

0

0

1

1

0

1

1

1

1

1

0

0

000000

0A

1

0

0

0

0

1

1

1

0

1

0

1

1

1

1

1

1

1

0

0

000000

0B

1

0

0

0

1

0

1

0

0

0

1

1

1

1

0

0

1

1

0

0

000000

0C

1

0

0

0

0

0

0

0

0

0

1

1

1

0

0

1

1

1

0

0

000000

10

0

1

0

0

0

0

1

0

0

0

1

1

1

1

1

1

1

0

0

0

000000

 

 

 

 

表 3-2 微指令代码表

4  MAX+plus Ⅱ软件编译仿真测试和结果分析

 

 

4.1 嵌入式模型计算机的顶层电路图

 

 

图 4-1 CISC模型计算机的顶层电路图

如图4-1中,其中的操作控制器单元crom的内部结构如下图所示

 

 

 

图 4-2 控制器单元crom的内部结构图

 

如图4-2中寄存器AA的内部结构如下所示,AA的内部是由6个MM构成的。

 

 

图 4-3 寄存器AA内部结构图

 

图 4-3 寄存器AA内部结构图

4.2 编译仿真测试和结果分析

 

 

 

 

    通过创建仿真时序图top.scf.,可以实现模型机的功能仿真,从图中可以看出cpu处理数据和数据的具体流向的每一个过程,如下是仿真的输出波形,具体结果和分析如下:

 

 

 

图 4-4 仿真结果图1

 

 

 

如图4-4所示,在图4-4中CLK为时钟信号,INBUS[7..0]是输入中线,OUTBUS[7..0]是输出总线,IROUT是操作指令,寄存器R0,寄存器R1,寄存器R2,寄存器R3。

从总线INBUS[7..0]输入的10个数分别为 50H、40H、FCH、10H、23H、FEH、25H、25H、00H、FDH。输出结果为:50H、40H、10H、23H、25H、25H、06H(正整数个数为6)

 

结果过程分析

图 4-5 仿真结果图2

 

 

 

由图4-5所示,IROUT=2000、IROUT=210A和IROUT=2300时执行MOV指令,将00H送入寄存器R0,将0AH送入寄存器R1,将00H送入寄存器R0。IROUT=1200时执行IN1指令将50H输入寄存器R2;IROUT=8800时执了STO1指令,将R2的内容送到RAM;IROUT=5000时执行了INC指令,R0自加1;IROUT=6100时执行了DEC指令,R1自减1;IROUT=A100时执行了TEST指令,测试R1是否大于零;IROUT=7003时执行了JNS指令(跳转条件是SF=0,ZF=0),由于此时R1自减1之后为08H大于零所以跳转1200执行IN1指令,如此循环了10次,完成10个数据的输入。

 

 

 

 

图 4-6 仿真结果图3

 

 

 

图 4-7仿真结果图4

由图4-6所示,输入完数据以后,可以看见R1寄存器的值为00,IROUT=7003执行JNS指令不跳转;IROUT=2000、IROUT=210A时执行MOV指令,将00H送入寄存器R0,将0AH送入寄存器R1;IROUT=3200时执行LAD指令,将地址为(R0)的内存的内容送到寄存器R2;IROUT=A200时执行TEST指令,测试(R2)是否大于零;IROUT=700F时执JNS指令,此时(R2)大于零,跳转9800;IROUT=9800时执行OUT1指令输出(R2),在数据输出线OUTBUS[7..0]显示为50。IROUT=5300时执行INC指令,R3自加1;IROUT=5000时执行了INC指令,R0自加1;IROUT=6100时执行了DEC指令,R1自减1;IROUT=A100时执行了TEST指令,测试R1是否大于零;IROUT=700B时执行了JNS指令,跳转到3200执行LAD指令,如此循环测试完10个数。

 

由图4-7所示,测试的整数是负数FC,IROUT=700F时执JNS指令,此时(R2)小于零不做跳转;IROUT=4011时执行JMP指令,无条件跳转到IROUT=5000执行INC指令,R0自加1。

图 4-8仿真结果图5

第二组测试的10个数据分别为 FFH、11H、FCH、50H、02H、FEH、0FH、84H、00H、98H。输出结果为:11H、50H、02H、0FH、04H(正整数个数为4)。

经过多次的不同数据测试,结果都与预期的结果相符合,没有出现错误。

 

 

 

 

附录

 

 

 

     

 

代码设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_SIGNED.ALL;

ENTITY ALU IS

PORT

(

X:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

Y:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

S2,S1,S0:IN STD_LOGIC;

ALUOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

SF,ZF:OUT STD_LOGIC

);

END ALU;

ARCHITECTURE A OF ALU IS

SIGNAL AA,BB,TEMP:STD_LOGIC_VECTOR(7 DOWNTO0);

SIGNAL TEMP1:STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

PROCESS

BEGIN

 

IF(S2='0' AND S1='0' AND S0='0')THEN

AA<=X;

BB<=Y;

TEMP<=AA+BB;

ALUOUT<=TEMP(7 DOWNTO 0);

SF<=TEMP(7);

IF(TEMP="00000000")THEN

ZF<='1';

ELSE

ZF<='0';

END IF;

 

ELSIF(S2='0'AND S1='0' AND S0='1')THEN

ALUOUT<=X-Y;

IF(X<Y)THEN

SF<='1';

ZF<='0';

ELSIF(X=Y)THEN

SF<='0';

ZF<='1';

ELSE

SF<='0';

ZF<='0';

END IF;

 

ELSIF(S2='0' AND S1='1' AND S0='0')THEN

BB<=Y;

TEMP<=BB+1;

ALUOUT<=TEMP(7 DOWNTO 0);

SF<=TEMP(7);

IF(TEMP="00000000")THEN

ZF<='1';

ELSE

ZF<='0';

END IF;

 

ELSIF(S2='0' AND S1='1' AND S0='1')THEN

BB<=Y;

TEMP<=BB-1;

ALUOUT<=TEMP(7 DOWNTO 0);

SF<=TEMP(7);

IF(TEMP="00000000")THEN

ZF<='1';

ELSE

ZF<='0';

END IF;

ELSIF(S2='1' AND S1='0' AND S0='0') THEN     --AND

AA<=X;

BB<=Y;

TEMP1<=AA AND BB;

ALUOUT<=TEMP1(7 DOWNTO 0);

SF<=TEMP1(7);

IF (TEMP1="00000000") THEN

ZF<='1';

ELSE

ZF<='0';

END IF;

ELSIF(S2='1' AND S1='0' AND S0='1') THEN     --TEST

BB<=Y;

TEMP1<= BB;

SF<=TEMP1(7);

IF (TEMP1="00000000") THEN

ZF<='1';

ELSE

ZF<='0';

END IF;

ELSIF(S2='1' AND S1='1' AND S0='0') THEN     --Rd->BUS

ALUOUT<=Y;

ELSE

ALUOUT<="00000000" ;

SF<='0';

ZF<='0';

END IF;

END PROCESS;

END A;

 

 

 

 

代码设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ROM IS

PORT(

   DOUT:OUT STD_LOGIC_VECTOR(15 DOWNTO 0);

   ADDR:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

   CS_I:IN STD_LOGIC

   );

END ROM ;

ARCHITECTURE A OF ROM IS

BEGIN

DOUT<=

"0010000000000000"WHENADDR="00000000"AND CS_I='0' ELSE

"0010000100001010"WHENADDR="00000001"AND CS_I='0' ELSE

"0010001100000000"WHENADDR="00000010"AND CS_I='0' ELSE

"0001001000000000"WHENADDR="00000011"AND CS_I='0' ELSE

"1000100000000000"WHENADDR="00000100"AND CS_I='0' ELSE

"0101000000000000"WHENADDR="00000101"AND CS_I='0' ELSE

"0110000100000000"WHENADDR="00000110"AND CS_I='0' ELSE

"1010000100000000"WHENADDR="00000111"AND CS_I='0' ELSE

"0111000000000011"WHENADDR="00001000"AND CS_I='0' ELSE

"0010000000000000"WHENADDR="00001001"AND CS_I='0' ELSE

"0010000100001010"WHENADDR="00001010"AND CS_I='0' ELSE

"0011001000000000"WHENADDR="00001011"AND CS_I='0' ELSE

"1010001000000000"WHENADDR="00001100"AND CS_I='0' ELSE

"0111000000001111"WHENADDR="00001101"AND CS_I='0' ELSE

"0100000000010001"WHENADDR="00001110"AND CS_I='0' ELSE

"1001100000000000"WHENADDR="00001111"AND CS_I='0' ELSE

"0101001100000000"WHENADDR="00010000"AND CS_I='0' ELSE

"0101000000000000"WHENADDR="00010001"AND CS_I='0' ELSE

"0110000100000000"WHENADDR="00010010"AND CS_I='0' ELSE

"1010000100000000"WHENADDR="00010011"AND CS_I='0' ELSE

"0111000000001011"WHENADDR="00010100"AND CS_I='0' ELSE

"1001110000000000"WHENADDR="00010101"AND CS_I='0' ELSE

"0000000000000000";

END A;

 

 

 

代码设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY CONVERT IS

PORT(

  IRCODE:IN STD_LOGIC_VECTOR(15 DOWNTO 0);

OP:OUT STD_LOGIC_VECTOR(3DOWNTO 0);

I11,I10,I9,I8:OUT STD_LOGIC;

A:OUT STD_LOGIC_VECTOR(7DOWNTO 0)

 

);

END CONVERT;

ARCHITECTURE A OF CONVERT IS

BEGIN

   OP<=IRCODE(15 DOWNTO 12);

   I11<=IRCODE(11);

   I10<=IRCODE(10);

   I9<=IRCODE(9);

   I8<=IRCODE(8);

   A<=IRCODE(7 DOWNTO 0);

END A;

 

代码设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CONTROM IS

PORT(

     ADDR:IN STD_LOGIC_VECTOR(5 DOWNTO 0);

     UA:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);

     D:OUT STD_LOGIC_VECTOR(19 DOWNTO 0)

   );

END CONTROM;

ARCHITECTURE A OF CONTROM IS

SIGNALDATAOUT:STD_LOGIC_VECTOR(25 DOWNTO 0);

BEGIN

    PROCESS(ADDR)

     BEGIN

       CASE ADDR IS

WHEN"000000"=>DATAOUT<="11010010001111110110000000";

WHEN"000001"=>DATAOUT<="10001010001011111100000000";

WHEN"000010"=>DATAOUT<="10001010001111111000000000";

WHEN"000011"=>DATAOUT<="10100000001111111100001011";

WHEN"000100"=>DATAOUT<="01000010001111111000000000";

WHEN"000101"=>DATAOUT<="10001110100111111100000000";

WHEN"000110"=>DATAOUT<="10001110110111111100000000";

WHEN"000111"=>DATAOUT<="10000010001111111101000000";

WHEN"001000"=>DATAOUT<="10100011100111111100001100";

WHEN"001001"=>DATAOUT<="10000000001101111100000000";

WHEN"001010"=>DATAOUT<="10000111010111111100000000";

WHEN"001011"=>DATAOUT<="10001010001111001100000000";

WHEN"001100"=>DATAOUT<="10000000001110011100000000";

WHEN"010000"=>DATAOUT<="01000010001111111000000000";

WHEN OTHERS=>DATAOUT<="10000011111111110100000000";

   END CASE;

   UA(5 DOWNTO 0)<=DATAOUT(5 DOWNTO 0);

   D(19 DOWNTO 0)<=DATAOUT(25 DOWNTO 6);

END PROCESS;

END A;

 

代码设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY ADDR IS

PORT(

    I15,I14,I13,I12:IN STD_LOGIC;

    SF,ZF,T4,P1,P2:IN STD_LOGIC;

    SE5,SE4,SE3,SE2,SE1,SE0:OUT STD_LOGIC

    );

END ADDR;

ARCHITECTURE A OF ADDR IS

BEGIN

    SE5<='1';

    SE4<=NOT((NOT ZF)AND(NOT SF) AND P2 AND T4);

    SE3<=NOT(I15 AND P1 AND T4);

    SE2<=NOT(I14 AND P1 AND T4);

    SE1<=NOT(I13 AND P1 AND T4);

    SE0<=NOT(I12 AND P1 AND T4);

END A;

 

 

 

代码设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY MCOMMAND IS

PORT(

     T2,T3,T4:IN STD_LOGIC;

     O:IN STD_LOGIC_VECTOR(19 DOWNTO 0);

    P1,P2,LOAD,LDPC,LDAR,LDIR,LDRI,LDPSW,RS_B,S2,S1,S0,

    ALU_B,SW_B,LED_B,RD_D,CS_D,RAM_B,CS_I,ADDR_B:OUT STD_LOGIC 

    );

END  MCOMMAND;

ARCHITECTURE A OF MCOMMANDIS

SIGNALDATAOUT:STD_LOGIC_VECTOR(19 DOWNTO 0);

BEGIN

PROCESS(T2)

    BEGIN

        IF(T2'EVENT AND T2='1') THEN

             DATAOUT(19 DOWNTO 0)<=O(19DOWNTO 0);

        END IF;

        LOAD<=DATAOUT(19);

        LDPC<=DATAOUT(18) AND T4;

        LDAR<=DATAOUT(17) AND T3;

        LDIR<=DATAOUT(16) AND T3;

        LDRI<=DATAOUT(15) AND T4;

        LDPSW<=DATAOUT(14) AND T4;

        RS_B<=DATAOUT(13);

        S2<=DATAOUT(12);

        S1<=DATAOUT(11);

        S0<=DATAOUT(10);

        ALU_B<=DATAOUT(9);

        SW_B<=DATAOUT(8);

        LED_B<=DATAOUT(7);

        RD_D<=NOT(NOT DATAOUT(6) AND (T2 ORT3));

        CS_D<=NOT(NOT DATAOUT(5) AND T3);

        RAM_B<=DATAOUT(4);

        CS_I<=DATAOUT(3);

        ADDR_B<=DATAOUT(2);

        P1<=DATAOUT(1);

        P2<=DATAOUT(0);

    END PROCESS;

 

END A;

 

 

代码设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY PC IS

PORT(

    LOAD,LDPC,CLR:IN STD_LOGIC;

    D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

    O:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

    );

END PC;

ARCHITECTURE A OF PC IS

SIGNALQOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

    PROCESS(LDPC,CLR,LOAD)

BEGIN

    IF(CLR='0')THEN

    QOUT<="00000000";

ELSIF(LDPC'EVENT ANDLDPC='1')THEN

IF(LOAD='0')THEN

    QOUT<=D;

ELSE

    QOUT<=QOUT+1;

END IF;

END IF;

END PROCESS;

O<=QOUT;

END A;

 

 

 

代码设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY IR IS

PORT(

    D:IN STD_LOGIC_VECTOR(15 DOWNTO 0);

    CLK:IN STD_LOGIC;

    O:OUT STD_LOGIC_VECTOR(15 DOWNTO 0)

    );

END IR;

ARCHITECTURE A OF IR IS

BEGIN

    PROCESS(CLK)

    BEGIN

        IF(CLK'EVENT AND CLK='1')THEN

            O<=D;

        END IF;

    END PROCESS;

END A;

 

 

 

代码设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY PSW IS

PORT(

    S,Z:IN STD_LOGIC;

    LDPSW:IN STD_LOGIC;

    SF,ZF:OUT STD_LOGIC

    );

END PSW;

ARCHITECTURE A OF PSW IS

BEGIN

    PROCESS(LDPSW)

    BEGIN

        IF(LDPSW'EVENT AND LDPSW='1')THEN

            SF<=S;

            ZF<=Z;

        END IF;

    END PROCESS;

END A;

 

 

 

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY LS273 IS

PORT(

    D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

    CLK:IN STD_LOGIC;

    O:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

    );

END LS273;

ARCHITECTURE A OF LS273 IS

BEGIN

       PROCESS(CLK)

       BEGIN

          IF(CLK'EVENT AND CLK='1')THEN

            O<=D;

          END IF;

      END PROCESS;

 

END A ;

 

 

代码设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY DECODER IS

PORT(

    I9,I8:IN STD_LOGIC;

    Y0,Y1,Y2,Y3:OUT STD_LOGIC

    );

END DECODER;

ARCHITECTURE A OF DECODER IS

BEGIN

    PROCESS(I9,I8)

    BEGIN

        IF(I9='0' AND I8='0')THEN

            Y0<='1';

            Y1<='0';

            Y2<='0';

            Y3<='0';

        ELSIF(I9='0' AND I8='1')THEN

            Y0<='0';

            Y1<='1';

            Y2<='0';

            Y3<='0';

        ELSIF(I9='1' AND I8='0')THEN

            Y0<='0';

            Y1<='0';

            Y2<='1';

            Y3<='0';

        ELSE

            Y0<='0';

            Y1<='0';

            Y2<='0';

            Y3<='1';

        END IF;

    END PROCESS;

END A;

 

 

说明:先绘制AA,再绘制MM,最后绘制整个操作控制器单元crom。

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: