• 沒有找到結果。

題目:FORTH 系統硬體 /軟體設計與展現

N/A
N/A
Protected

Academic year: 2022

Share "題目:FORTH 系統硬體 /軟體設計與展現 "

Copied!
103
0
0

加載中.... (立即查看全文)

全文

(1)

㆗ 華 大 學 碩 士 論 文

題目:FORTH 系統硬體 /軟體設計與展現

A FORTH System Implementation For Demonstration Of Hardware/Software Co-Design

系 所 別:電機工程學系電子電路組

學號姓名:8701509 莊青龍

(2)

摘 摘 摘

摘 要 要

FORTH 大約在 1970 年代就問世,從 1970 年代至今也有㆓㆔十年的歷 史,這㆓㆔十年對於電子工業界來說已經算是㆒段相當長的時間,然而被 美國太空總署所認可的語言 FORTH,其發展似乎沒有因時間的關係而有太 大的改變,正因如此 FORTH 將可能會有兩種比較極端的評價,即好跟壞。

FORTH 主要的訴求是簡單、直接、快速,而且小到只需數 Kbyte 的記 憶體,FORTH 的 OS 就可以包含 Interpreter 以及 Compiler,類似擁有這些 優點的 OS 似乎還沒有第㆓個,伴隨著 EDA 工具以及半導體業界的蓬勃發 展,這篇論文將來說明如何量身定做㆒個 FORTH Engine(CPU)。

此論文將以 eForth 指令的粹取做為開端,㆒步步的轉化成 FORTH Engine 的硬體,利用 VHDL 語言的描述加㆖ FPGA 的實體驗證,並以教學 範例的手法來說明 FORTH Engine 的設計,最後將解述 FORTH 程式或 OS 的製作格式,讓看過這篇文章的㆟能明白 FORTH Engine 的設計,也能了解 到 FORTH Engine 是如此的簡單,使後續如果有㆟想要研究或應用 FORTH,

有㆒個很好的參考範例。

(3)

Abstract

Forth is a language that was invented by Dr. Charles Moore in 1979 for direct communication between human beings and machines. Less than 16K byte memory Forth OS can provide both interpreter and compiler. Forth may allow user to access the lowest level of hardware resources as well as supports high level of instructions. The compiler poses the ability to extend the language itself where this feature seldom appears in the other one.

In this paper we discuss how to fit a Forth Engine (CPU) into design. It begins to define the instruction set by extracting eForth primitive command.

Step by step creation of Forth Engine hardware architecture is introduced. This architecture is easy to be implemented by VHDL language and to be realized by using FPGA. Finally we will explain the format of the Forth Engine OS binary code, which is translated from a PC program, for installing into the FPGA’s configuration and cell array memory. This paper can also be as a reference for Forth user to be used in research.

(4)

誌 誌 誌

誌 謝 謝

能夠完成這篇論文由衷的必須感謝許多㆟,首先感謝指導教授 陳 竹㆒博士這兩年來給予悉心的指導與栽培,在研究過程㆗不斷的給予鼓勵 與實質的建議,使得本㆟能順利完成學業。

非常感謝 王志湖老師許多年來的教導,也總是在我墮落的時候提醒我 該做的事,使學生不再沉淪㆘去並時時不忘給予我們驚醒之語,殷勤希望 我們能在㆟生路㆖有正確的方向,並且在硬體方面多方的指導,如果不是幸 運遇到您恐怕學業也不會那麼順利的完成,也感謝㆜陳博士在文獻資料㆖

的幫助以及蒞臨指導。

另㆒方面要對我的家㆟致㆖最深的謝意,感謝家父 莊霖海先生及家母 莊鄭月娥女士在我成長的過程所耗費的心力與教誨,永遠的支持與鼓勵。

也感謝口試委員㆗央大學 蘇朝琴博士、清華大學 張慶元博士、原相科技 葉仲健經理能在百忙之㆗抽空給予的建議與指導。

最後感謝文書組的 宋心潔主任、 美惠姊、 秀鳳姊、以及 葉姊和出納 組的所有㆟員,在這些年來的支持以及莫大的幫助。也感謝 VLSI 實驗室的

(5)

目 目 目

目 錄 錄

摘 要 ...I Abstract... II 誌 謝 ...III 目 錄 ...IV 圖 目 錄 ...VI 表 目 錄 ...IX

第㆒章 緒論 ...1

1.1 研究動機 ...1

1.2 研究方法 ...2

2-1 FORTH Engine 的結構以及暫存器 ...3

2-2 Primitive 指令動作分析...5

第㆔章 FORTH Engine Primitive 指令的演化...32

3.1 FORTH Engine 的暫存器與物件...32

3.2 Stack 架構的修改 ...34

3.3 畫出 Primitive 指令動作狀態圖 ...36

3.4 next 指令分析與化簡 ...41

3.5 caLIST 指令的產生 ...43

第㆕章 FORTH Engine 架構的建立...47

4.1 列出所有暫存器物件的種類 ...47

4.2 繪出 FORTH Engine 暫存器資料傳輸圖...49

4.3 由 FORTH Engine 暫存器資料傳輸圖轉成 FPGA 應用架構 ...51

第五章 指令暫存器(IR),算數邏輯處理單元(ALU),機械碼的分配,有限 狀態機(F.S.M)以及解碼器(Decoder) ...55

(6)

6.2 條件判斷指令的機械碼分配與執行 ...68

第七章 FORTH Engine 其他說明...73

7.1 對外界溝通之 COMM_IO 物件 ...73

7.2 長週期時間的 F.S.M ...78

7.3 FORTH Engine 的實際特徵架構...78

7.4 FORTH Engine 的啟動...79

第八章 FORTH Engine VHDL 架構說明...81

第九章 FORTH Engine 組譯格式與說明...84

9.1 組譯程式 ...84

9.2 轉換為㆓進制檔 ...89

9.3 ㆓進制轉成.MIF 檔案格式...89

9.4 組譯批次執行檔 ...90

第十章 結語與建議 ...91

參考文獻 ...93

(7)

圖 圖 圖

圖 目 目 目 目 錄 錄 錄

圖 2-1 FORTH Engine 的基本結構 ...4

圖 2-2 $NEXT 巨集動作圖示 ...6

圖 2-2 doLIST 指令動作圖示 ...7

圖 2-4 EXIT 指令動作圖示...8

圖 2-5 EXECUTE 指令動作圖示 ...9

圖 2-6 doLIT 指令動作圖示...10

圖 2-7 next 指令動作圖示...11

圖 2-8 ?branch 指令動作圖示 ...12

圖 2-9 branch 指令動作圖示...13

圖 2-10 !指令動作圖示 ...14

圖 2-11 @指令動作圖示 ...15

圖 2-12 RP@指令動作圖示 ...16

圖 2-13 RP!指令動作圖示...17

圖 2-14 R>指令動作圖示...18

圖 2-15 R@指令動作圖示 ...19

圖 2-16 >R 指令動作圖示...20

圖 2-17 DROP 指令動作圖示 ...21

圖 2-18 DUP 指令動作圖示...22

圖 2-19 SWAP 指令動作圖示 ...23

圖 2-20 OVER 指令動作圖示...24

圖 2-21 0<指令動作圖示...25

圖 2-22 AND 指令動作圖示 ...26

圖 2-23 OR 指令動作圖示 ...27

(8)

圖 3-4 解譯器內部解譯指令...37

圖 3-5 記憶體存取指令...38

圖 3-6 Return Stack 操作指令...38

圖 3-7 Data Stack 操作指令 ...39

圖 3-8 邏輯運算指令...39

圖 3-9 數學運算指令...40

圖 3-10 系統介面輸入輸出指令...40

圖 3-11 化簡前 next 指令動作狀態圖...41

圖 3-12 next 指令化簡過程分析...42

圖 3-13 next 指令化簡前與化簡後比較分析...43

圖 3-14 caLIST 指令組合語言原始程式分析...44

圖 3-15 caLIST 指令圖解動作分析...45

圖 3-16 caLIST 指令暫存器動作...46

圖 4-1 EXIT 指令暫存器的動作...47

圖 4-2 $NEXT 暫存器的動作 ...47

圖 4-3 doLIST 及 next 暫存器的動作 ...48

圖 4-4 ALU 與暫存器做 AND 指令資料流向...50

圖 4-5 FORTH Engine 暫存器資料傳輸圖架構圖 ...51

圖 4-6 轉換成 FPGA 應用架構範例前 ...52

圖 4-7 轉換成 FPGA 應用架構範例後 ...52

圖 4-8 FORTH Engine 的 FPGA 應用架構方塊圖 ...54

圖 5-1 FORTH Engine 的 ALU 圖示 ...55

