計算機組成原理課程設計——簡單CISC模型機設計

 

 

 

根據《計算機組成原理課程設計》的設計要求設計能夠執行一定機器指令完成指定任務的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。