計算機組成原理課程設計之設計RISC處理器

 

 

 

組成系統實驗(硬件)

 

 

 

題目:設計一臺嵌入式RISC模型機

 

 

 

 

    號:    072031108      

    名:     劉同來        

指導教師:   陳智勇老師     

    業: 計算機應用技術  

 

 

 

日期:2008530

 

 

1 實驗題目... 3

2 嵌入式RISC模型機數據通路框圖... 4

3.操作控制器的邏輯框圖... 5

4.模型機的指令系統和所有指令的指令格式... 6

4.1 指令格式... 6

4.2 數據格式... 7

4.3 指令系統... 7

5 所有機器指令的CPU操作流程圖... 8

6.嵌入式RISC模型計算機的頂層電路圖... 9

7 彙編語言源程序... 11

7.1算法簡單描述:... 11

7.2彙編程序... 11

8 機器語言源程序... 13

9 時序仿真波形圖... 15

10.故障現象和故障分析... 17

11.學習體會... 17

參考文獻... 18

附錄:軟件源程序... 18

1 ALU單元源程序... 18

2 狀態條件寄存器單元源程序... 19

3 暫存器、通用寄存器、地址寄存器、指令寄存器單元源程序... 20

4 1:2分配器單元源程序... 20

5 三選一選擇器單元源程序... 21

6 四選一單元源程序... 22

7 程序計數器單元源程序... 22

8 ROM16單元源程序... 23

9 RAM單元源程序... 25

10 時序產生器單元源程序... 26

11 選擇從PC或者BUS中讀入數據到AR的二選一選擇器單元源程序... 27

12 選擇對ROM或者RAM進行操作的二選一選擇器單元源程序... 27

13 MODE_CONTROL中央控制器單元源程序... 28

 

 

 

 

 

 

1 實驗題目

設計一臺嵌入式RISC模型機,採用定長CPU週期,要求具有以下驗證程序所要求的功能:

要求:輸入包含10個整數(補碼錶示)的數組M,將其分成正數數組P和負數數組N,依次輸出正數數組P中的整數及正數的個數。

 

2 嵌入式RISC模型機數據通路框圖

嵌入式RISC模型機

2-1模型機數據通路框圖

 

3.操作控制器的邏輯框圖

啓動

停止

時鐘

復位

...

Mk

M1

T1

...

Ti

 

 

     

B1

Bj

狀態反饋信息

指令譯碼器

I1

Im

指令寄存器IR

具有時間標誌的操作控制信號

 

 

組合邏輯線路

 

 

 

節拍電位/節拍脈衝

         發生器

啓動

3-1 操作控制器的邏輯框圖

 

4.模型機的指令系統和所有指令的指令格式

4.1 指令格式

爲了完成輸入包含10個整數(補碼錶示)的數組M,將其分成正數數組P和負數數組N,依次輸出正數數組P中的整數及正數的個數的功能。本系統設計了9條指令:

IN1  接收外部設備輸入的數據送到目的寄存器;

MOV:將一個立即數送目的寄存器;

MOVRM:將源寄存器中的數據存儲到目的寄存器所指向的地址單元;

MOVMR:將源寄存器所指向的地址單元中的數送入目的寄存器;

CMP: 源寄存器中的數和目的寄存器中的數進行比較並置狀態寄存器FZFC值,鎖存;

INC: 將目的寄存器中的數據自加1

JB  有條件轉移指令(小於轉移),判斷狀態寄存器中FCFZ的值,若FC=1FZ=0(表示在上一條指令中,比較的結果爲小於),則轉移到指定行,否則順序執行。

JMP: 無條件轉移指令.轉移到指定行

OUT1: 將源寄存器數據輸出到LED

下面系統中採用的九條指令及其格式,其中Rs爲源寄存器,Rd爲目的寄存器。

1I/O指令

輸入(IN1)指令採用單字節指令,其格式如下:

7    6    5     4

3     2

1    0

操作碼

×   ×

Rd

輸出(OUT1)指令採用單字節指令,其格式如下:

7    6    5     4

3     2

1    0

操作碼

Rs

×  ×

2)轉移指令(“地址”中的值就是要轉移的地址值)

無條件轉移指令(JMP)採用雙字節指令,其格式如下:

7    6    5     4

3     2        1     0

操作碼

×    ×       ×   ×

    

條件轉移指令(JB)採用雙字節指令,其格式如下:

7    6    5     4

3     2        1     0

操作碼

×    ×       ×   ×

    

3MOV指令

MOV指令採用雙字節指令,其格式如下:

7    6    5     4

3     2

1    0

操作碼

×  ×

Rd

     

4MOVRMMOVMR指令

MOVRM,MOVMR指令採用單字節指令,其格式如下:

7    6    5     4

3     2

1    0

操作碼

Rs

Rd

5)自增指令

自增1指令(INC)採用單字節指令,其格式如下:

7    6    5     4

3     2

1    0

操作碼

×  ×

Rd

6)比較指令

     比較指令(CMP)採用單字節指令,其格式如下:

7    6    5     4

3     2

1    0

操作碼

Rs

Rd

7)對RsRd的規定:

RsRd

選定的寄存器

0    0

R0

0    1

R1