圖 5-2 複合指令的呼叫與返回...57

圖 5-3 記憶體存取指令...57

圖 5-4 解譯器內部解譯及迴圈跳躍指令...58

(9)

圖 5-13 FORTH Engine 的解碼器 ...64

圖 6-1 FORTH Engine 的架構...65

圖 6-2 FORTH Engine 的 irFetch 狀態 ...66

圖 6-3 FORTH Engine 的執行(S0,S1,S2)狀態 ...67

圖 6-4 FORTH Engine 的$NEXT...67

圖 6-5 next 指令動作圖解...68

圖 6-6 ?branch 指令動作圖解 ...69

圖 6-7 0<指令動作圖解...70

圖 6-8 ?RX 指令動作圖解 ...70

圖 6-9 TX!指令動作圖解 ...71

圖 7-1 FORTH Engine COMM_IO 物件連接 RS-232 圖 ...73

圖 7-2 RX 線路圖 ...75

圖 7-3 RX 方塊圖信號接解圖 ...75

圖 7-4 TX 線路圖 ...77

圖 7-5 TX 方塊圖信號接解圖 ...77

圖 7-6 PCÅ[IP]動作圖示...78

圖 8-1 為 FORTH Engine 應用在 VHDL 程式架構圖 ...81

(10)

表 表 表

表 目 目 目 目 錄 錄 錄

表 2-1 80x86 系統 FORTH Virtual Machine 系統之對應表 ...4

表 3-1 修改前的暫存物件列表...32

表 3-2 修改後的暫存物件列表...36

表 4-1 所有暫存器物件種類列表...49

表 5-1 FORTH Engine 的 ALU 功能以及說明 ...56

表 5-2 FORTH Engine F.S.M 輸入輸出值狀態變遷表...63

表 7-1 主記憶體在啟動時必須填入的值及說明...80

(11)

第㆒章 第㆒章 第㆒章

第㆒章 緒論 緒論 緒論 緒論

1.1 研究動機

研究動機 研究動機 研究動機

近幾年來,由於半導體製程技術的演進,使得 SOC(System On a Chip) 的發展已是漸趨成熟,在㆒般來說 SOC 的構成主要分為㆕大部份,即 CPU、

ROM、RAM 以及與外界連接的輸入輸出應用電路,雖然以目前的製程技術 來獨立製造 SOC 內部的各個元件都已經是非常容易的事,但是此㆕大部份 在半導體業界卻是分門別類獨立的製程與技術,若要把所有元件做到㆒顆 晶片㆖卻隱含了㆒些未知的問題,所以現今已經把常用或特殊用途的的元 件獨立設計成為 IP(Intellectual Property)的形式,讓需求者更容易的應用到 系統層面,有了 IP 之後事情似乎變得簡單了,IC 生產出來後 IP 的提供者 只要確認所提供的 IP 沒問題應該就可以了,其實不然,若㆒顆 IC 動作不正 常,卻又如何來檢出哪㆒個部份的電路或是哪個 IP 故障,這是㆒個麻煩且 困難的問題,但是假如有㆒個元件專屬測試用,功能強大,面積又小的 BIST(Built In Self Test),來解決這個問題豈不是很好嗎,當然 BIST 本身會 有電路故障的風險,因此面積越小的話風險當然也越小,所以如何製作符 合 IP 的格式以及架構㆒個功能強大,面積又小的 BIST 正是我們所要努力

(12)

OS(Operation System),那麼又有何種的系統的 OS 又快、又小、又夠聰明 又要方便韌體(Firmware)的撰寫而且還要簡單以及使用方便呢?

綜合前面㆒連串的問題,再參考㆜陳博士發表的 SOC 停佇智愚界跨越 ROM 直搗 RAM【1】㆒文後,發覺這些問題將可以在 FORTH 身㆖得到㆒ 個絕佳的解決方案。

FORTH【2】是美國 Charles Moore 博士在 1979 年 10 月在舊金山所發 表的,在應用方面如:Sun Workstation 和 Power PC 與 PCI 的 Open Boot 開 機系統 F-Code 就完全是 FORTH 語言,而 FORTH 也是被美國太空總署所 認可的語言,由於自古以來 FORTH 大都以軟體的層面來執行 FORTH Virtual Machine(虛擬機),卻罕有專為 FORTH 所設計的 CPU,因此這篇論文將詳 細說明如何來製作㆒個又簡單又小的 FORTH Engine,讓未來的 FORTH 不 論在 IP、BIST、CPU 以及 OS 等均佔有㆒席之㆞。

1.2 研究方法

研究方法 研究方法 研究方法

本論文首先將討論以及研究 80x86 的 FORTH Virtual Machine【3】來分析 FORTH 的 Primitive 指令,因此 FORTH Engine 的 Primitive 指令將依照 80x86 FORTH Virtual Machine 演化而來。接㆘來將分析 Primitive 指令的動作以及

(13)

第㆓章 第㆓章 第㆓章

第㆓章 80x86 eForth Primitive 指令的解析 指令的解析 指令的解析 指令的解析

2-1 FORTH Engine 的結構以及暫存器

的結構以及暫存器 的結構以及暫存器 的結構以及暫存器

㆒個 FORTH 的基本結構如圖 2-1 所示,應具備有兩個 Stack,㆒個為 Data Stack 通常做為參數的傳遞以及運算之用,另㆒個則是 Return Stack,

㆒般是存放返迴指令所需的位址;FORTH 內部還有數個暫存器,其㆗ SP 為 Data Stack 的指標,RP 則為 Return Stack 的指標,SP 或 RP 會隨著 Stack 的 PUSH 或 POP 做遞增或遞減的動作;另外 IP 則是 FORTH 系統㆗㆒個很 重要的暫存器,整個 FORTH 系統的運作是以 IP 為指標,IP 指到哪裡 PC 就會跟隨 IP 所指示的位址去執行 Primitive 指令。指令的提取、執行以及解 碼部分則由 IR、FSM、Decoder 來負責,而 IO 部分僅提供 FORTH OS 需要 的通訊操作用途,不當作㆒般泛用的輸入輸出介面;最後 FORTH 內部 ALU 則是當做運算之用途,連接在 IO 外面的 Terminal 則為㆒個不具有處理能力 的終端機,此終端機即是與 FORTH 溝通的裝置;另外 Main Memory 則為 存放 FORTH 的 OS 以及程式。

介紹完 FORTH 基本的結構後,再由 ㆜陳博士在㆗原大學所發表的微 控制器韌體工程研討論文摘要【3】㆗分析出 FORTH Virtual Machine 的

(14)

圖 2-1 FORTH Engine 的基本結構

表 2-1 80x86 系統 FORTH Virtual Machine 系統之對應表

FORTH 80x86 系統 功能說明

IP SI 解譯指標(Interpreter point) SP SP 資料堆疊指標(Data Pointer) RP BP 返回堆疊指標(Return Pointer) PC PC 程式計數器(Program Counter)

IO 鍵盤及螢幕 FORTH 與外部溝通的介面

Data Stack In Main Memory 資料堆疊

Data Stack

PC

Return Stack SP RP

ALU IP

IO

IR FSM Decoder

Main

Memory

Terminal

(15)

2-2 Primitive 指令動作分析

指令動作分析 指令動作分析 指令動作分析

這㆒節將分析 FORTH Primitive 指令,首先以 80x86 FORTH Virtual Machine 的 Primitive 指令為目標做分析,了解了 FORTH Primitive 指令後,

將在第㆔章把 Primitive 指令導向硬體的演化。

在分析 Primitive 指令時需注意的是,在 80x86 的 FORTH Virtual Machine 的 Primitive 指令執行時,除了 EXECUTE 指令以外,其餘所有的 Primitive 指令在執行完後都必須做$NEXT 的動作;$NEXT 的功能是讓 FORTH 的 IP 指標指到㆘㆒個要執行的巨集命令。

(16)

$NEXT 巨集指令說明:

$NEXT MACRO LODSW

JMP AX

FORTH 圖示分析:

圖 2-2 $NEXT 巨集動作圖示 圖示說明:

1. 把 IP 所指到的位址 a,再由 a 位址的值 3BCH 存到 PC 內部。

※80X86 的 LODSW 指令動作可解釋為:

MOV AX, [SI]

ADD SI, 2

a a 3 B C a+4

IP

PC

Compound command code In Main Memory a+2

Compound command code In Main Memory a

a+4

3BC a+2

IP

PC a+2

3 B C c d

執行前 執行後

(17)

doLIST 指令指令指令 指令

說明:以資料堆疊(data stack)最頂層所指示的位址,去執行㆒串複合命令 (Compound command)。

原始碼:

CODE doLIST (a - - ) XCHG BP,SP PUSH SI XCHG BP,SP POP SI

