從二進制到計算機——手把手造八位CPU
爲什麼是二進制
二進制表示準確不混淆
二進制沒法表示太多意思,但可以表示開關兩種狀態,準確表示兩個值和,那麼爲何不採取其他進制呢,因爲當手機電量不足或者周圍有電噪聲時信號會混淆,並隨着上百萬次狀態變得越來越糟。把信號放在相對較遠的地方——和可以有效解決這個問題
二進制成熟的數學分支——布爾代數和邏輯門
(非)
(與)
(或)
(異或)
我們可以設置一種對應關係,用多位二進制表示指定字符,如:
算數邏輯單元(ALU)
是執行和的單元,是表示和存儲數字是計算機的一個重要功能,但真正的目標是計算,或者以結構和有目的的操作數字,如兩個數相加,這些操作由計算機的"算數邏輯單元"處理。
算數單元講解
半加器
無進位(這不是半加器)
有進位(即半加器)
全加器
- 全加器可用兩個半加器和一個“或“門組成。這個得記住
- 或者用真值表現推:
多位加法器
串行進位加法器
超前進位加法器
- 串行加法器的不足
我們發現串行進位加法器只有前一全加器輸出後一全加器才能計算,這在實際應用中會導致延時。 - 超前進位加法器原理:第位的進位輸入信號是兩個加數第位以前各位的函數,可在相加前確定
溢出
如果是八位行波進位加法器,注意最後是有進位的輸出,如果第九位有進位,就表示兩個數的總和太大而超過了位,這稱爲溢出,溢出通常會導致錯誤和意外結果。
ALU的減法乘法除法
減法同理可由電路得出。乘法是多個加法的和,或者乘除法也可以設置特有的邏輯單元,具體操作類似於加法
邏輯單元講解
設置爲與門
設置爲或門
封裝
做好之後我們將其封裝起來,通常用表示
左上方近正方體是與或電路,右下方平躺長方體是加減電路
故封裝後的結果爲
寄存器和內存
"AND-OR"鎖存器,
接下來我們以建立一個可以存儲單個的電路,之後再擴大成爲我們自己的內存模塊,先看下面幾個電路:
- A開始輸1後永久爲1
- A輸0後永久爲0
- 爲了進行有效存儲,創造出"AND-OR"鎖存器,他有兩個輸入,輸置1,輸置,如果輸入輸出都是則會保持當初存入的內容
這樣記住了一個比特的信息,由於他**鎖定了一個特定的值並保持狀態,所以稱之爲鎖存器**
門鎖
兩條線設值有點難以理解,所以我們修改一下電路,用一條線輸入,另一條線設置“允許寫入權限”,由於可以打開和關閉,我們稱之爲門鎖。
封裝帶門鎖的鎖存器
寄存器
像這樣一組的鎖存器稱爲寄存器,它能存儲一個數字,寄存器能存多少叫位寬,寫入前,我們用一根連接到所有啓用輸入的單線來實現這一點,將其設置爲。
這樣就存入了一個八位的數字10110101!!!
寄存器改進——矩陣放置
按原本的放置方式,64位寄存器,可能需要129根線,存256位要513根線,解決方式是一個矩陣
只有行線列線同時爲1才能導通。
此時256位的數據只需38根線即可。如果這個數據存儲在8行12列的話,12=1100,8=1000,所以剛剛用的鎖存器地址可以寫成11001000
多路複用器
爲將地址轉換爲正確的行或列的內容而用到
封裝
要存儲一個數字,要輸入八位的地址,一條寫入線,一條線控制可寫,一條線控制可讀。
這樣排成一行,則一次可存儲一個八位數字,即一個字節。我們同時給8個256位內存同樣的地址,每個同樣的地址都得到一個數,如把11111111存入8行12列,只需地址輸入11001000,允許寫入,在對應的數據線上輸對應的數字即可。
##
這個內存的重要特性是隨時以隨機順序訪問內存位置,因此叫隨機存取存儲器。
是執行程序,程序由一系列單獨的操作組成,稱爲指令。他們指示計算機做什麼,指令不僅僅是數學指令(發給ALU),還可能是()和內存通信,然後讀/寫值,接下來我們將專注於功能部分,而不是線的連接。當我們用一條線連接兩個組件時,這是所有必要佈線的抽象概念,也稱其爲微體系架構
部件的創立
假設在內存中只有16個位置,每個位置有8位。
- 寄存器
給處理器四個八位寄存器,稱之爲"",用於臨時存儲值和更改值
- 程序存儲
我們已經知道數據可以作爲二進制存儲在內存中,程序也可以存儲在內存中
在這個假設示例中,我們用前四位來儲存“操作代碼”或者簡稱“操作碼”,後四位填寫地址碼。可以使寄存器或內存中的地址。
寄存器名稱 | 功能 |
---|---|
指令地址寄存器 | 存儲當前指令的內存地址 |
指令寄存器 | $12 |
當我們第一次啓動,所有的寄存器都從0開始
步驟
取指令
指令地址寄存器連接模塊
此值複製到指令寄存器中
解碼
取了指令後,重要的是運行這個指令而不是殺死他。稱爲解碼階段,接下來,指令由控制單元解碼和解釋,“控制單元”也是由邏輯門構成,比如爲了檢驗,需要一個電路檢驗操作碼是否與0010匹配,這可以用一些邏輯門完成。
解碼電路和之前取指電路封裝
具體分析解碼電路太過繁瑣,我們這裏繼續進行封裝,把控制單元封裝
執行代碼
- 到
- 到
- 指令特殊,由於總共有四個寄存器,所以用兩位足以,後面是兩個寄存器的地址,對應,對應。此時將也集成進裏
- 控制單元將的值作爲輸入傳入,再傳入操作碼來執行操作,最後輸出值保存到寄存器中,但他不能寫入寄存器,因爲新值會進入反覆和自己相加,因此用內部寄存器暫時保存輸出,關閉,然後在正確的寄存器中寫入值。
訪存取數
根據指令需要,有可能要訪問主存,讀取操作數,這樣就進入訪存取數階段。
寫回
- store 像往常一樣,我們把地址傳給模塊,但不是允許讀取而是允許寫入,同時打開寄存器的允許讀取,這允許我們使用數據行來傳遞存儲在寄存器中的數據。
指令地址寄存器自增一
有個時鐘利用脈衝控制指令地址寄存器的自增我們的CPU就做好了!
接下來看看logisim的展示:
-