從二進制到計算機——手把手造八位CPU

爲什麼是二進制

二進制表示準確不混淆

二進制沒法表示太多意思,但可以表示開關兩種狀態,準確表示兩個值"ture""ture""false""false",那麼爲何不採取其他進制呢,因爲當手機電量不足或者周圍有電噪聲時信號會混淆,並隨着上百萬次狀態變得越來越糟。把信號放在相對較遠的地方——0011可以有效解決這個問題
在這裏插入圖片描述在這裏插入圖片描述

二進制成熟的數學分支——布爾代數和邏輯門

notnot(非)

在這裏插入圖片描述在這裏插入圖片描述

andand(與)

在這裏插入圖片描述
在這裏插入圖片描述

oror(或)

在這裏插入圖片描述 在這裏插入圖片描述

XORXOR(異或)

在這裏插入圖片描述在這裏插入圖片描述我們可以設置一種對應關係,用多位二進制表示指定字符,如ASCIIASCII:
在這裏插入圖片描述

算數邏輯單元(ALU)

ALUALU是執行ArithmeticArithmeticLogicLogic的單元,是表示和存儲數字是計算機的一個重要功能,但真正的目標是計算,或者以結構和有目的的操作數字,如兩個數相加,這些操作由計算機的"算數邏輯單元"處理。

算數單元講解

半加器

無進位(這不是半加器)

在這裏插入圖片描述

有進位(即半加器)

在這裏插入圖片描述

全加器

  • 全加器可用兩個半加器和一個“或“門組成。這個得記住
    在這裏插入圖片描述
  • 或者用真值表現推:
  • 在這裏插入圖片描述
    S()=(ABCI+ABCI+ABCI+ABCI)CO()=(AB+BCI+ACI)S(和)=(A^{'}B^{'}CI^{'}+A^{'}B*CI+AB^{'}CI+ABCI^{'})^{'}\\CO(進位)=(A^{'}B^{'}+B^{'}CI^{'}+A^{'}CI^{'})^{'}

在這裏插入圖片描述

多位加法器

串行進位加法器

在這裏插入圖片描述
(CI)i=(CO)i1Si=AiBi(CI)i(CO)i=AiBi+(Ai+Bi)(CI)i(CI)_i=(CO)_{i-1}\\S_i=A_i \oplus B_i \oplus(CI)_i \\(CO)_i=A_iB_i+(A_i+B_i)(CI)_i

超前進位加法器

  • 串行加法器的不足
    我們發現串行進位加法器只有前一全加器輸出後一全加器才能計算,這在實際應用中會導致延時。
  • 超前進位加法器原理:第ii位的進位輸入信號是兩個加數第ii位以前各位(0j1)(0\sim j-1)的函數,可在相加前確定
    在這裏插入圖片描述
    在這裏插入圖片描述

溢出

在這裏插入圖片描述如果是八位行波進位加法器,注意最後是有進位的輸出,如果第九位有進位,就表示兩個數的總和太大而超過了88位,這稱爲溢出,溢出通常會導致錯誤和意外結果。

ALU的減法乘法除法
減法同理可由電路得出。乘法是多個加法的和,或者乘除法也可以設置特有的邏輯單元,具體操作類似於加法

邏輯單元講解

設置11爲與門
在這裏插入圖片描述
設置00爲或門
在這裏插入圖片描述

ALUALU封裝

做好之後我們將其封裝起來,通常用VV表示
在這裏插入圖片描述

左上方近正方體是與或電路,右下方平躺長方體是加減電路

在這裏插入圖片描述故封裝後的結果爲
在這裏插入圖片描述

寄存器和內存

"AND-OR"鎖存器,

接下來我們以建立一個可以存儲單個bitbit的電路,之後再擴大成爲我們自己的內存模塊,先看下面幾個電路:

  • A開始輸1後永久爲1
    在這裏插入圖片描述
  • A輸0後永久爲0 在這裏插入圖片描述
  • 爲了進行有效存儲,創造出"AND-OR"鎖存器,他有兩個輸入,setset11置1,resetreset1100,如果輸入輸出都是00則會保持當初存入的內容
    在這裏插入圖片描述
    這樣記住了一個比特的信息,由於他**鎖定了一個特定的值並保持狀態,所以稱之爲鎖存器**

門鎖

兩條線設值有點難以理解,所以我們修改一下電路,用一條線輸入,另一條線設置“允許寫入權限”,由於可以打開和關閉,我們稱之爲門鎖。
在這裏插入圖片描述

封裝帶門鎖的鎖存器

在這裏插入圖片描述

寄存器

像這樣一組的鎖存器稱爲寄存器,它能存儲一個數字,寄存器能存多少bitbit叫位寬,寫入前,我們用一根連接到所有啓用輸入的單線來實現這一點,將其設置爲11
在這裏插入圖片描述在這裏插入圖片描述這樣就存入了一個八位的數字10110101!!!