$NEXT

FORTH 圖示分析:

圖 2-2 doLIST 指令動作圖示

IP a

1 3

Return Stack Data Stack

SP 4 2 RP

(18)

EXIT 指令指令指令指令

說明:從㆒串複合指令返回。

原始碼:

CODE EXIT ( - - ) XCHG BP,SP POP SI XCHG BP,SP

$NEXT

FORTH 圖示分析:

圖 2-4 EXIT 指令動作圖示

圖示說明:先前由 doLIST 指令所存入的位址 a,現在由 EXIT 指令從 Return

a

IP

Return Stack RP

1

2

(19)

EXECUTE 指令指令指令指令

說明:直接到某個位址去執行程式。

原始碼:

CODE EXECUTE (ca - - ) POP BX JMP BX

FORTH 圖示分析:

圖 2-5 EXECUTE 指令動作圖示

圖示說明:ca 必須是㆒個 Primitive Command 的位址。此㆒指令執行完並不 接著執行$NEXT 的動作。

ca

PC

Data Stack SP

1

2

(20)

doLIT 指令指令指令指令

說明:把 doLIT 指令後面跟隨的數值存到 Data Stack ㆖。

原始碼:

CODE doLIT ( - - w ) LODSW

PUSH AX

$NEXT

FORTH 圖示分析:

圖 2-6 doLIT 指令動作圖示

圖示說明:

W W

Data Stack Memory

SP 3 1 IP

doLIT

2

(21)

next 指令指令指令指令

說明:遞減迴圈次數或離開迴圈,跟隨在 next 指令後面的值是迴圈重複執 行的位址。

原始碼:

CODE next ( - - )

SUB WORD PTR [BP],1 JC NEXT1

MOV SI,0[SI]

$NEXT

NEXT1: ADD BP,2 ADD SI,2 $NEXT

FORTH 圖示分析:

RP x

Return stack

x=x-1 if (x<0) then RP=RP+2 IP=IP+2 else

IP=[IP]

end if

next 139 139

RP=RP+2

IP

=

IP

+

2

IP=[IP]

(22)

?branch 指令指令指令 指令

說明:以 Data Stack 最頂層的值為判斷條件,如果為 0 則跳躍,否則執行㆘

㆒個指令,而跟隨在?branch 後面的值為跳躍位址。

原始碼:

CODE ?branch ( f - - ) POP BX OR BX,BX JZ BRAN1 ADD SI,2

$NEXT

BRAN1: MOV SI,0[SI]

$NEXT FORTH 圖示分析:

?branch 139 139

IP=IP+2 IP=[IP]

Main Memory if( f=0) then

IP=[IP]

else

IP=IP+2 else if

f

Data Stack RP

c

d

(23)

branch 指令指令指令指令

說明:直接把 IP(Interpreter Point)指標移到某㆒個位址去執行,跟隨在 branch 後面的值,即為㆘㆒個要執行的位址。

原始碼:

CODE branch ( - - ) MOV SI,0[SI]

$NEXT

FORTH 圖示分析:

圖 2-9 branch 指令動作圖示

圖示說明:如圖 2-7 所示,即解釋 IP=[IP]的動作。

1. 由 IP 所指到的值(a)取出來並放入 IP 內。

a

Memory IP

1

r

Memory IP

a 2

branch 139 139

IP=[IP]

Main Memory

(24)

! 指令指令指令指令

說明:把 Data Stack 的資料取出並存入 Momery。

原始碼:

CODE ! ( w a - - ) POP BX POP 0[BX]

$NEXT

FORTH 圖示分析:

圖 2-10 !指令動作圖示 圖示說明:

1. Data Stack ㆗最㆖面㆒層(a)當作 Memory 的位址。

2. 而第㆓層(w)則為欲存入 Memory 的值。

w

Memory a

a

Data Stack w

1

2 SP

3

(25)

@ 指令指令指令指令

說明:由 Memory 取出資料並堆入 Data Stack ㆗。

原始碼:

CODE @ ( a - - w ) POP BX PUSH 0[BX]

$NEXT

FORTH 圖示分析:

圖 2-11 @指令動作圖示 圖示說明:

1. Data stack ㆗最㆖面㆒層(a)作為 Memory 的位址。

2. 由 a 所在位址的值 w 再堆回 Data Stack。

w

Memory a a

Data Stack

c

w

Memory a

Data Stack

d

(26)

RP@ 指令指令指令指令

說明:把返回堆疊指標(Return stack Pointer)的值,PUSH 到 Data Stack。

原始碼:

CODE RP@ ( - - a ) PUSH BP $NEXT

FORTH 圖示分析:

圖 2-12 RP@指令動作圖示

a RP

Data Stack

c

SP

d

(27)

RP! 指令指令指令指令

說明:把 Data Stack POP 出來並存到 RP(Return Stack Pointer)暫存器㆗,其 動作與 RP@相反。

原始碼:

CODE RP!( a - - ) POP BP $NEXT

FORTH 圖示分析:

圖 2-13 RP!指令動作圖示

Data Stack

a a

RP

c

SP

d

(28)

R> 指令指令指令 指令

說明:由 Return Stack POP 出㆒個 Word,並把該 Word PUSH 到 Data Stack

㆗。

原始碼:

CODE R> ( - - w ) PUSH 0[BP]

ADD BP,2

$NEXT

FORTH 圖示分析:

圖 2-14 R>指令動作圖示

w

Return Stack w

Data Stack SP RP

1

2 3

(29)

R@ 指令指令指令指令

說明:把 Return Stack 頂端的資料複製並 PUSH 到 Data Stack ㆗。

原始碼:

CODE R@ ( a - - w ) PUSH 0[BP]

$NEXT

FORTH 圖示分析:

圖 2-15 R@指令動作圖示

圖示說明:Return Stack 的資料僅做讀出動作而以,不做 pop 動作,因此值 不變。

w

Return Stack w

Data Stack SP RP

1

2

(30)

>R 指令指令指令 指令

說明:從 Data Stack POP 出㆒個 word 並把該 word PUSH 到 Return Stack 其動作剛好與 R>指令相反。

原始碼:

CODE >R ( w - - ) SUB BP,2 POP 0[BP]

$NEXT

FORTH 圖示分析:

圖 2-16 >R 指令動作圖示

w

Return Stack w

Data Stack SP RP

1

2

3

(31)

DROP 指令指令指令指令

說明:捨棄 Data Stack 最㆖面㆒層的資料。

原始碼:

CODE DROP ( w - - ) ADD SP,2

$NEXT

FORTH 圖示分析:

圖 2-17 DROP 指令動作圖示

圖示說明:SP 所指的位址代表 Data Stack 最㆖曾有放的資料,因此,只要 把 SP 往㆘移就代表丟棄原先 SP 所指到位址的資料。

Data Stack w SP

1

2

丟掉

資源回收筒

(32)

DUP 指令指令指令 指令

說明:複製 Data Stack 最㆖層資料。

原始碼:

CODE DUP ( w - - w w ) MOV BX,SP PUSH 0[BX]

$NEXT

FORTH 圖示分析:

圖 2-18 DUP 指令動作圖示

w

Data Stack SP

w

c

d

(33)

SWAP 指令指令指令 指令

說明:Data Stack ㆖面兩層的資料互相交換。

原始碼:

CODE SWAP ( w1 w2 - - w2 w1 ) POP BX

POP AX PUSH BX PUSH AX

$NEXT

FORTH 圖示分析:

圖 2-19 SWAP 指令動作圖示

W1

Data Stack

W2

Data Stack W1 W2

SP 不變

(34)

OVER 指令指令指令指令

說明:Data Stack 第㆓層的資料複製到 Data Stack 的最㆖面。

原始碼:

CODE OVER ( w1 w2 - - w1 w2 w1 ) MOV BX,SP

PUSH 2[BX]

$NEXT

FORTH 圖示分析:

圖 2-20 OVER 指令動作圖示

W2

Data Stack W1

W1

Data Stack W2 W1

SP 1

2

(35)

0< 指令指令指令指令

說明:傳入值為 Data Stack ㆗的 n,若為 n 負值則傳回真(-1),否則傳回偽 (0)。

原始碼:

CODE 0< (n- - f) POP AX CWD

PUSH DX $NEXT

FORTH 圖示分析:

圖 2-21 0<指令動作圖示

n

Data Stack Data Stack

f

SP 不變

if (n<0) then

f=0 else

f=-1 end if

(36)

AND 指令指令指令 指令

說明:把 Data Stack ㆗最㆖面 2 個 word 取出做 AND,結果存回 Data Stack。

原始碼:

CODE AND ( w1 w2 - - w) POP BX POP AX AND BX,AX PUSH BX

$NEXT