1    0

R2

4.2 數據格式

  模型機規定數據的標識採用定點補碼標識,且字長爲8位,其格式如下

7  

6    5     4     3     2    1    0

符號位

尾數

4.3 指令系統

  本模型機共有9條指令,下表列出了每條指令的格式、彙編符號和指令功能。

助記符號

指令格式

   

IN1   Rd

1  0  0  0

××

Rd

接收數據存到Rd寄存器

CMP   Rs Rd

1  1  0  0

Rs

Rd

(Rs)-(Rd),鎖存CYZI

MOV  Rd
,  Data

1  0  0  1

××

Rd

Data

data Rd

MOVRM  Rs, [Rd]

0  1  0  1

Rs

Rd

(Rs) ((Rd))

MOVMR [Rs], Rd

1  0  1  0

Rs

Rd

((Rs)) Rd

INC   Rd

1  1  0  1

××

Rd

(Rd)+1 Rd

JB    addr

1  0  1  1

××××

addr

若小於,則addr PC

JMP   addr

1  1  1  0

××××

addr

addr PC

OUT1  Rs

1  1  1  1

Rs

××

Rs→ LED

4.1 指令系統格式表

5 所有機器指令的CPU操作流程圖

機器指令的CPU操作流程圖是根據模型機的硬件設計、指令系統、所有指令的解釋過程和控制信號的時序設計出來的,如圖5.1所示。圖中每一個方框執行的時間爲一個時鐘週期(或稱T週期),四個T週期爲一個節拍電位。由於每條指令的執行的時間最多爲兩個節拍電位,因此在VHDL軟件中用一個觸發器M的狀態來表示目前處於哪一個節拍電位(在第一個節拍電位時,M0;在第二個節拍電位時M1)。

CS_I

ID_RM=0,

SW_B=1,CS=0

LDRD

RS_B=0,Led_B=1

WR_FEN2=1

SW_B=1,WR=0

CS=1,CS_D

WE=0

CS_DWR=1

ID_RM=1

SW_B=1

CS=0,LDRD

CS_I

ID_RM=0

SW_B=1,CS=0

LOAD=0,LDPC

S1=1,S0=0,CS=1

ALU_B=0,LED_B=1

WR_FEN2=1

SW_B=1,LDRD

IID_PC=1

LDAR

LDPC

LDAD=1

ID_PC=1

LDAR

LDPC

LDAD=1

Rs_B=0

LED_B=0

WR_FEN2=0

Rd-B=0,LED_B=1WR_FEN2=1,

SW_B=1,CS=1

,LDAC↑

CMP Rs,Rd

Rs_B=0,LED_B=1

WR_FEN2=1

SW_B=1,CS=1

LDAC

Rd-B=0,Led_B=1

WR_FEN2=1

SW_B=1,CS=1

ID_PC=0,LDAR↑

LDAR↑

 

Rs-B=0,Led_B=1

WR_FEN2=1

SW_B=1,CS=1

ID_PC=0,LDAR

LDAR↑

ID_PC=1

LDAR↑

LDPC↑,LOAD=1

S1=0,S0=1

LDFR

Rd-B=0,LED_B=1

WR_FEN2=1

SW_B=1,CS=1,LDDR↑

SW_B=0

LDRD

ID_PC=1,LDAR↑,LDPC↑,LOAD=1

CS_I,ID_RM=0,SW_B=1,CS=0,LDIR

PCAR ,  PC+1

RD  M , BUSIR

指令譯碼

SWBUS

BUSRd

RdBUS

BUSAR

PCAR

PC+1

 

PCAR

PC+1

RdBUS

BUSAC

ROMBUS

BUSPC

AC+1BUS

BUSRd

IN1 Rd

 

MOV Rd
,data

JMP addr

MOVMR [Rs],Rd

OUT1 Rs

MOVRM Rs,[Rd]

RsBUS

BUSAR

 

RsLED

ROMBUS

BUSRd

RsBUS

WR  RAM

 

RD RAM

BUSRd

 

5.1 機器指令CPU操作流程圖

Rs→BUS

BUSAC

PCAR

PC+1

FCFZ

 

RD ROM

BUSPC

FZ=0,CS_I

RE=0,ID_RM=0

SW_B=1,CS=0,

LDPC,LOAD=0

RdBUS

BUSDR

AC-DR

鎖存FCFZ

JB addr

INC Rd

6.嵌入式RISC模型計算機的頂層電路圖

頂層電路圖由一個輸入(INPUT)和一個輸出(OUTPUT),以及七個寄存器(R0R1R3ARIRACDR),兩個二選一選擇器(MUX2_PC,MUX2_RM),一個三選一選擇器(MUX3),一個ALU運算器,一個計數器PC,一個時序產生器,一個狀態條件寄存器,一個一分二分配器,一個ROM存儲器、一個RAM存儲器和中央控制器組成,如下圖(圖6.1)所示。

