在理解CPU之前,我們有必要先了解一下現代計算機理論的基石——圖靈機,這個抽象模型決定了現代計算機可以被實現。這個模型的工作原理也投射到了CPU的工作實現上。圖靈機的知識可深可淺,換句話說,上手容易,但是意義深遠。
下面是一個可以線上學習圖靈機的網站:
- 《嵌入式C語言自我素養》
- 百度百科以及大佬部落格
- b站視訊
- 《數字邏輯》課程
00 內容概括
圖靈機的概念產生於英國數學家艾倫·圖靈在1936年在《倫敦數學協會會刊》上發表的那篇改變世界的論文——《論可計算數及其在判定問題中的應用》,論文字身很難很複雜,但對於電腦科學而言,可以簡單概括為:
“任何複雜的運算都可以分解為基本運算指令。”
而圖靈機則是圖靈機理論中提出的理想模型,可以用簡若干指令的組合就實現任意複雜的計算。
01 基本構造
圖靈機的構造如下圖所示:
-
一條無限長的紙帶-Tape
這是要處理的物件,被劃分為一個個大小相等的小方格。每個小方格都可以存放一個符號,可以存放數字、字母、空白等。
-
一個讀寫頭-Head
可以在紙帶上左右移動,它能讀出當前所指的格子上的符號,並能改變當前格子上的符號。
-
一套控制規則/狀態轉換規則-Table
根據當前機器所處的狀態以及當前讀寫頭所指的格子上的符號來確定讀寫頭下一步的動作,並改變狀態暫存器的值,令機器進入一個新的狀態。
-
一個狀態暫存器
用來儲存圖靈機當前所處的狀態。圖靈機的所有可能狀態的數目是有限的,並且有一個特殊的狀態,稱為停機狀態。
02 工作原理與思想
02-1 工作原理
這個東西是有數學推導的,我在此簡化具體一下:
想象自己是一隻小貓,我們會有餓和飽的狀態,面對不同的食物,我們吃或者不吃,最終是飽或者餓。
上圖就是我們理想化的Table,即狀態轉換規則。
在這個例子中,貓就是一個讀寫頭Head,可以儲存一個狀態我們假設貓會根據自己餓與不餓以及格子裡是否是食物來決定“吃”或是“等待”。
上圖中的當前狀態就是讀寫頭中狀態暫存器的當前儲存值,格子裡的食物就是紙帶(Tape)格子裡的值,兩者決定了讀寫頭(Head)的下一狀態與讀寫頭的移動(對應“等待”和“吃”這兩個行為)
值得一提的是上面提到過的停機問題(這是
這樣,一個圖靈機就這樣建立了。
02-2 基本思想
把上面的通過類比講解的原理稍微抽象一下,我們來思考一下圖靈機的基本思想:
-
圖靈機基本思想是用機器來模擬人們用紙筆進行數學運算的過程。
-
圖靈機主要有兩個動作(模擬人):
-
在紙上寫上或擦除某個符號;
-
把注意力從紙的一個位置移動到另一個位置;
-
-
而在每個階段,人要決定下一步的動作,依賴於
-
此人當前所關注的紙上某個位置的符號->當前狀態
-
此人當前思維的狀態->Table
-
03 執行例項
我想在這裡實際操作兩個圖靈機的工作過程,來加深一下對於圖靈機的理解,手寫推導。想看更多示例的可以 ->
03-1 實現兩個數字的相加
A 示例紙帶
B 狀態轉移表
讀寫頭當前狀態 | table值0 | table值1 |
---|---|---|
q1 | 1Rq2 | 1Rq1 |
q2 | 0Lq3 | 1Rq2 |
q3 | 0Nq3 | 0Nq3 |
C 步驟演示
03-2 將一串連續的1後面再加一位1
A 示例紙帶
B 狀態轉移圖
雖然我們在前面的構造和原理部分多用一個表來表示Table,實際上和狀態機一樣,也可以用圖來表示。
Table圖的設計取決於A中我們要實現什麼樣的功能。在這個圖中:
-
從0開始,遇到0格子我們繼續賦給它0,右移;
-
碰到1時,把它修改為1,右移;
-
當碰到1後第一個0時我們就把它下一狀態改為1,左移
-
左移再碰到1,就保持其值,繼續左移;
-
左移遇到0,保持其值不變,停止。
C 步驟演示
04 圖靈機Verilog實現的探索
這時候我就在想一個問題,我已經學過了數字邏輯與Verilog設計,圖靈機肉眼可見地與狀態機極其相似,那麼我是否可以用Verilog實現一個圖靈機呢,功能復刻就可以。
自己想了想,按照狀態機的套路,對狀態進行編碼,但讀寫頭Head的左移右移的模擬是一個問題,我開始懷疑這個東西是不是真的可以。去FPGA的群裡問了問大佬,大佬的回覆是:
“可以,這就是用Verilog寫一個CPU soft core了,一個point,一段register,就能組成圖靈機,並且fpga可以做。”
所以,想要實現圖靈機,我們需要繼續向下瞭解CPU的一些知識。
05 談談意義
05-1 類比現代計算機
將圖靈機原型與現代計算機比較,會有很多相似之處,我們可以聯想一下:
-
無限長的紙帶Tape == 程式程式碼
-
讀寫頭Head == 程式計數器PC
-
狀態轉換表Table == CPU的有限指令集
-
狀態暫存器 == 程式或計算機的狀態輸出
不同架構的CPU,主要差別是指令集的不同,支援執行的機器指令也不同,但有一條是相同的:即CPU只能支援執行有限個指令,任何複雜的運算(任何應用程式)最終都可以分解成有限個基本指令來完成。