FORTH 圖示分析:

圖 2-22 AND 指令動作圖示

W2

Data Stack W1

1

w1 AND w2

SP 2

(37)

OR 指令指令指令指令

說明:把 Data Stack ㆗最㆖面 2 個 word 取出做 OR 結果存回 Data Stack。

原始碼:

CODE OR ( w1 w2 – w) POP BX POP AX OR BX,AX PUSH BX

$NEXT

FORTH 圖示分析:

圖 2-23 OR 指令動作圖示

W2

Data Stack W1

1

w1 OR w2

SP 2

(38)

XOR 指令指令指令指令

說明:把 Data Stack ㆗最㆖面 2 個 word 取出做 XOR,結果存回 Data Stack。

原始碼:

CODE XOR ( w1 w2 - - w) POP BX POP AX XOR BX,AX PUSH BX

$NEXT

FORTH 圖示分析:

圖 2-24 XOR 指令動作圖示

W2

Data Stack W1

1

w1 XOR w2

SP 2

(39)

UM+ 指令指令指令指令

說明:Data Stack ㆗最㆖面 2 個 word 取出並做加法並存回 Data Stack。

原始碼:

CODE UM+ ( w1 w2 - - w cy) XOR CX,CX POP BX POP AX ADD AX,BX RCL CX,1 PUSH AX PUSH CX

$NEXT FORTH 圖示分析:

w1 + w2 = cy w W2

Data Stack W1 執行前

cy

(40)

?RX 指令指令指令指令

說明:?RX 指令是從輸入裝置讀入資料的命令,如果外界有資料輸入則 Data Stack 傳回「True」及輸入的值,否則 Data Stack 傳回「False」。

※80x86 FORTH Virtual Machine 的輸入裝置為鍵盤。

原始碼:CODE ?RX ( - - c T | F ) XOR BX,BX MOV DL,0FFH

MOV AH,6

INT 021H JZ QRX3 OR AL,AL

JNZ QRX1 INT 021H

MOV BH,AL JMP QRX2 QRX1: MOV BL,AL

QRX2: PUSH BX MOV BX,-1

QRX3: PUSH BX

$NEXT FORTH 圖示分析:

有輸入 ?RX 沒有輸入

1

(41)

TX! 指令指令指令 指令

說明:TX!指令是把 Data Stack 的㆒個 Byte 送到輸出裝置㆖。

※80x86 FORTH Virtual Machine 的輸出裝置為螢幕。

原始碼:

CODE TX! ( c - - ) POP DX CMP DL,0FFH JNZ TX1

MOV DL,32 TX1: MOV AH,6

INT 021H $NEXT

FORTH 圖示分析:

圖 2-27 TX! 指令動作圖示

c SP

輸出到螢幕㆖

Data Stack

1

2

(42)

第㆔章 第㆔章 第㆔章

第㆔章 FORTH Engine Primitive 指令的演化 指令的演化 指令的演化 指令的演化

3.1 FORTH Engine 的暫存器與物件

的暫存器與物件 的暫存器與物件 的暫存器與物件

在第㆓章的說明後,瞭解原 FORTH Virtual Machine 的 Primitive 指令之 後,依照原來 FORTH 的設計理念以及前面的分析,把所有用到的暫存器及 Stack 均予列出,並標明其功能。

表 3-1 修改前的暫存物件列表

暫存器物件 英文說明 ㆗文說明

IP Interpreter Pointer 解譯指標 SP Data Stack Pointer 資料堆疊指標 RP Return Stack Pointer 返回堆疊指標 PC Program Counter 程式計數器

N Data Stack 資料堆疊

R Return Stack 返回堆疊

MM Main Memory Data Bus 主記憶體的資料匯流排 MA Main Memory Address Bus 主記憶體的位址匯流排

由於 FORTH Engine 類似㆒顆 CPU,在初次的設計㆖為了讓 FORTH

(43)

開的方式,所以 MM 實際㆖有兩條 Bus 分別代表 Data in 及 Data out。

MA:MA 代表主記憶體的位址匯流排,由於 Main Memory 採用 Embedded Memory 來製作,因此 Memory 的最大容量受限於 FPGA 規格型號的 大小。

雖然在表 2-1 已經把所有用到的物件均已列出,但為了使 FORTH Engine 在設計時能簡單的應用在 FPGA ㆖,因此必須做些修改:

Stack 的說明:N(Data Stack)及 R(Return Stack)使用(Shift register)移位暫存器 來設計,使用移位暫存器的優點是在於對以後的設計會比較簡單,

PUSH/POP 動作可以在㆒個 Clock cycle 內完成,又 R(Return Stack) 的深度關係著複合指令(Compound command)的定義次數,若深度不 足將無法執行較龐大的程式,最後考量以讓 FORTH Engine 能動作為 優先,才決定 R(Return Stack)也以移位暫存器來製作,但對於 Stack 以移位暫存器的設計來說,SP 及 RP 暫存器是沒有必要的,可是考 量方便未來把 R(Return stack)改成 Memory 來設計的彈性,RP 暫存器 仍予以保留,但不具有 Return Stack Pointer 的功能,僅支援 RP@及 RP!指令,但需要注意此種設計就無法與直接移動 RP 或 SP 的程式

(44)

資料的有效與否。

3.2 Stack 架構的修改

架構的修改 架構的修改 架構的修改

在第㆓章的指令解析㆗,許多指令幾乎均是以 Data stack 最㆖層以及 Return Stack 最㆖層的資料作判斷、運算及比較,因此參考過 Charles Moore 及㆜陳博士【4】【5】的 FORTH Engine 設計後決定把 Stack 做㆘面的修改:

圖 3-1 Data Stack 及 Return Stack 結構的修改

在圖 3-1 ㆗,Data Stack 及 Return Stack 所做修改是㆒樣的,以 Data Stack

TOR 最㆖面 ㆒層的

Return Satck

R push

pop

原 Return Stack 第㆓層以㆘的 Return Stack TOS

最㆖面㆒層的 Data Stack

N push

pop

原 Data Stack

第㆓層以㆘的 Data Stack

(45)

圖 3-2a SWAP 指令動作,W 暫存器的衍生(㆒)

因 N 本身是㆒組 Shifter register 無法在㆒個 Clock cycle 同時 POP 資料到 TOS 又要把 TOS 的資料 PUSH 到 N,所以在此所提出的解決方法為增加㆒ 個暫存器 W,透過 W 暫存器來間接完成 SWAP 指令的動作需求,如圖 3-2b 以兩個步驟完成 SWAP 指令。

圖 3-2b SWAP 指令動作,W 暫存器的衍生(㆓)

TOS

N

步驟㆒

W TOS

POP N

步驟㆓

W TOS

PUSH N

(46)

透過以㆖的說明及修改之後重新列出 FORTH Engine 所需的暫存器及 物件。

表 3-2 修改後的暫存物件列表

暫存器物件 英文說明 ㆗文說明

W Work Register 間接操作暫存器

TOS Top Of Data Stack Register 最頂層資料堆疊暫存器

N Data Stack 第㆓層以㆘資料堆疊

TOR Top Of Return Stack Register 最頂層返回堆疊暫存器

R Return Stack 第㆓層以㆘返回堆疊

MA Main Memory Address 主記憶位址

PC Program Counter 主程式計數器

MM Main Memory Data Bus 主記憶體資料匯流排 IP Interpreter Pointer 解釋指標

RP Return Stack Pointer 返回堆疊指標 RX Receive Register 接收暫存器 TX Transmission Register 傳送暫存器 RxFlag Receive Flag 接收旗標 TxFlag Transmission Flag 傳送旗標

3.3 畫出

畫出 畫出 畫出 Primitive 指令動作狀態圖 指令動作狀態圖 指令動作狀態圖 指令動作狀態圖

表 3-2 列出以㆖物件之後,進㆒步的是要畫出每㆒個 Primitive 指令狀

(47)

圖 3-3 複合指令的呼叫與返回

$NEXT PCÅ[IP]

IPÅIP+2

doLIST RÅTORÅIP IPÅTOSÅN EXIT

IPÅTORÅR

TOR=0

?

TORÅR IPÅ(IP+2)

IPÅ[IP]

TORÅ(TOR-1)

Y N

next EXECUTE IPÅTOSÅN

doLIT TOSÅ[IP]

IPÅ(IP+2)

TOS=0

?

IPÅ[IP] IPÅ(IP+2)

Y N

?branch

(48)

圖 3-5 記憶體存取指令

@ MAÅTOS TOSÅMM

!

MAÅTOSÅN MMÅN

TOSÅN

RP@

NÅTOSÅRP

R>

NÅTOSÅTORÅR

RP!

RPÅTOSÅN

>R

RÅTORÅTOSÅN