其中二選一選擇器MUX2_PC實現將PCBUS數據送ARMUX2_RMRAMROM數據送三選一選擇器,再送內部數據總線。中間3個寄存器,從上向下依次編號爲R0R1R2,用來暫存數據和交換數據之用,初始R0用於接收10個數存入RAM,然後再用R0作爲遊標指向10個數據RAM中首地址,R1R2分別用於數據傳遞。而MODE_CONTROL則是本系統的核心之一:譯碼與控制模塊。指令序列存儲在ROM裏面,數據存儲在RAM中,分爲正數存儲區、負數存儲區以及所有10個原數據存儲區。PC是計數器,COUNTER是時序產生器. ALU爲加法計算器,FR爲狀態條件寄存器。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6.1  頂層設計原理圖

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7 彙編語言源程序

7.1算法簡單描述:

1.      R1接收數據,R0爲遊標,指向12H開始的RAM中連續的10個存儲空間的首地址

2.      R0下移,並與1CH比較判斷是否已經輸入10個數據。

3.      R1指針回指到10個原數據的首地址開始取數,讀數進行正負判斷,爲正數則輸出並將其保存到00H起始的存放正數的內存單元,並將正數存儲單元中下一個待存數的地址寫回1DH存儲單元 中,負數則直接另存到以09H爲首地址的存儲單元中,同樣存入數後將下一個待存數的地址寫回到1EH存儲單元中。

4.      R01CH比較判斷是否已將10個數據全部讀完,取完輸出1DH存儲單元中正數計數器值即爲正數個數

 

輸入包含10個整數(補碼錶示)的數組M,存放在1CH開始的10個存儲單元中,00H向後的9個地址用來保存正數數組P09H向後的9個地址用來保存負數數組N12H向後的10個地址用來保存輸入的所有數即數組M1DH用來存放正數尾地址,同時也作爲正數計數器,1EH用來指向負數尾地址, R0爲遊標,指向數組M

注:由於內存開闢32個存儲單元時,MEM才能在仿真圖中調出,幫將保存正數和負數的空間修改爲9個存儲單元。

 

7.2彙編程序

Mov R0,12H         數據組M內存起始地址送R0

L1: IN1 R1         R1用於接收數據

MovRM R1,[R0]      (R1)->((R0))

INC R0             R0指針下移

Mov R2,1CH         1CH->R2

CMP R0,R2          判斷是否已經將10個數據輸完

JB L1              小於說明未達到10個數繼續接收數據,否則向下執行初始化工作。

Mov R1,1DH          1DH->R1,保存正數存儲單元中下一個待存數據的地址

Mov R2,00H          00H->R2

MovRM R2,[R1]       (R2)->((R1)),1D存儲單元初始化爲00H

Mov R1,1EH          1EH->R1,保存負數存儲單元中下一個待存數據的地址

Mov R2,09H          09H->R2

MovRM R2,[R1]       (R2)->((R1)),1D存儲單元初始化爲09H

Mov R0,12H          R0指針回指到數組M的首地址,用於讀數的遊標

L2: Mov R1,80H          80H->R1

MovMR [R0],R2       ((R0))->R2

CMP R2,R1           比較正負

JB L3               小於80H爲正數,跳轉L3執行

Mov R1,1EH          1EH->R1,取負數存儲單元當前地址值

MovMR [R1],R2       ((R1))->R2, 負數存儲單元當前地址值送R2

MovMR [R0],R1       ((R0))->R1,當前數送R1

MovRM R1,[R2]       (R1)->((R2)),當前負數送R2指向的負數存儲單元當前地址中

INC R2              (R2)+1->R2, 負數存儲單元當前地址加一

Mov R1,1EH          1EH->R1,負數計數器地址送R1

MovRM R2,[R1]       負數地址塊中待存數的地址回送到1EH存儲單元中

JMP L4              跳轉到L4

L3: OUT1 R2             輸入當前正數

Mov R1,1DH          1DH->R1正數計數器地送R1,取正數當前待存地址

MovMR [R1],R2       ((R1))->R2,正數存儲區當前待存數地址送R2

MovMR [R0],R1       ((R1))->R1,當前數送R1

MovRM R1,[R2]       (R1)->((R2)),當前數保存到R2指向的內存單元

INC R2              (R2)+1->R2

Mov R1,1DH          正數計數器地址1DH->R1

MovRM R2,[R1]       正數存儲區下一個待存數據的地址保存到1DH

L4:INC R0            指向所有數的遊標下移

Mov R1,1CH          1CH->R1,用於判斷是否已經取完10個數

CMP R0,R1           比較取數遊標與1CH

JB L2               小於則未取完10個數,否則取正數計數器值,輸出正數個數

Mov R1,1DH          正數計數器地址1DH->R1

MovMR [R1],R2       正數計數器值送R2

OUT1 R2             輸出正數個數

 

8 機器語言源程序

根據設計的指令格式,將彙編語言源程序手工彙編成機器代碼

如下表:

助記符

地址(十六進制)

機器代碼

功能

Mov R0,12H       

00

10010000

12->R0

 

01

00100000

 

L1: IN1 R1      

02

10000001

(SW)->R1

MovRM R1,[R0]     

03

01010100

(R1)->((R0))

INC R0           

04

11010000

(R0)+1->R0

Mov R2,1CH        

05

10010010

1C->R2

 

06

00101010

 

CMP R0,R2        

07

11000010

(R0)-(R2),鎖存CYZI

JB L1             

08

10110000

若小於,L1->PC

 