寄存器改進——矩陣放置

按原本的放置方式,64位寄存器,可能需要129根線,存256位要513根線,解決方式是一個矩陣
在這裏插入圖片描述只有行線列線同時爲1才能導通。
在這裏插入圖片描述此時256位的數據只需38根線即可。如果這個數據存儲在8行12列的話,12=1100,8=1000,所以剛剛用的鎖存器地址可以寫成11001000

多路複用器

爲將地址轉換爲正確的行或列的內容而用到
在這裏插入圖片描述

封裝

要存儲一個數字,要輸入八位的地址,一條寫入線,一條線控制可寫,一條線控制可讀。
在這裏插入圖片描述這樣排成一行,則一次可存儲一個八位數字,即一個字節。我們同時給8個256位內存同樣的地址,每個同樣的地址都得到一個數,如把11111111存入8行12列,只需地址輸入11001000,允許寫入,在對應的數據線上輸對應的數字即可。
在這裏插入圖片描述## RAMRAM
這個內存的重要特性是隨時以隨機順序訪問內存位置,因此叫隨機存取存儲器。

CPUCPU

CPUCPU是執行程序,程序由一系列單獨的操作組成,稱爲指令。他們指示計算機做什麼,指令不僅僅是數學指令(發給ALU),還可能是內存指令(CPUCPU)和內存通信,然後讀/寫值,接下來我們將專注於功能部分,而不是線的連接。當我們用一條線連接兩個組件時,這是所有必要佈線的抽象概念,也稱其爲微體系架構

部件的創立

  • RAMRAM
    假設在內存中只有16個位置,每個位置有8位。
    在這裏插入圖片描述
  • 寄存器
    給處理器四個八位寄存器,稱之爲"A,B,C,DA,B,C,D",用於臨時存儲值和更改值
    在這裏插入圖片描述- 程序存儲
    我們已經知道數據可以作爲二進制存儲在內存中,程序也可以存儲在內存中在這裏插入圖片描述
    在這個假設示例中,我們用前四位來儲存“操作代碼”或者簡稱“操作碼”,後四位填寫地址碼。可以使寄存器或內存中的地址。
寄存器名稱 功能
指令地址寄存器 存儲當前指令的內存地址
指令寄存器 $12

在這裏插入圖片描述

當我們第一次啓動,所有的寄存器都從0開始
在這裏插入圖片描述

步驟

取指令

指令地址寄存器連接RAMRAM模塊

在這裏插入圖片描述

此值複製到指令寄存器中

在這裏插入圖片描述

解碼

取了指令後,重要的是運行這個指令而不是殺死他。稱爲解碼階段,接下來,指令由控制單元解碼和解釋,“控制單元”也是由邏輯門構成,比如爲了檢驗LoadALoad\, A,需要一個電路檢驗操作碼是否與0010匹配,這可以用一些邏輯門完成。
在這裏插入圖片描述

解碼電路和之前取指電路封裝

具體分析解碼電路太過繁瑣,我們這裏繼續進行封裝,把控制單元封裝
在這裏插入圖片描述

執行代碼

  • load1110load\, 1110AA
    在這裏插入圖片描述
  • load1111load\, 1111BB在這裏插入圖片描述
  • ADDADD指令特殊,由於總共有四個寄存器,所以用兩位足以,後面是兩個寄存器的地址,0000對應AA,0101對應BB。此時將ALUALU也集成進CPUCPU在這裏插入圖片描述
  • 控制單元將A,BA,B的值作爲輸入傳入,再傳入ADDADD操作碼來執行ADDADD操作,最後輸出值保存到寄存器AA中,但他不能寫入寄存器AA,因爲新值會進入ALUALU反覆和自己相加,因此ALUALU用內部寄存器暫時保存輸出,關閉ALUALU,然後在正確的寄存器中寫入值。

訪存取數

根據指令需要,有可能要訪問主存,讀取操作數,這樣就進入訪存取數階段。

寫回

  • store 像往常一樣,我們把地址傳給RAMRAM模塊,但不是允許讀取而是允許寫入,同時打開寄存器AA的允許讀取,這允許我們使用數據行來傳遞存儲在寄存器AA中的數據。

指令地址寄存器自增一

有個時鐘利用脈衝控制指令地址寄存器的自增在這裏插入圖片描述在這裏插入圖片描述我們的CPU就做好了!
接下來看看logisim的展示:

-ALUALU
在這裏插入圖片描述

  • CLKCLK
    在這裏插入圖片描述
  • CPUCPU
    在這裏插入圖片描述

參考資料

二進制,寄存器,指令集
計算機組成原理-用logisim設計ALU(8位算術/邏輯運算)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章