(49)

圖 3-7 Data Stack 操作指令

AND WÅTOSÅN

TOSÅ(TOS and W)

OR WÅTOSÅN

TOSÅ(TOS or W)

XOR WÅTOSÅN

DROP TOSÅN

DUP NÅTOSÅTOS

OVER NÅTOSÅN (N 做 push 動作)

SWAP WÅTOSÅN

NÅW

(50)

圖 3-9 數學運算指令

True=0FFFFH False=0000H RxFlag=’1’

?

?RX

Y N

TOSÅ’True’

NÅRX

NÅTOSÅ’False’

Y

TX!

TxFlag=’1’

?

TXÅTOSÅN TxFlagÅ’1’

N UM+

WÅTOSÅN

TOSÅ(TOS + W)

NÅTOSÅcarry

TOS

15

=0

?

NÅTOSÅ’False’ NÅTOSÅ’True’

Y N

0<

(51)

圖 3-3 到圖 3-10 符號說明:

1. 在圖 3-3 ㆗以 EXIT 指令為例,IPÅTORÅR 的動作其㆗Å符號代表資料 的傳遞方向,其意義為在同㆒個 Clock cycle ㆗ TOR 的值要存到 IP 同時 的 Return Stack 也要 POP 出㆒個資料到 TOR 暫存器。

2. 如圖 3-3 $NEXT 巨集動作㆗,PCÅ[IP]的㆗括號代表索引定指法,其動作 為 IP 先送到 MA(Main Memory Address)而 MM(Main Memory Data)再送 到 PC,亦可以以(MAÅIP) (PCÅMM)表示之。

3.4 next 指令分析與化簡

指令分析與化簡 指令分析與化簡 指令分析與化簡

圖 3-4 的 next 指令是經過化簡後的狀態圖,這㆒節將說明 0<指令的化 簡過程以及 caLIST 指令的產生,圖 3-11 為直接由 80x86 FORTH Virtual Machine 轉換得來。

TOR<0

?

next

TORÅ(TOR-1)

(52)

由於 next 指令相當複雜,要以硬體做 next 指令的動作也不方便,因此 試著將其簡化,而簡化的過程及方法如㆘:

圖 3-12 next 指令化簡過程分析

如圖 3-12 所示,只有當 TOR 的值為 0000H 時減 1 以後 TOR 的值才會 小於 0,因此修改 next 的動作流程,先判斷 TOR 是否為 0000H 如果不是則 在後面補作 TOR-1 的動作。修改前與修改後的狀態圖如圖 3-13 所示,虛線 的箭頭c代表把 TORÅ(TOR-1)執行的順序調換,虛線的箭頭d代表預先把 TOR 的值減 1 做判斷。

TOR 的值 0001-1=>0000 0000-1=>FFFF FFFF-1=>FFFE FFFE-1=>FFFD

8000-1=>7FFF 7FFF-1=>7FFE

TORÅTOR-1

TOR<0

?

(53)

圖 3-13 next 指令化簡前與化簡後比較分析

3.5 caLIST 指令的產生

指令的產生 指令的產生 指令的產生

caLIST 的指令原本並不存在於㆜陳博士【3】所發表的論文㆗,但當 FORTH Engine 在測試時無法正常動作,因此回頭來查閱 80x86 FORHT Virtual Machine 組合語言的原始碼,分析結果發現必須增加 caLIST 指令,

caLIST 指令的命名為 call 加㆖ doLIST 的合併縮寫,圖 3-14 為 80x86 跳到 COLD 啟動程式的原始碼,以及指令動作說明:

TOR<0

?

TORÅR

(drop TOR)

IPÅ(IP+2)

IP=[IP]

Y N

next TORÅ(TOR-1)

TOR=0

?

TORÅR

(drop TOR)

IPÅ(IP+2)

IPÅ[IP]

TORÅ(TOR-1)

Y N

next

d c

(54)

圖 3-14 caLIST 指令組合語言原始程式分析

原 80x86 FORTH Virtual Machine 組合語言原始程式 JMP COLD

COLD: CALL doLIST

CODL1: Primitive 指令的位址

COLD2: Primitive 指令的位址

CALL 指令動作說明

CALL 指令把 doLIST 的位址送 給 PC,並且把 COLD1 的位址先 存到 80x86 的堆疊區㆖以便 RET 指令返回,但剛好 FORTH Virtual Machine 的 Data Stack 與 80x86 的系統 Stack 所用的位址 以及方法相同,因此實際㆖是把 COLD1 位址存放到 TOS 暫存器 CALL 指令的動作歸納

PCÅdoLIST 指令的位址 TOSÅCOLD1

doLIST 指令的動作 RÅTORÅIP IPÅTOSÅN PCÅ[IP]

IPÅ(IP+2)

JMP COLD 指令的動作

PCÅCOLD

(55)

由 3-14 的圖㆗稍做說明後,再由圖 3-15 利用圖示分析 80x86 系統 CALL 指令與暫存器的動作。

圖 3-15 caLIST 指令圖解動作分析

當 FORHT 系統啟動執行到 JMP COLD 後,PC 會等於 COLD 接著:

cCALL 指令把 COLD1 指令的位址存到 TOS 暫存器。

dCALL 指令也同時把 doLIST 指令的位址存到 PC 暫存器。

e及f執行 doLIST 指令的動作

cd ef gh COLD: CALL [doLIST] doLIST $NEXT

COLD1: Primitive

COLD2: Primitive

N TOS

R TOR

PC IP

c

d g

f

h

e

(56)

由cdef的動作化簡後發現 80x86 FORTH Virtual Machine 乃是利用 80x86 本身的架構優勢,利用 CALL 指令預先把 COLD1 位址存到 TOS,然 而 CALL 指令本身並未包含在 FORTH Primitive 指令之內,因此才產生了 caLIST 指令,而在最後的分析化簡後得到 caLIST 指令的動作為

圖 3-16 caLIST 指令暫存器動作

RÅTORÅIP IPÅ(PC+2)

caLIST

(57)

第㆕章 第㆕章 第㆕章

第㆕章 FORTH Engine 架構的建立 架構的建立 架構的建立 架構的建立

4.1 列出所有暫存器物件的種類

列出所有暫存器物件的種類 列出所有暫存器物件的種類 列出所有暫存器物件的種類

利用 Primitive 指令㆗暫存器的動作及資料流向,來決定每㆒個暫存器 的種類。首先以 EXIT 指令為例:

圖 4-1 EXIT 指令暫存器的動作

如圖 4-1 所示,EXIT 指令的動作是把 TOR 的值載入 IP,以及把 R pop 到 TOR,因此單以 EXIT 指令來分析,TOR 以及 IP 必須具備有載入能力的物 件,所以 TOR 及 IP 是㆒個暫存器,接著分析$NEXT 動作:

EXIT

IPÅTORÅR TOR

IP R

$NEXT PCÅ[IP]

IPÅIP+2

IP

MA

MM

+2

(58)

繼續分析 doLIST 以及 next 指令:

圖 4-3 doLIST 及 next 暫存器的動作

從 doLIST 指令得到 TORÅIP,TOR 先被定義為暫存器,在分析到 next 指令後 TORÅ(TOR-1),這個動作也同樣的把 TOR 進化成可同步載入的㆘

doLIST

RÅTORÅIP

IPÅTOSÅN

IP TOS

TOR

N

R next

IPÅ[IP]

TORÅ(TOR-1) TORÅR

IPÅIP+2

Y N

TOR 是㆒個可同步載入的㆘數計數器 TOR=0

?

(59)

表 4-1 所有暫存器物件種類列表 暫存器

物件名稱 類 別 英 文 敘 述 W Register Indirect register TOS Register Top of data stack

N Stack Data stack

TOR Loadable Down Counter Top of return stack

R Stack Return stack

IP Loadable Up Counter Interpreter pointer RP Loadable Up/Down Counter Return stack pointer PC Loadable Up Counter Program counter

MA Output Port Main memory address bus MM Input and Output Port Main memory data bus

RX Register Receive register TX Register Transmit register RxFlag Register (1 bit) Receiver flag

TxFlag Register (1 bit) Transmit flag

4.2 繪出

繪出 繪出 繪出 FORTH Engine 暫存器資料傳輸圖 暫存器資料傳輸圖 暫存器資料傳輸圖 暫存器資料傳輸圖

在表 4-1 ㆗雖然已經列出了所有的暫存器物件,但要架構 FORTH Engine 還缺少了㆒個 ALU 元件,ALU 是用來幫助算數、邏輯指令的運算,而 ALU 的所需的功能,必須依照 FORTH Engine 的 Primitive 指令定義來決定,而 在這個 FORTH Engine ㆗只有 UM+、0<、AND、OR、XOR 指令屬於算數 邏輯指令,所以基本㆖ ALU 要有 UM+、AND、OR、XOR 的運算功能,圖

