計算機組成系統實驗(硬件)
題目:設計一臺嵌入式RISC模型機
學 號: 072031108
姓 名: 劉同來
指導教師: 陳智勇老師
專 業: 計算機應用技術
日期:2008-5-30
目 錄
3 暫存器、通用寄存器、地址寄存器、指令寄存器單元源程序... 20
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: 源寄存器中的數和目的寄存器中的數進行比較並置狀態寄存器FZ,FC值,鎖存;
INC: 將目的寄存器中的數據自加1;
JB: 有條件轉移指令(小於轉移),判斷狀態寄存器中FC,FZ的值,若FC=1,FZ=0(表示在上一條指令中,比較的結果爲小於),則轉移到指定行,否則順序執行。
JMP: 無條件轉移指令.轉移到指定行
OUT1: 將源寄存器數據輸出到LED。
下面系統中採用的九條指令及其格式,其中Rs爲源寄存器,Rd爲目的寄存器。
(1)I/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 |
操作碼 |
× × × × |
地 址 |
(3)MOV指令
MOV指令採用雙字節指令,其格式如下:
7 6 5 4 |
3 2 |
1 0 |
操作碼 |
× × |
Rd |
立 即 數 |
(4)MOVRM和MOVMR指令
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)對Rs和Rd的規定:
Rs或Rd |
選定的寄存器 |
0 0 |
R0 |
0 1 |
R1 |
1 0 |
R2 |
4.2 數據格式
模型機規定數據的標識採用定點補碼標識,且字長爲8位,其格式如下
7 |
6 5 4 3 2 1 0 |
符號位 |
尾數 |
4.3 指令系統
本模型機共有9條指令,下表列出了每條指令的格式、彙編符號和指令功能。
助記符號 |
指令格式 |
功 能 | ||||||
|
|
接收數據存到Rd寄存器 | ||||||
CMP Rs, Rd |
|
(Rs)-(Rd),鎖存CY和ZI | ||||||
|
|
data → Rd | ||||||
MOVRM Rs, [Rd] |
|
(Rs) → ((Rd)) | ||||||
MOVMR [Rs], Rd |
|
((Rs)) → Rd | ||||||
|
|
(Rd)+1 → Rd | ||||||
JB addr |
|
若小於,則addr → PC | ||||||
JMP addr |
|
addr → PC | ||||||
OUT1 Rs |
|
(Rs)→ LED |
表4.1 指令系統格式表
5 所有機器指令的CPU操作流程圖
機器指令的CPU操作流程圖是根據模型機的硬件設計、指令系統、所有指令的解釋過程和控制信號的時序設計出來的,如圖5.1所示。圖中每一個方框執行的時間爲一個時鐘週期(或稱T週期),四個T週期爲一個節拍電位。由於每條指令的執行的時間最多爲兩個節拍電位,因此在VHDL軟件中用一個觸發器M的狀態來表示目前處於哪一個節拍電位(在第一個節拍電位時,M=0;在第二個節拍電位時M=1)。
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_D↓WR=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↑ PC→AR , PC+1 RD M , BUS→IR 指令譯碼 SW→BUS BUS→Rd Rd→BUS BUS→AR PC→AR PC+1 PC→AR PC+1 Rd→BUS BUS→AC ROM→BUS BUS→PC AC+1→BUS BUS→Rd JMP addr MOVMR [Rs],Rd OUT1 Rs MOVRM Rs,[Rd] Rs→BUS BUS→AR Rs→LED ROM→BUS BUS→Rd Rs→BUS WR RAM RD RAM BUS→Rd 圖5.1 機器指令CPU操作流程圖 Rs→BUS BUS→AC PC→AR PC+1 測FC,FZ RD ROM BUS→PC FZ=0,CS_I↓ RE=0,ID_RM=0 SW_B=1,CS=0, LDPC↑,LOAD=0 Rd→BUS BUS→DR AC-DR 鎖存FC,FZ JB addr
6.嵌入式RISC模型計算機的頂層電路圖
頂層電路圖由一個輸入(INPUT)和一個輸出(OUTPUT),以及七個寄存器(R0,R1,R3,AR,IR,AC,DR),兩個二選一選擇器(MUX2_PC,MUX2_RM),一個三選一選擇器(MUX3),一個ALU運算器,一個計數器PC,一個時序產生器,一個狀態條件寄存器,一個一分二分配器,一個ROM存儲器、一個RAM存儲器和中央控制器組成,如下圖(圖6.1)所示。
其中二選一選擇器MUX2_PC實現將PC或BUS數據送AR,MUX2_RM將RAM或ROM數據送三選一選擇器,再送內部數據總線。中間3個寄存器,從上向下依次編號爲R0、R1、R2,用來暫存數據和交換數據之用,初始R0用於接收10個數存入RAM,然後再用R0作爲遊標指向10個數據RAM中首地址,R1、R2分別用於數據傳遞。而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. R0與1CH比較判斷是否已將10個數據全部讀完,取完輸出1DH存儲單元中正數計數器值即爲正數個數
輸入包含10個整數(補碼錶示)的數組M,存放在1CH開始的10個存儲單元中,00H向後的9個地址用來保存正數數組P,09H向後的9個地址用來保存負數數組N,12H向後的10個地址用來保存輸入的所有數即數組M,1DH用來存放正數尾地址,同時也作爲正數計數器,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 |
|
|
06 |
00101010 |
|
CMP R0,R2 |
07 |
11000010 |
(R0)-(R2),鎖存CY和ZI |
JB L1 |
08 |
10110000 |
若小於,則L1->PC |
|
09 |
00000010 |
|
Mov R1,1DH |
|
10010001 |
1D->R1 |
|
0B |
00110000 |
|
Mov R2,00H |
|
10010010 |
00->R2 |
|
0D |
00000000 |
|
MovRM R2,[R1] |
0E |
01011001 |
(R2)->((R1)) |
Mov R1,1EH |
|
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),鎖存CY和ZI |
JB L3 |
|
10110000 |
L3->PC |
|
1B |
00100111 |
|
Mov R1,1EH |
|
10010001 |
1E->R1 |
|
1D |
00110001 |
|
MovMR [R1],R2 |
1E |
10100110 |
((R1))->R2 |
MovMR [R0],R1 |
|
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 |
|
10100110 |
((R1))->R2 |
MovMR [R0],R1 |
2B |
10100001 |
((R0))->R1 |
MovRM R1,[R2] |
|
01010110 |
(R1)->((R2)) |
INC R2 |
2D |
11010010 |
(R2)+1->R2 |
Mov R1,1DH |
2E |
10010001 |
1D->R1 |
|
|
00110000 |
|
MovRM R2,[R1] |
30 |
01011001 |
()->(()) |
L4:INC R0 |
31 |
11010000 |
(R0)+1->R0 |
Mov R1,1CH |
32 |
10010001 |
|
|
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 |
|
11111000 |
(R2)->LED |
表8-1機器機器語言源程序
9 時序仿真波形圖
在仿真輸出波形圖上,挑選顯示的項爲Q,CLR,, PC, AR, IR, R0,R1,R2, MEM, INPUT[7..0]以及OUTPUT[7..0],Q設置爲時鐘脈衝,CLR清零信號除開始一小段時間爲低電平之外,其餘時間均爲高電平。
下面進行仿真輸入,在IR值爲81處對應的INPUT輸入口輸入一組排序數,輸入數據90,02,03,81,82,06,84,85,09,87。
輸入:
輸出:
內存:
圖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在仿真波形圖中無法調出
解決辦法:RAM爲64,128個存儲單元時都不會出現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模型機相比,有一定的複雜度,當然在這短暫的幾個星期的實驗中,我在
最後,對給予我細心指導的
參考文獻
[1]陳智勇 編. 計算機組成系統實驗. 桂林電子工業學院計算機系. 2002年09月
[2]潘鬆,王國棟 編著. VHDL實用教程. 電子科技大學出版社. 2001年02月
[3]白中英 編. 《計算機組成原理》. 科學出版社. 1997年10月
[4] David A. Patterson,John L. Hennessy 計算機體系結構量化研究方法 機械工業出版社 2002年9月
[5]曾繁泰 編 VHDL程序設計 清華大學出版社 2001年3月
附錄:軟件源程序
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; --經4選1選擇器輸入送內部總線
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";--將PC清0
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";-
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";-
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";-
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";-
WHEN "00011011"=>DOUT<="00100111";--1B
WHEN "00011100"=>DOUT<="10010001";-
WHEN "00011101"=>DOUT<="00011110";--1D
WHEN "00011110"=>DOUT<="10100110";--1E MovMR [R1],R2
WHEN "00011111"=>DOUT<="10100001";-
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";-
WHEN "00101000"=>DOUT<="10010001";--28 Mov R1,1DH
WHEN "00101001"=>DOUT<="00011101";--29
WHEN "00101010"=>DOUT<="10100110";-
WHEN "00101011"=>DOUT<="10100001";--2B MovMR [R0],R1
WHEN "00101100"=>DOUT<="01010110";-
WHEN "00101101"=>DOUT<="11010010";--2D INC R2
WHEN "00101110"=>DOUT<="10010001";--2E Mov R1,1DH
WHEN "00101111"=>DOUT<="00011101";-
WHEN "00110000"=>DOUT<="01011001";--30 MovRM R2,[R1]
WHEN "00110001"=>DOUT<="11010000";-
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";-
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;