09

00000010

 

Mov R1,1DH        

0A

10010001

1D->R1

 

0B

00110000

 

Mov R2,00H        

0C

10010010

00->R2

 

0D

00000000

 

MovRM R2,[R1]     

0E

01011001

(R2)->((R1))

Mov R1,1EH        

0F

10010001

1E->R1

 

10

00110001

 

Mov R2,09H       

11

10010010

09->R2

 

12

00010000

 

MovRM R2,[R1]    

13

01011001

(R2)->((R1))

Mov R0,12H         

14

10010000

12->R0

 

15

00100000

 

L2: Mov R1,80H

16

10010001

80->R1

 

17

10000000

 

MovMR [R0],R2     

18

10100010

((R0))->(R2)

CMP R2,R1         

19

11001001

(R2)-(R1),鎖存CYZI

JB L3              

1A

10110000

L3->PC

 

1B

00100111

 

Mov R1,1EH         

1C

10010001

1E->R1

 

1D

00110001

 

MovMR [R1],R2     

1E

10100110

((R1))->R2

MovMR [R0],R1     

1F

10100001

((R0))->R1

MovRM R1,[R2]      

20

01010110

(R1)->((R2))

INC R2             

21

11010010

(R2)+1->R2

Mov R1,1EH         

22

10010001

1E->R1

 

23

00110001

 

MovRM R2,[R1]      

24

01011001

(R2)->((R1))

JMP L4            

25

11100000

L4->PC

 

26

00110001

 

L3: OUT1 R2           

27

11111000

(R2)->LED

Mov R1,1DH         

28

10010001

1D->R1

 

29

00110000

 

MovMR [R1],R2     

2A

10100110

((R1))->R2

MovMR [R0],R1     

2B

10100001

((R0))->R1

MovRM R1,[R2]     

2C

01010110

(R1)->((R2))

INC R2             

2D

11010010

(R2)+1->R2

Mov R1,1DH        

2E

10010001

1D->R1

 

2F

00110000

 

MovRM R2,[R1]      

30

01011001

()->(())

L4:INC R0            

31

11010000

(R0)+1->R0

Mov R1,1CH        

32

10010001

1C->R1

 

33

00101010

 

CMP R0,R1         

34

11000001

 

JB L2             

35

10110000

L2->PC

 

36

00010110

 

Mov R1,1DH        

37

10010001

1D->R1

 

38

00110000

 

MovMR [R1],R2    

39

10100110

((R1))->R2

OUT1 R2          

3A

11111000

(R2)->LED

8-1機器機器語言源程序

 

9 時序仿真波形圖

在仿真輸出波形圖上,挑選顯示的項爲QCLR, PC, AR, IR, R0,R1,R2, MEM, INPUT[7..0]以及OUTPUT[7..0]Q設置爲時鐘脈衝,CLR清零信號除開始一小段時間爲低電平之外,其餘時間均爲高電平。

下面進行仿真輸入,在IR值爲81處對應的INPUT輸入口輸入一組排序數,輸入數據90020381820684850987

輸入:

輸出:

內存:

9.1 仿真波形圖

 

9.2 仿真輸出波形圖

可以通過OUTPUT觀察輸出數據或者從內存MEM可以看出是否正確

OUTPUT輸出結果爲:02 03 06 09 04 其中最後一個數爲正數個數

MEM中得結果如下

正數數組:02 03 06 09

負數數組: 90 81 82 84 85 87

所有數: 90 02 03 81 82 06 84 85 09 87

顯然可以看出結果正確。

10.故障現象和故障分析

1.MEM在仿真波形圖中無法調出

解決辦法:RAM64128個存儲單元時都不會出現MEM, 只有改爲32個存儲單元纔可以在仿真波形圖中調出MEM

2.Project does not fit in specified device[s]

解決辦法:未分配硬件設備目標芯片。選擇菜單”Assign”->”Device”->”ACEX1K”->”ep1k30tc144-a”

3.彙編程序只執行了一半

解決辦法:查看中央控制器代碼,發現將JMP控制信號寫錯

4.unexpected end- of –file –try using the Text Editor’s Syntax Coloring command to find the missing delimiter or keyword

解決辦法:在對應的行上加上右括號

11.學習體會

本實驗內容是設計一臺嵌入式RISC模型機,與本科時CISC模型機相比,有一定的複雜度,當然在這短暫的幾個星期的實驗中,我在陳智勇老師的指導和同學們的耐心幫助之下成功完成了本次實驗,並得到了辦好的實驗結果,學到了很多方面的知識,對計算機系統結構,VHDL等相關的資料的學習,掌握了設計軟件MAX+plus II的使用。通過本次實驗的設計,使我對計算機系統結構有了進一步的瞭解,也對RISC模型微處理器的設計以及其內部運作有了一個初步的理解。本實驗的算法設計我想到了三種方法,唯獨最後的一種方法既節省了寄存器,又節省了較少的指令條數,當然事事並無完美之處,在我的程序中,增加了讀存和寫存的過程,犧牲了時間的基礎上實現的。

最後,對給予我細心指導的陳智勇老師和同學們表示衷心的感謝。

 

參考文獻