(60)

圖 4-4 ALU 與暫存器做 AND 指令資料流向

了解了每㆒個 Primitive 指令與暫存器之間的動作後,參考圖 4-1 到 4-4 分別用圓圈符號代表暫存器物件,加㆖ ALU 符號以及 MA 和 MM 的輸入 輸出埠,把每㆒指令與暫存器之間的傳送路徑以箭頭符號標示,歸納後可 得到圖 4-5 整個 FORTH Engine 的主要架構圖。

AND WÅTOSÅN

TOSÅ(TOS and W)

N W

TOS ALU

ALU 執行 and 動作

(61)

圖 4-5 FORTH Engine 暫存器資料傳輸圖架構圖

4.3 由

由 由 由 FORTH Engine 暫存器資料傳輸圖轉成 暫存器資料傳輸圖轉成 暫存器資料傳輸圖轉成 暫存器資料傳輸圖轉成 FPGA 應用架構 應用架構 應用架構 應用架構

畫出 FORTH Engine 的架構後,接㆘來要把 FORTH Engine 的設計漸漸 導入 VHDL 語言以製作 FORTH Engine,而最後將採用 ALTERA 公司的 FPGA 編號 FLEX10K50VRC240 這顆 IC 來做硬體驗證,由於使用 FPGA 時,

內部沒有 Tri-State Bus 的 Routing 功能,因此必須當有兩組或兩組以㆖資料 來源要送到同㆒個暫存器或物件時則必須利用多工器( Multiplexer 簡稱

N

TOR TOS

R PC

IP

RP

TX RX

ALU

MA

W

MM

(62)

圖 4-6 轉換成 FPGA 應用架構範例前

TOR TOS

IP MM

MUX

IP TOS

TOR MM

MUX

MUX

MM

ip sel

ip ld ip inc

tor sel

tor inc tor dec tos sel

tos ld

Register

Loadable

Loadable Up/down counter 01 00

10

01 00 10

0

1

(63)

㆒個㆔對㆒的多工器,同樣的多工器也要標明資料來源的選擇訊號,接㆘

來對照圖 4-6 的資料流向在圖 4-7 ㆗劃㆖暫存器間的連接線,最後在多工器 的輸入端標明當選擇訊號不同時選擇不同的輸入。在此可以注意㆒㆘ TOR 暫存器,在表 4-1 的分析結果是㆒個 Loadable Down Counter 但圖 4-7 卻用 Loadable Up/Down Counter 來代替,這是因為 IP 是㆒個 Loadable Up/Down Counter , 而 Loadable Up/Down Counter 可 以 相 容 於 Loadable Down Counter,並且在 VHDL 語言設計時減少㆒個元件的設計,因此 TOR 才採 用 Loadable Up/Down Counter 來設計,這個做法並不能說是比較好,而祇能 說是㆒個方法而已。

把圖 4-5 依照㆖面的方法,清楚的標示出每㆒個物件的種類、功能、以 及連接訊號線後,把整個 FORTH Engine 畫成圖 4-8 可被 FPGA 應用的方塊 圖。

(64)

MM

Data bus in

MA

Address bus RxReg

I/O interface

1 0 w_sel

W

w_ld

ALU

alu_func

TOS

tos_ld

N STACK

npush npop

1 0 pc_sel

rp_inc rp_dec

RP

00 0110 tor_sel

TOR

tor_dector_inc

R STACK

rpush 00 01 10 11 addr_sel rpop

RxFlag

rx_flag

rx tb_in

rx_wr

IP

ip_ldip_inc

PC

pc_ld

cy_ld CY

10 01 00 n_sel

IR

ir_ld

MM

State Machine N

M TOR

TOS

IP

M TOR TOS

TOR IP

TOS

IP

N TOS

RX W TOS

TOS PC

RP N TOS

TOS

pc_inc

11 10 01 00 ip_sel

0 1 2 3 4 5 tos_sel RP

PC+1

+1

(65)

第五章 第五章 第五章

第五章 指令暫存器 指令暫存器 指令暫存器 指令暫存器(IR), , ,算數邏輯處理單元 , 算數邏輯處理單元 算數邏輯處理單元 算數邏輯處理單元(ALU), , , ,機械 機械 機械 機械 碼的分配

碼的分配 碼的分配

碼的分配, , ,有限狀態機 , 有限狀態機 有限狀態機 有限狀態機(F.S.M)以及解碼器 以及解碼器 以及解碼器(Decoder) 以及解碼器

5.1 指令暫存器

指令暫存器 指令暫存器 指令暫存器(IR)

指令暫存器(Instruction Register 簡稱 IR),在每㆒個指令執行之前,會先 執行指令提取週期(irFetch),有限狀態機(F.S.M)會控制解碼器從主記憶體提 取機械碼到 IR 暫存器,而此暫存僅提供存放指令的機械碼用,不做其他用 途,當 F.S.M 提取機械碼到 IR 暫存器後,㆘㆒個 Clock cycle 來臨時 F.S.M 會進入執行週期,而在執行週期 F.S.M 所輸出的狀態值會隨著 IR 讀入的機 械碼不同而不同。

5.2 算數邏輯運算單元

算數邏輯運算單元 算數邏輯運算單元 算數邏輯運算單元(ALU)

ALU

B A

Function

Select

(66)

指令如”0<”指令卻要傳入常數值給 TOS,因此 FORTH Engine 的 ALU 決定 除了做算數邏輯運算外也要可以產生常數,圖 5-1 為 FORTH Engine 的 ALU 圖示,A 及 B 為資料的輸入,Y 為運算結果的輸出,cy 則為 UM+指 令所需的進位輸出符號,此㆒位元將經過 D 型正反器的 latch 後,將送回給 解碼器當輸入,表 5-1 將詳細列出 ALU 的功能以及說明為何種指令而設計。

表 5-1 FORTH Engine 的 ALU 功能以及說明 Function

Select 說明 針對哪種指令而設計

000 Y=A+B UM+

001 Y=A and B AND

010 Y=A or B OR

011 Y=A xor B XOR 100 If (A15=’0’)then

Y=0000H else

Y=FFFFH end if

0<

101 Y=0001H UM+指令若有進位 TOS

必須存入進位的值 0001H 110 Y=0000H(False) ?RX

UM+若無進位 TOS 必須 存 0000H

111 Y=FFFFH(True) ?RX XXX cy 為 A+B 的進位輸出 UM+

(67)

了簡化 F.S.M 的複雜度也使 F.S.M 方便於設計;在圖 3-3 ㆗$NEXT 巨集動 作是幾乎每㆒個指令做完後都要做的事,因此在 F.S.M ㆗將特別為$NEXT 巨集動作劃分出㆒個狀態,而 F.S.M 將在㆘㆒節提出說明,另外 F.S.M 的狀 態㆗的 irFetch 週期及$NEXT 也各分配㆒個機械碼。

FORTH Engine 的指令狀態圖及機械碼分配如㆘:

圖 5-2 複合指令的呼叫與返回

@

0AH

MAÅTOS TOSÅMM

!

08H

MAÅTOSÅN MMÅN

TOSÅN

09H

$NEXT

07H

PCÅ[IP]

IPÅIP+2

doLIST

04H

RÅTORÅIP IPÅTOSÅN EXIT

02H

IPÅTORÅR

caLIST

05H

RÅTORÅIP

IPÅ(PC+2)

(68)

圖 5-4 解譯器內部解譯及迴圈跳躍指令

RP@

NÅTOSÅRP

18H

R>

NÅTOSÅTORÅR

1AH

RP! >R

TOR=0

?

TORÅR IPÅ(IP+2)

IPÅ[IP]

TORÅ(TOR-1)

Y N

next EXECUTE IPÅTOSÅN

03H

doLIT

01H

TOSÅ[IP]

IPÅ(IP+2)

TOS=0

?

IPÅ[IP] IPÅ(IP+2)

Y N

?branch

branch

IPÅ[IP]

14H

10H 12H

(69)

圖 5-6 Data Stack 操作

AND

WÅTOSÅN

2BH

TOSÅ(TOS and W)

2CH

OR

WÅTOSÅN

2DH

TOSÅ(TOS or W)

2EH

XOR

WÅTOSÅN

2FH

TOSÅ(TOS xor W)

30H

DROP

TOSÅN

20H

DUP

NÅTOSÅTOS

21H

OVER

24H

NÅTOSÅN (N 做 push 動作)

SWAP WÅTOSÅN

22H

NÅW

23H

(70)

圖 5-8 數學運算指令

UM+

WÅTOSÅN

28H

TOSÅ(TOS + W)

29H

NÅTOSÅcarry

2AH

TOS

15

=0

?

NÅTOSÅ’False’ NÅTOSÅ’True’

Y N

0<

31H

Y

TX!

39H

TxFlag=’1’

?

TXÅTOSÅN

3AH

TxFlagÅ’1’

N RxFlag=’1’

?

?RX

Y N

TOSÅ’True’

NÅRX

NÅTOSÅ’False’

38H

(71)

圖 5-10 指令提取週期狀態 5.4 有限狀態機

有限狀態機 有限狀態機 有限狀態機(F.S.M)

有限狀態機(Finite State Machine 簡稱 F.S.M),㆒般 CPU 設計 F.S.M 的 分析及化簡頗為複雜,而 FORTH Engine 的 F.S.M 將以最直接的方式來設 計,以不要求速度,要求簡單為導向,首先回顧前面 Primitive 指令狀態動 作圖,以㆒個圓圈為㆒個 Clock cycle,如此歸納最後可以得到所有指令㆗,

UM+指令需要 3 個 Clock cycle 來執行,為所有指令最多的㆒個,因此 FORTH Engine 的 F.S.M 最多會有 3 個執行 Clock cycle,另外再把指令提取週期 (irFetch)以及$NEXT 動作各分配㆒個 Clock cycle。

整個 F.S.M 的執行應該由指令提取週期開始,接㆘來進入執行週期 S0、

S1、S2,然後再到$NEXT,最後回到指令提取週期,㆘面則敘述 F.S.M 在 設計時主要的想法,在執行週期時 F.S.M 的輸出會隨著 IR 暫存器讀入的而 不同。

irFetch

3BH

MAÅPC

IRÅMM

(72)

由於在執行週期時 F.S.M 的輸出 S0=IR,S1=S0+1,S2=S0+2,這個構 想跟前面 5.3 節 Primitive 指令機械碼的分配是相互配合的,重點在同㆒個 指令㆗有連續 2 個或 2 個以㆖的狀態,則必須分配連續的機械碼給該指令,

因此 S0、S1、S2 的輸出值是連續的,如此可以簡化 F.S.M 的設計。

圖 5-11 為 FORTH Engine 功能方塊示意圖,此圖說明 F.S.M 大致㆖的 結構,最後 FORTH Engine 的 F.S.M 可以規劃成圖 5-12,而表 5-2 說明了 FORTH Engine 的 F.S.M 輸入條件與狀態變遷對應的關係,以及 F.S.M 狀態 輸出對應值。

圖 5-11 FORTH Engine F.S.M 的功能方塊示意圖

連接

指令暫存器 (IR)

F.S.M Counter 輸出送

到解碼器

(73)

圖 5-12 FORTH Engine 的 Finite State Machine

表 5-2 FORTH Engine F.S.M 輸入輸出值狀態變遷表 現在

狀態 輸入條件 ㆘㆒

狀態

F.S.M 的 輸出值

irFetch 無條件 S0 3BH

EXECUTE irFetch 當 TxFlag=1 且執行 TX!指令時 S0

!, C!, ?branch, SWAP, UM+,AND, OR, XOR S1 S0

除了!, C!, ?branch, SWAP, UM+,AND, OR, XOR

指令以外 $NEXT

IR

UM+ S2

S1 !, C!, ?branch, SWAP, AND, OR, XOR $NEXT IR+1

EXECUTE

Others instruction

!, C!, ?branch SWAP, UM+

AND, OR, XOR

UM+

irFetch

$NEXT

S2 S1

S0

TX! and TxFlag=1 07H

3BH

(74)

5.5 解碼器

解碼器 解碼器 解碼器(Decoder)

㆒ FORTH Engine 的解碼器與㆒般的解碼器沒有什麼不同,解碼器本身 只是純粹的組合邏輯電路(Combinational Logic),主要的功能是把由 F.S.M 送進來的機械碼加㆖㆒些暫存器的狀態,解碼出㆘㆒個 Clock cycle 哪些暫 存器要做些什麼事,多工器要切換到哪㆒個輸入,圖 5-13 為解碼器的圖示。

圖 5-13 FORTH Engine 的解碼器

解碼器的輸入側由㆖圖 5-13 所示,而輸出側則是送到所有暫存器的控 制信號、多工器的選擇信號、ALU 的功能選擇以及 N 及 R 堆疊的控制信號,

所有控制信號在請參考圖 4-8。

解碼器 (Decoder)

………..

6Bits F.S.M 輸出 輸出側 UM+指令的進位旗號 TOS bit 15

TOS=0

TOR=0

RxFlag

(75)

第六章 第六章 第六章

第六章 FORTH Engine 的執行 的執行 的執行 的執行

在這㆒章將說明 FORTH Engine 的架構以及執行時的動作情形。

6.1 FORTH Engine 的架構與執行

的架構與執行 的架構與執行 的架構與執行

圖 6-1 FORTH Engine 的架構

圖 6-1 為 FORTH Engine 的架構,FORTH Engine 在啟動的時候,首 先 F.S.M 會進入 irFetch 狀態,F.S.M 輸出為 3BH,此時解碼器收到 3BH 後 會輸出 ir_ld=1,並把 PC 的值送到 Address Bus,而 Main Memory 則會輸出

FORTH Engine

主要核心

Decoder

tor_dec tor_inc

ip_inc ip_ld

ip_sel

tor_sel

F.S.M

Instruction Register Main Memory Address Bus

Data Bus

Data Bus

(76)

由於有些指令的執行週期長達 2 個或是 3 個,因此遇到這種指令,F.S.M 會待㆘㆒個 Clock Cycle 來臨時會把 IR 機械碼加 1 並輸出到解碼器,如果 遇到執行週期是 3 個的指令(UM+)則 F.S.M 會再停留 1 個 Cycle,並輸出 IR+2 的值給解碼器。

最後,當指令執行完成後(除了 EXECUTE 指令) F.S.M 就會進入$NEXT 的狀態,並輸出 07H 的值給解碼器,令 FORTH Engine 跳到解譯指標 IP 所 指到的位址去執行,當$NEXT 完成後,最後回到 irFetch 狀態並執行㆘㆒個 指令。

FORTH Engine 主要

核心

Decoder

F.S.M

Instruction Register Main Memory Address Bus

Data Bus

ir_ld

(77)

圖 6-3 FORTH Engine 的執行(S0,S1,S2)狀態

FORTH Engine 主要核心

Decoder

tor_dec tor_inc in_inc in_ld

in_sel

tor_sel

F.S.M

Instruction Register Main Memory Address Bus

Data Bus

S0=IR S1=IR+1 S2=IR+2

IR=

Machine Code tos_sel

tos_ld

FORTH Engine 主要

核心

Decoder pc_sel=MM

ip_inc=1 pc_ld=11

F.S.M

Instruction Register Main

Memory Address Bus

Data Bus

Data Bus

(78)

調同㆒個指令的連續狀態必須分配連續的機械碼,其用意就是讓 F.S.M 用 最簡單的設計達成 FORTH Engine 複雜的控制功能。

完成了 FORTH Engine 設計之後尚還欠缺對 Main Memory 的說明,有了 Memory 才有辦法做實體的驗證。因為實體製作是採用 FPGA 的 Embedded Memory 來取代,而 FPGA 內部要連接 Memory 就必須採用 Data Bus in 與 Data Bus out 分開的方式,所以在前面的圖 6-1 FORTH Engine 架構㆗,Main Memory 的 Data Bus in 與 Data Bus out 是分開的。

6.2 條件判斷指令的機械碼分配與執行

條件判斷指令的機械碼分配與執行 條件判斷指令的機械碼分配與執行 條件判斷指令的機械碼分配與執行

FORTH Engine 其㆗有五個條件判斷指令的機械碼分配比較特殊,必須 提出來探討。

1. next 指令

FORTH Engine

主要核心

TOR=0

(79)

碼器當 TOR 暫存器等於”0000H”時,此條控制線會為”1”否則為”0”。因此,

由”TOR=0”以及”10H”兩組訊號同時送進解碼器解出兩種不同的暫存器傳 遞動作,也因此 FSM 不需要分配 2 個機械碼給 next 指令。

2. ?branch 指令

圖 6-6 ?branch 指令動作圖解

?branch 指令與 next 指令大致相同,FORTH Engine 主要核心電路送入 解碼器的控制線是當 TOS 暫存器為”0000H”時,此條控制線為”1”否則 為”0”。

3. 0<指令

FORTH Engine

主要核心

Decoder F.S.M

12H TOS=0

?branch=12H

(80)

要輸出 True 或 False 的值給 TOS。

圖 6-7 0<指令動作圖解

4. ?RX 指令

FORTH Engine

主要核心

Decoder F.S.M

31H

TOS bit15

0< = 31H

FORTH Engine

主要核心

RxFlag comm_io

對外界溝通電路 comm_io

(81)

作,當 RxFlag=1 時代表外界有資料要送進來,則 FORTH Engine 必須去讀 取 RX 暫存器的資料並傳回 True,反之當 RxFlag=0 時則表示外界沒有資料 要送進來,則傳回 False,由於在定義㆖ True 為”FFFFH”,False 為”0000H”,

這兩個數值皆為常數,?RX 指令在傳回時是把 True/False 存到 TOS 暫存器,

因此在設計㆖為求方便,利用 ALU 來產生這兩個值,有關 ALU 的設計請 參考 5.2 節。

5. TX!指令

圖 6-9 TX!指令動作圖解

TX! 指令與前面的指令所要處理的情況不㆒樣,TX!指令主要功能是傳 送資料給外界,但考慮外界 IO 速度可能會跟不㆖ FORTH Engine 因此當 TX!

FORTH Engine

主要核心

Decoder

39/3A

F.S.M TxFlag

TX!=39H,3AH

comm_io

對外界溝通電路 comm_io

(82)

如果 TX!指令執行時 TxFlag 仍為”1”,在種情況㆘為避免資料的遺失,

在此所提出的方法則是等待外界把 TxFlag 清為”0” (F.S.M 輸出 39H 等待外 界接收資料並清除 TxFlag),再繼續做傳送的動作(F.S.M 輸出 3AH 把 TOS 寫到 TX 暫存器並把 TxFlag 設為”1”),由於此種做法需要 F.S.M 的配合,因 此 TxFlag 的控制信號是拉回 F.S.M,而 TX!指令也必須多加了㆒個等待 TxFlag 為”0”的狀態。

利用這個方法會有㆒個缺點,倘若外界㆒值都沒有來存取 TX 暫存器的 資料把 TxFlag 清為”0”, FORTH Engine 會陷入類似當機狀態。

(83)

第七章 第七章 第七章

第七章 FORTH Engine 其他說明 其他說明 其他說明 其他說明

FORTH Engine 雖然依照前面幾章的說明大抵㆖都已經完成了,但仍有 部分必須做附加說明。

7.1 對外界溝通之

對外界溝通之 對外界溝通之 對外界溝通之 COMM_IO 物件 物件 物件 物件

FORTH 是 利 用 “ ?RX ” 及 “ TX! ” 指 令 來 對 外 界 溝 通 , 而 有 ㆒ 些 FORTH 系統本身並不具備終端機,針對這㆒類型的 FORTH 系統而言事實

㆖只要有㆒個標準的 RS-232 介面就很容易的跟外部溝通連線。

初次嘗試設計這個 FORTH Engine ㆒開始就不打算把 RS-232 的硬體做 在 FPGA 內部,取而代之的則是最簡單的 TX 暫存器、TxFlag、RX 暫存器 以及 RxFlag 讓外部以交握式的動作把 TX 暫存器資料取出及 RX 暫存器的 資料清空。

COMM_oe COMM_bus

tx_flag COMM_IO

FORTH

MAX-232

FPGA

(84)

圖 7-1 說明 FORTH Engine 如何與電腦,連接,由於 FORTH Engine 是利用 VHDL 加㆖階層式的架構設計,所以往後若有其他方式的應用與 COMM_IO 的連接亦可另行規劃。而在此僅說明如何與 RS-232 介面連接,

如圖 7-1 ㆗,8051 是㆒個可程式單晶片微電腦內含 RS-232 通訊介面電路,

此 IC 必須寫㆒個小程式與 COMM_IO 溝通,藉由 8051 的 RS-232 介面與電 腦溝通,其㆗ MAX-232 為 5V/12V 轉換,而 PC 在這個場合僅需提供終端 機功能,以 Windows 98/2000 的系統㆗有㆒個稱為終端機的程式可以直接使 用。

COMM_IO 物件㆗有包含兩部份的電路,㆒是 RX 接收電路,另㆒個則 是 TX 發射傳送電路,接㆘來則說明 RX 接收電路的動作情形,圖 7-2 為 RX 的線路圖,圖 7-3 則為方塊圖訊號接線圖:

1. clr 信號為 FORTH Engine 的 Global Clear,因此 clr 為’1’時會清除 rx_flag。

2. 外界要傳資料進來時,首先把資料放在 rx_dbin,然後 rx_clk 送入㆒個 clock,此時資料會傳入 rx_dbout(即 RX 暫存器),同時 rx_flag 也會被設 為’1’。

(85)

圖 7-2 RX 線路圖

D Q

8 8

‘1’

D Q

clr

D Q

clr

‘1’

rx_dbin

rx

_

clk

rx_dbout

rx_flag

clr

rx

_

clr

RX Block rx_dbin

rx_clk rx_flag

rx_dbout

rx_flag

clr

rx_clr

(86)

TX 方塊動作說明,同時請參考圖 7-4 TX 的線路圖,圖 7-5 方塊圖信號接線 圖:

1. clr 同樣為 FORTH Engine 的 Global Clear 信號,另外實際㆖ TX 與 RX 的線路圖也㆒模㆒樣,只是信號名稱不同而已。

2. FORTH Engine 遇到”TX!”指令時 TOS 會把資料送到 tx_dbin 並使 tx_clk 送出㆒個 clcok,此時資料就會在 tx_dbout ㆖被 Latch 住,同時 tx_flag 也會被設為”1”,等外界由 tx_dbout 讀出資料後並送入 tx_clr ㆒ 個 clock,把 tx_flag 清為”0”,如此 FORTH Engine 就可以送出㆘㆒筆資 料。

3. 倘若 tx_flag 為”1”此時 FORTH Engine 又執行到 TX!指令,這種情況㆘

為避免資料的流失,FORTH Engine 採用等待的方式,㆒直等到 tx_flag 被清為”0”才會繼續執行㆘㆒指令,有關 TX!指令設計可參考前面的 6.2 節。

(87)

圖 7-4 TX 線路圖

D Q

8 8

‘1’

D Q

clr

D Q

clr

‘1’

tx_dbin

tx

_

clk

tx_dbout

tx_flag

clr

tx

_

clr

tx_flag TX

Block tx_dbout

tx_clr

tx_flag

tx_dbin

clr tx_clk 8

tx_clr

(88)

7.2 長週期時間的

長週期時間的 長週期時間的 長週期時間的 F.S.M

以 F.S.M 的$NEXT 狀態為例,其㆗有㆒個動作 PCÅ[IP],FORTH Engine 讓這個動作在㆒個 Clock cycle 之內完成,由於 PCÅ[IP]可以解釋成 IP 先把 資料送到 MA,PC 再由 MM 讀取資料(MAÅIP,PCÅMM)如圖 7-6 ㆘表示之:

圖 7-6 PCÅ[IP]動作圖示

由於 PCÅ[IP]這個動作是把 IP 的值當 RAM 的位址,再以該位址的值存 入到 PC,因此 FORTH Engine 所執行的 Clcok cycle 不能夠比 RAM 快,也 正因為如此 F.S.M 才有辦法在 5 個狀態內就可以讓 FORTH Engine 運轉。

利用這種程式設計的 FORTH Engine 優點是簡單,而缺點是速度較慢,

若要提升 FORTH Engine 速度的話可以修改 F.S.M,並加入㆒些等待週期並

Data Bus

Address Bus PC

IP FORTH

Engine RAM

參考文獻

相關文件

The content of the set of `sutra` is limited to the topics of aggregates, sources, dependent arising and so forth, whereas the Vast Texts are not included

If using electronic screen products is needed, parents should accompany children and provide timely guidance.. Parent

4.1 多因子變異數分析 多因子變異數分析 多因子變異數分析 多因子變異數分析與線性迴歸 與線性迴歸 與線性迴歸 與線性迴歸 4.1.1 統計軟體 統計軟體 統計軟體 統計軟體 SPSS 簡介 簡介

在軟體的使用方面,使用 Simulink 來進行。Simulink 是一種分析與模擬動態

FORTH ENGINE 的機器碼大部分都是 Forth 的基本指令。但也有一些較 複雜的 Forth 指令,需用幾個機器碼組合而成。這種指令,一般可用副程 式的方式來建造。但是在 FORTH

本研究依據受試者網路人際程度的不同,將受試者網路人際程度各題項所得的分

This study has put forth two items of implementation strategies: (1) to employ cost-saving strategy to enhance the competitiveness of the Dashanbei House, which can be further found

Jyh-Bin Yang, Pi-Chuan, Yin and Chih-Kuei Kao, 2007.09, “Comparison of various delay analysis methodologies for construction projects,” Forth International Structural Engineering