[1]陳智勇 編.  計算機組成系統實驗.  桂林電子工業學院計算機系.  200209

[2]潘鬆,王國棟 編著.  VHDL實用教程.  電子科技大學出版社.  200102

[3]白中英 編.  《計算機組成原理》.  科學出版社.  199710

[4] David A. Patterson,John L. Hennessy 計算機體系結構量化研究方法 機械工業出版社 20029

[5]曾繁泰 編 VHDL程序設計 清華大學出版社 20013

 

附錄:軟件源程序

1 ALU單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ALU IS

PORT(

       A:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       B:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       S1,S0:IN STD_LOGIC;

       BCDOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

       CY,ZI:OUT STD_LOGIC

 

);

END ALU;

ARCHITECTURE A OF ALU IS

SIGNAL AA,BB,TEMP:STD_LOGIC_VECTOR(8 DOWNTO 0);

BEGIN

       PROCESS(S1,S0)

       BEGIN

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

                     AA<='0'&A;

                     BB<='0'&B;

                     TEMP<=AA+BB;

                     BCDOUT<=TEMP(7 DOWNTO 0);

                     CY<=TEMP(8);

                     IF(TEMP="100000000") THEN

                            ZI<='1';

                     ELSE

                            ZI<='0';

                     END IF;

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

                     BCDOUT<=A-B;

                 IF(A<B) THEN

                            CY<='1';

                            ZI<='0';

                     ELSIF(A=B) THEN

                            CY<='0';

                            ZI<='1';

                     ELSE

                            CY<='0';

                            ZI<='0';

                     END IF;

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

                     AA<='0'&A;

                     TEMP<=AA+1;

                     BCDOUT<=TEMP(7 DOWNTO 0);

                     CY<=TEMP(8);

                     IF(TEMP="100000000") THEN

                            ZI<='1';

                     ELSE

                            ZI<='0';

                     END IF;

              ELSE

                     BCDOUT<="00000000";

                     CY<='0';

                     ZI<='0';

              END IF;

       END PROCESS;

END A;

 

2 狀態條件寄存器單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY LS74 IS

PORT(

       LDFR:IN STD_LOGIC;

       CY,ZI:IN STD_LOGIC;

       FC,FZ:OUT STD_LOGIC    

       );

END LS74;

ARCHITECTURE A OF LS74 IS

BEGIN

       PROCESS(LDFR)

       BEGIN

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

                     FC<=CY;

                     FZ<=ZI;

              END IF;

       END PROCESS;

END A;

3 暫存器、通用寄存器、地址寄存器、指令寄存器單元源程序

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;

4 1:2分配器單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY FEN2 IS

 

PORT(

       X: IN STD_LOGIC_VECTOR(7 DOWNTO 0);

    LED_B,WR_FEN2: IN STD_LOGIC;

       W1,W2: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

       );

END FEN2;

 

ARCHITECTURE A OF FEN2 IS

BEGIN

       PROCESS(LED_B,WR_FEN2)

       BEGIN

              IF(LED_B='0' AND WR_FEN2='0') THEN       --TO OUTPUT

                     W2 <= X;

              ELSe                                --TO MUX3

                     W1 <= X;

              END IF;

       END PROCESS;

END A;

5 三選一選擇器單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY MUX3 IS

PORT(

       SW_B,CS:IN STD_LOGIC;

       INPUT:IN STD_LOGIC_VECTOR(7 DOWNTO 0);   

    IN_FEN2,IN_RM:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

    TO_DBUS:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) 

);

END MUX3;

ARCHITECTURE A OF MUX3 IS

BEGIN

PROCESS(SW_B,CS)

BEGIN 

   IF(SW_B='0') THEN

      TO_DBUS<=INPUT;   --外部輸入數據

   ELSIF(CS='0')THEN

     TO_DBUS<=IN_RM;    --ROM,RAM讀出的數據送內部總線

   ELSE

     TO_DBUS<=IN_FEN2;    --41選擇器輸入送內部總線

   END IF;

END PROCESS;

END A;

 

6 四選一單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY MUX4 IS

PORT(

       C,D,E,F:IN STD_LOGIC;

       X1,X2,X3,X4:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       W:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

       );

END MUX4;

ARCHITECTURE A OF MUX4 IS

SIGNAL SEL:STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

       SEL<=F&E&D&C;

       PROCESS(SEL)

       BEGIN

              IF(SEL="1110")THEN

                     W<=X1;

              ELSIF(SEL="1101")THEN

                     W<=X2;

              ELSIF(SEL="1011")THEN

                     W<=X3;

              ELSIF(SEL="0111")THEN

                     W<=X4;

              ELSE

                    NULL;

              END IF;

       END PROCESS;

END A;

7 程序計數器單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.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

SIGNAL QOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

              PROCESS(LDPC,CLR,LOAD)

BEGIN

       IF(CLR='0') THEN

              QOUT<="00000000";--PC0

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

              IF(LOAD='0') THEN

                     QOUT<=D;--將數據總線的內容送PC

              ELSE

                     QOUT<=QOUT+1;--PC+1

              END IF;

       END IF;

END PROCESS;

       O<=QOUT;

END A;

8 ROM16單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ROM16 IS

PORT(

  

    ADDR:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       CS_I:IN STD_LOGIC   ;

       DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

);

END ROM16;

ARCHITECTURE A OF ROM16 IS

BEGIN

       Process(CS_I)

    BEGIN

              IF(CS_I'EVENT AND CS_I='0') THEN

 

                            CASE ADDR IS

                                   WHEN "00000000"=>DOUT<="10010000";--00      Mov R0,12H

                                   WHEN "00000001"=>DOUT<="00010010";--01

                            WHEN "00000010"=>DOUT<="10000001";--02  L1: IN1 R1

                            WHEN "00000011"=>DOUT<="01010100";--03      MovRM R1,[R0]

                            WHEN "00000100"=>DOUT<="11010000";--04      INC R0

                                   WHEN "00000101"=>DOUT<="10010010";--05      Mov R2,1CH

                                   WHEN "00000110"=>DOUT<="00011100";--06   

                            WHEN "00000111"=>DOUT<="11000010";--07      CMP R0,R2

                            WHEN "00001000"=>DOUT<="10110000";--08         JB L1

                            WHEN "00001001"=>DOUT<="00000010";--09        

                                   WHEN "00001010"=>DOUT<="10010001";--0A        Mov R1,1DH

                                   WHEN "00001011"=>DOUT<="00011101";--0B        

                            WHEN "00001100"=>DOUT<="10010010";--oC        Mov R2,00H

                            WHEN "00001101"=>DOUT<="00000000";--OD             

                            WHEN "00001110"=>DOUT<="01011001";--OE        MovRM R2,[R1]

                                   WHEN "00001111"=>DOUT<="10010001";--OF        Mov R1,1EH

 

                                   WHEN "00010000"=>DOUT<="00011110";--10

                                   WHEN "00010001"=>DOUT<="10010010";--11         Mov R2,09H

                                   WHEN "00010010"=>DOUT<="00001001";--12

                            WHEN "00010011"=>DOUT<="01011001";--13         MovRM R2,[R1]

                                   WHEN "00010100"=>DOUT<="10010000";--14         Mov R0,12H

                                   WHEN "00010101"=>DOUT<="00010010";--15

                            WHEN "00010110"=>DOUT<="10010001";--16  L2: Mov R1,80H   

                            WHEN "00010111"=>DOUT<="10000000";--17

                            WHEN "00011000"=>DOUT<="10100010";--18         MovMR [R0],[R2]

                            WHEN "00011001"=>DOUT<="11001001";--19         CMP R2,R1

                            WHEN "00011010"=>DOUT<="10110000";--1A         JB L3

                            WHEN "00011011"=>DOUT<="00100111";--1B        

                            WHEN "00011100"=>DOUT<="10010001";--1C         Mov R1,1EH

                            WHEN "00011101"=>DOUT<="00011110";--1D

                            WHEN "00011110"=>DOUT<="10100110";--1E         MovMR [R1],R2

                            WHEN "00011111"=>DOUT<="10100001";--1F         MovMR [R0],R1

 

                            WHEN "00100000"=>DOUT<="01010110";--20         MovRM R1,[R2]

                            WHEN "00100001"=>DOUT<="11010010";--21         INC R2

                                   WHEN "00100010"=>DOUT<="10010001";--22         Mov R1,1EH

                                   WHEN "00100011"=>DOUT<="00011110";--23         

                            WHEN "00100100"=>DOUT<="01011001";--24         MovRM R2,[R1]

                            WHEN "00100101"=>DOUT<="11100000";--25         JMP L4

                            WHEN "00100110"=>DOUT<="00110001";--26 

                            WHEN "00100111"=>DOUT<="11111000";--27   L3: OUT1 R2

                                   WHEN "00101000"=>DOUT<="10010001";--28         Mov R1,1DH

                                   WHEN "00101001"=>DOUT<="00011101";--29

                            WHEN "00101010"=>DOUT<="10100110";--2A        MovMR [R1],R2

                            WHEN "00101011"=>DOUT<="10100001";--2B         MovMR [R0],R1

                            WHEN "00101100"=>DOUT<="01010110";--2C         MovRM R1,[R2]

                            WHEN "00101101"=>DOUT<="11010010";--2D        INC R2

                                   WHEN "00101110"=>DOUT<="10010001";--2E         Mov R1,1DH

                                   WHEN "00101111"=>DOUT<="00011101";--2F

 

                            WHEN "00110000"=>DOUT<="01011001";--30         MovRM R2,[R1]

                            WHEN "00110001"=>DOUT<="11010000";--31  L4:INC R0

                                   WHEN "00110010"=>DOUT<="10010001";--32         Mov R1,1CH

                                   WHEN "00110011"=>DOUT<="00011100";--33

                            WHEN "00110100"=>DOUT<="11000001";--34         CMP R0,R1

                            WHEN "00110101"=>DOUT<="10110000";--35         JB L2

                            WHEN "00110110"=>DOUT<="00010110";--36

                                   WHEN "00110111"=>DOUT<="10010001";--37         Mov R1,1DH

                                   WHEN "00111000"=>DOUT<="00011101";--38

                            WHEN "00111001"=>DOUT<="10100110";--39         MovMR [R1],R2

                            --WHEN "00111010"=>DOUT<="11010010";--3A      INC R2

                            WHEN "00111011"=>DOUT<="11111000";--3B          OUT1 R2

                    

                            WHEN OTHERS=>NULL;                        

                     END CASE;

 

              END IF;

       END PROCESS;

END A;

 

9 RAM單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY RAM IS

PORT(

       WR,CS_D:IN STD_LOGIC;

       DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

       ADDR:IN STD_LOGIC_VECTOR(7 DOWNTO 0)

);

END RAM;

ARCHITECTURE A OF RAM IS

       TYPE MEMORY IS ARRAY(0 TO 31) OF STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

       PROCESS(CS_D,WR)

       VARIABLE MEM:MEMORY;

    BEGIN

              IF(CS_D'EVENT AND CS_D='0') THEN

                     IF(WR='0') THEN      --寫內存

                            MEM(CONV_INTEGER(ADDR(4 DOWNTO 0))):=DIN;

                     ELSIF(WR='1') THEN   --RAM

                            DOUT<=MEM(CONV_INTEGER(ADDR(4 DOWNTO 0)));

                     END IF;

              END IF;

       END PROCESS;

END A;

10 時序產生器單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY COUNTER IS                                     

PORT(

       Q,CLR:IN STD_LOGIC;

       T1,T2,T3,T4:OUT STD_LOGIC

       );

END COUNTER;

ARCHITECTURE A OF COUNTER IS

SIGNAL X:STD_LOGIC_VECTOR(1 DOWNTO 0);

BEGIN

       PROCESS(Q,CLR)

       BEGIN

              IF(CLR='0') THEN

                     T1<='0';

                     T2<='0';

                     T3<='0';

                     T4<='0';

                     X<="00";

              ELSIF(Q'EVENT AND Q='1') THEN

                     X<=X+1;

                     T1<=(NOT X(1)) AND (NOT X(0));

                     T2<=(NOT X(1)) AND X(0);

                     T3<=X(1) AND (NOT X(0));

                     T4<=X(1) AND X(0);

              END IF;

       END PROCESS;

END A;

11 選擇從PC或者BUS中讀入數據到AR的二選一選擇器單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

 

ENTITY MUX2_PC IS

PORT(

       ID_PC: IN STD_LOGIC;

       IN_BUS,IN_PC: IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       TO_AR: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

       );

END MUX2_PC;

 

ARCHITECTURE A OF MUX2_PC IS

BEGIN

       PROCESS (ID_PC,IN_BUS,IN_PC)

       BEGIN

              IF (ID_PC= '0') THEN

                     TO_AR<= IN_BUS;

              ELSIF (ID_PC= '1') THEN

                     TO_AR<= IN_PC;

              END IF;

       END PROCESS;

END A;

12 選擇對ROM或者RAM進行操作的二選一選擇器單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

 

ENTITY MUX2_RM IS

PORT(

       ID_RM: IN STD_LOGIC;

       IN_RAM,IN_ROM: IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       D_OUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

       );

END MUX2_RM;

 

ARCHITECTURE A OF MUX2_RM IS

BEGIN

       PROCESS (ID_RM,IN_ROM,IN_RAM)

       BEGIN

              IF (ID_RM= '1') THEN

                     D_OUT <= IN_RAM;

              ELSIF (ID_RM= '0') THEN

                     D_OUT <= IN_ROM;

              END IF;

       END PROCESS;

END A;

13 MODE_CONTROL中央控制器單元源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY MODE_CONTROL IS

PORT(

     DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);--IR

     Q,T1,T2,T3,T4,CLR:IN STD_LOGIC;

     FZ,FC:IN STD_LOGIC;

 

     LOAD,LDPC:OUT STD_LOGIC;--PC

     LDAR:OUT STD_LOGIC;--AR

     LDIR:OUT STD_LOGIC;--IR

     LDR0,LDR1,LDR2:OUT STD_LOGIC;--控制R0,R1,R2輸入

     R0_B,R1_B,R2_B,ALU_B:OUT STD_LOGIC;--控制R0,R1,R2輸出

     S1,S0:OUT STD_LOGIC;--ALU

     SW_B,CS:OUT STD_LOGIC;

     CS_I:OUT STD_LOGIC;--控制ROM的片選信號

     CS_D,WR:OUT STD_LOGIC;--控制RAM的片選及其讀寫信號

     ID_PC:OUT STD_LOGIC;

     ID_RM:OUT STD_LOGIC;

     LDAC:OUT STD_LOGIC;

     LDDR:OUT STD_LOGIC;  

     LED_B,WR_FEN2:OUT STD_LOGIC;

     LDFR:OUT STD_LOGIC

    

     );

END MODE_CONTROL;

ARCHITECTURE A OF MODE_CONTROL IS

SIGNAL YIMA:STD_LOGIC_VECTOR(8 DOWNTO 0);

SIGNAL IN1,MOV,MOVRM,MOVMR,CMP,JB,INC,JMP,OUT1:STD_LOGIC;

SIGNAL LDRi,RS_B,RD_B:STD_LOGIC;

SIGNAL M:STD_LOGIC:='0';

BEGIN

    P1:PROCESS(CLR,T4)

    BEGIN

        IF(CLR='0')THEN

            M<='0';

        ELSIF(T4'EVENT AND T4='0')THEN

            IF((IN1  OR MOV OR MOVRM OR MOVMR OR INC OR JB OR JMP OR OUT1)='1')THEN

                M<='0';

            ELSIF(CMP ='1')THEN

                M<=NOT M;

            END IF;

        END IF;

    END PROCESS P1;

    P2:PROCESS(Q,CLR)

    BEGIN

        CASE DIN(7 DOWNTO 4)IS

            WHEN"1000"=>YIMA<="000000001";--IN1

            WHEN"1001"=>YIMA<="000000010";--Mov

            WHEN"0101"=>YIMA<="000000100";--MovRM

            WHEN"1010"=>YIMA<="000001000";--MovMR

            WHEN"1100"=>YIMA<="000010000";--CMP

            WHEN"1011"=>YIMA<="000100000";--JB

            WHEN"1101"=>YIMA<="001000000";--INC

            WHEN"1110"=>YIMA<="010000000";--JMP

            WHEN"1111"=>YIMA<="100000000";--OUT1

            WHEN OTHERS=>YIMA<="000000000";

        END CASE;

 

        LDAC<=(CMP OR INC) AND T3 AND (NOT Q) AND (NOT M);

        LDDR<=CMP AND T4 AND (NOT Q) AND (NOT M);

        ALU_B<=NOT(INC AND T4 AND (NOT M));

        LOAD<=NOT((JMP AND T4 AND (NOT M) ) OR( JB AND T4 AND(NOT M)AND(FC AND (NOT FZ))));

        LDPC<=(T1 AND (NOT Q)AND (NOT M)) OR((MOV OR JB or JMP)AND T3 AND(NOT Q)AND (NOT M))OR(JB AND T4 AND (NOT Q)AND(NOT M)AND(FC AND(NOT

FZ))) OR (JMP AND T4 AND (NOT Q) AND (NOT M));                                                                                              LDIR<=T2 AND (NOT Q)AND(NOT M);

        LDFR<=CMP AND T1 AND (NOT Q)AND M;

        RS_B<=NOT((( MOVMR OR CMP OR OUT1)AND T3 AND (NOT M))OR(MOVRM AND T4 AND (NOT M)));

        RD_B<=NOT(((MOVRM OR INC )AND T3 AND (NOT M))OR (CMP AND T4 AND(NOT M)));

        R0_B<=(RS_B OR DIN(3)OR DIN(2))AND(RD_B OR DIN(1)OR DIN(0));

        R1_B<=(RS_B OR DIN(3)OR(NOT DIN(2)))AND(RD_B OR DIN(1)OR(NOT DIN(0)));

        R2_B<=(RS_B OR(NOT DIN(3))OR DIN(2))AND(RD_B OR(NOT DIN(1))OR DIN(0));

 

        LDRi<=(IN1 AND T3 AND(NOT Q)AND(NOT M))OR((MOV OR MOVMR OR INC )AND T4 AND(NOT Q)AND(NOT M));

        LDR0<=LDRi AND(NOT DIN(1))AND(NOT DIN(0));

        LDR1<=LDRi AND(NOT DIN(1))AND DIN(0);

        LDR2<=LDRi AND DIN(1)AND(NOT DIN(0));

 

        S1<=INC AND T4 AND(NOT M);

        S0<=CMP AND T1 AND M;

        CS<=NOT((T2 AND(NOT M))OR((MOV OR MOVMR OR JMP)AND T4 AND(NOT M))OR(JB AND T4 AND(NOT M)AND((NOT FZ)AND FC)));

        LDAR<=(T1 AND(NOT M))OR((MOV OR JB OR JMP)AND T3 AND(NOT M))OR((MOVRM OR MOVMR) AND T3 AND(NOT Q)AND(NOT M));

        SW_B<=NOT(IN1 AND T3 AND(NOT M));

        LED_B<=NOT(OUT1 AND T3 AND(NOT M));

        WR_FEN2<=NOT(OUT1 AND T3 AND (NOT M));

        ID_PC<=NOT((MOVRM OR MOVMR)AND T3 AND(NOT M));

        ID_RM<=MOVMR AND T4 AND(NOT M);

        CS_D<=NOT( (MOVRM AND T4 AND(NOT Q)AND(NOT M)) OR (MOVMR AND T4 AND(NOT M)) );

        WR<=NOT(MOVRM AND T4 AND(NOT M));

              --WR<=MOVMR AND T4 AND (NOT M);

        CS_I<=NOT( (T2 AND(NOT M)) OR (MOV AND T4 AND(NOT M)) OR (JMP AND T4 AND (NOT M)) OR (JB AND T4 AND(NOT M)AND((NOT FZ)AND FC) ) );

 

    END PROCESS P2;

 

    OUT1<=YIMA(8);

    JMP<=YIMA(7);

    INC<=YIMA(6);

    JB<=YIMA(5);

    CMP<=YIMA(4);

    MOVMR<=YIMA(3);

    MOVRM<=YIMA(2);

    MOV<=YIMA(1);

    IN1<=YIMA(0);

END A;

 

 

 

 

 

發佈了18 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章