電腦是如何記憶起來的?
目錄
介紹
大家好!最近,我一直在試著了解計算機的工作原理。我在一個視頻中探討了使用二進制表示數字以及使用簡單的邏輯閘進行加減運算的內容。不過,今天我感興趣的是計算機如何記住它所處理的數字。
我先建立了一個簡單的電路,按照在網上找到的一個小圖來進行。如果我將紅色的電線連接在這裡,燈就會亮起。有趣的是,當我拔掉電線時,燈仍然保持亮著。這意味著某種方式下,狀態被記住了。另一根電線可以用來關掉燈,所以我們可以將這兩根電線當作電路的設置和重置輸入。
讓我們切換到我們先前完成加減運算的模擬程序,並嘗試創建一些這種神秘記憶的內容。在這裡,我們有兩個輸入信號SET和RESET,這些信號應該一起控制這裡的輸出信號的狀態。
我們可以使用一個AND閘、一個OR閘和一個NOT閘來實現我們所看到的行為。SET輸入進入OR閘,RESET輸入被反向並進入AND閘。我們可以看到信號沿著這條線傳遞。現在,OR閘的輸出也進入AND閘,其結果就是我們的輸出信號。
但是,有一點很特別,這個輸出信號作為另一個輸入進入OR閘。讓我們看看它的行為,我會打開SET輸入,這會打開OR閘,這會使AND閘打開,所以現在我們的輸出是打開的。
當然,這也同時打開了OR閘的另一個輸入,所以即使我現在關掉SET信號,輸出仍然保持開啟。現在唯一改變輸出的方法是使用RESET信號。所以讓我試著打開它。這個信號是反向的,所以它關掉AND閘的輸入,所以輸出也關掉了。現在我可以關掉重置輸入,輸出將保持關閉。這個小設置被稱為SR觸發器,SR觸發器簡稱SR觸發器。
我想看看另一種構建這種觸發器的方法,我覺得這很有趣,但首先我需要一個新的構建塊,這是一個由OR閘後跟一個NOT閘組成的東西,即所謂的NOR閘。在這裡,只有在兩個輸入都關閉的情況下,輸出才會打開。我會在這裡寫下它的名稱,然後製作成自己的小芯片。好的,現在我們重新有了SET和RESET輸入,這一次我會使用兩個NOR閘,將第一個閘的輸出鏈接到第二個閘的輸入。
那第一個NOR閘的兩個輸入目前沒有連接,模擬程序將它們視為關閉,所以它的輸出信號目前是開啟的。這導致第二個NOR閘的輸出為關閉,我將它鏈接到第一個NOR閘的輸入。我還要將它連接到這裡的輸出信號,最後我要這樣連接SET和RESET輸入。
所以,讓我們試著打開SET輸入,這會關閉這個NOR閘的輸出信號,從而使另一個NOR閘的輸出開啟,所以輸出信號打開了。我們還有一條信號沿著這條線傳遞,我們可以將其視為將此輸出鎖定為關閉狀態,因此即使我們現在關掉設置信號,它仍然保持關閉。因此,正如你所看到的,這裡的輸出保持打開。
讓我們試著現在打開RESET信號。這將關閉這個NOR閘的輸出,因此,這裡的輸出信號將關閉。這也意味著這條線上的信號目前關閉,允許這裡的輸出再次開啟,然後將第一個NOR閘的輸出鎖定為關閉狀態,因此即使我們關掉RESET信號,輸出仍然關閉。這個設置看起來非常簡單,但是理解其中的運作需要一些時間。
無論如何,接下來我想稍微修改這一點,讓我們不再具有SET和RESET輸入,而是具有數據輸入和存儲信號,這表示我們是否要保存該數據。
要實現這一點,我需要刪除這兩條線,並添加兩個AND閘。第一個閘的輸出將扮演SET的角色,第二個閘的輸出將扮演RESET的角色。
因此,如果我們正在數據信號上發送 1,並且存儲信號是開啟的,我們希望這個SET信號打開。如果我們正在數據信號上發送 0,那麼我們需要對其進行反向操作以檢測到這種情況,同樣,存儲信號是開啟的。現在,如果我將一個 1 放在數據輸入上,實際上什麼都不會發生,直到我啟用存儲信號,現在我們應該看到輸出變為 1。如果我然後關閉存儲信號,我可以隨心所欲地更改數據,而不會影響輸出。作為最後的測試,現在將數據設置為 0,再次啟用存儲信號,我們可以看到輸出變為 0。
所以這最初是一個設置重置的觸發器,但在我們進行的小修改後,我會稱它為數據觸發器。
讓我們花一些時間來考慮這個觸發器的核心部分,特別是在電源關閉時會發生什麼。在這種情況下,這兩個NOR閘的輸入將最初關閉,因此它們的輸出信號將一直開啟。讓我們看看會發生什麼。正如你所看到的,我在模擬中得到了這種奇怪的振盪效應,輸出信號不斷在打開和關閉之間切換。起初,我對為什麼現實生活中不會發生這種情況感到困惑,但我現在大致明白了。電線中的信號傳遞速度非常快,大約是光速的一半。而較慢的是閘的反應速度,這是閘的輸出完全對輸入做出反應所需的時間。所以我想應該會是這樣。但現在,閘反應速度的微小變化將導致其中一個信號比另一個信號更早到達,阻止它輸出任何東西。我將重新啟動這個模擬,我們可以看到它已經穩定在一個打開的狀態。我再次重新啟動,這一次它碰巧穩定在一個關閉的狀態。
我很好奇是否可以使用我稍早建立的那個小型SR觸發器來嘗試這個問題,確實地,有時燈一開始是亮著的,有時是關著的。所以初始狀態實際上是隨機的,儘管它可能傾向於其中一種狀態,我猜這是因為閘反應速度可能自然偏慢一些。
不過,我覺得完全確定它在現實生活中是起作用的,所以我們在麵包板上複製了剛才在模擬中創建的確切設置,以完全確保它在現實生活中能夠運作。不幸的是,我沒有任何NOR閘、AND閘或NOT閘,但我碰巧有一些這些NAND芯片,只需要進行一些小修改,就可以將它們完全變成由NAND閘組成的模擬,像這樣。我將快速測試一下這是否正常運作。
好的,現在,這些芯片的每個芯片裡實際上有 4 個 NAND 閘,你可以想象成是這樣的。當然,不同於我們簡化的模擬,現實生活中的所有東西都需要與電源和地面進行連接,以便正常工作,因此這就是其他兩個引腳的作用。
解決了這個問題後,我們開始排線。
所以,我使用這個第一個芯片來完成這 3 個 NAND 閘,第二個芯片用於這兩個。從這個左側的小燈代表著存儲信號,然後是數據信號,在另一端是輸出信號。它們目前都是 0。通過按下此按鈕,我可以在數據信號上放置一個 1,但是預期輸出不會發生變化,直到我啟用存儲信號。所以現在輸出是一個 1,我可以放開按鈕,你可以看到它記住了它的值。然後,我將嘗試存儲一個零,這也正常工作。最後一件事,為了好玩,我想看看這個東西起始狀態是什麼。我不確定為什麼我覺得這樣無限地令人娛樂,但我就是這麼覺得。
好的,所以只有一個觸發器,我們可以存儲一個位元的數據,所以如果我們想要存儲 4 位元的數據,我們當然可以使用四個觸發器。我會將此存儲信號連接到所有這些觸發器上,並將輸出連接起來。所以,我可以設置一些數據,但是如我們現在非常熟悉的,輸出在啟用存儲信號之前不會改變。這被稱為 4 位元寄存器,但是,當前的設計還存在一些潛在的問題,為了理解這些問題,我們需要事先考慮記憶器可能的用途。
所以,作為一個例子,我將使用兩個寄存器,我將它們創造性地命名為 A 和 B,並且我將快速將這些輸入連接到 A 上,並在其中存儲一個初始值,比如說 3。然後,我將將這些輸入連接到 B 上,並在其中存儲一個 1。好的,然後我現在帶入我們上一集中建立的算術邏輯元件,並將寄存器的輸出連接到那裡。所以目前,算術邏輯元件應該正在將這兩個寄存器的內容相加,因為我們這裡沒有啟用減法信號。現在可能有一個合理的事情是想要將算術邏輯元件的結果存儲在 A 寄存器中,這樣我們就可以在下一個計算中使用該結果。順便說一句,在這裡我們可以看到算術邏輯元件的輸出是 4,就像我們希望的那樣。
我會快速地將 A 寄存器連接到輸出信號,以便我們可以看到它包含的值。目前它是 3,毫不意外,所以為了將算術邏輯元件的結果存儲在 A 中,我們需要將此存儲信號連接到這裡,並啟用它。
事情有點失控了,我只是想要在 A 寄存器中存儲 3+1 的結果,它做到了 - 但是幾秒鐘後,算術邏輯元件計算了 4 + 1 的結果,然後以這樣的方式飛快地重寫了那個值,然後與 5 + 1 發生了同樣的情況,來回發生。
所以為了捕獲第一個結果,我需要在完美的時機上打開和關閉存儲信號,但這真的很難以可靠的方式做到,所以我們需要一點幫助。
這時,時脈出現了,它產生一個信號,無限循環地在 1 和 0 之間切換,也被稱為高電位和低電位,在某個穩定的速度下。
時鐘將幫助我們同步和協調計算機內部的所有操作,我們將在本系列的後面更仔細地關注它,但基本上,在時鐘信號的平穩部分,我們不希望做任何事情,因為時鐘的速度被精心確定,這樣足以讓計算機中最慢的信號足夠時間到達它們的目的地,並使所有東西都穩定在一個穩定的狀態中。
然後在這裡有一個稱為上升沿的地方,這是時鐘信號從低電位轉到高電位的非常短暫的時間。然後我們還有下降沿,其中它從高電位轉換為低電位。我們可以選擇其中一個邊緣,比如說上升沿,並決定只有在這些時刻將數據存儲到內存中。
所以如果我們可以實現這一點,那麼在我們之前的設置中,將在可控的時間間隔內存儲數據,而不是盡可能快地存儲它。這將給我們一些時間在這些上升邊緣之間進行設置,比如說如果我們希望停止存儲數據,我們可以關閉存儲信號。
這將非常有幫助,所以讓我們拿出我們建立的那個觸發器,並嘗試修改它,使其只在時鐘信號由低變為高時存儲數據。
這其實有很多方法可以實現,但我將採用一種使用兩個觸發器的方法來實現,這樣就可以解決這個問題。第一個觸發器只在時鐘信號為低電位時存儲數據。然後第二個觸發器將第一個觸發器中的任何數據進行複製,但只有在時鐘信號為高電位時才進行複製。
讓我們快速測試一下。目前時鐘信號為低電位,所以我可以更改數據,但這裡的輸出並不受影響。然而,數據正在存儲在第一個觸發器中。如果時鐘現在變為高電位,我們可以看到輸出已經變為 1,因為第二個觸發器現在可以從第一個觸發器中載入數據。同樣,更改數據不會有任何變化,因為我們不再將其存儲在第一個觸發器中,第二個觸發器從那裡獲取數據。所以希望你明白這種簡單的小設置是如何實現我們希望的:只在時鐘上升沿時存儲數據。
我們在這裡創建的东西叫做邊緣觸發數據錯誤。
不過,這個錯誤觸發器的問題是它在每次上升沿時都會存儲數據,我們無法告訴它停止存儲數據。所以我們在這裡有一個數據和時鐘信號,就像以前一樣,但我們還增加了一個存儲信號。
最簡單的方法是使用一個AND閘來修改時鐘信號,當存儲信號關閉時將其修改為低電位。當然,如果時鐘信號保持低電位,錯誤觸發器就不會存儲數據。所以我可以在數據信號上放置一個 1,並運行時鐘,但是由於存儲信號關閉,什麼都不會發生。如果我然後打開存儲信號,現在它將在下一次上升沿存儲新的數據。作為最後的測試,我將數據設置為零,關閉存儲信號,確保這也正常工作,它確實正常工作。
所以我將這稱為 1 位元寄存器,我們可以使用它來製作一個改進的 4 位元寄存器。
讓我們快速測試一下,我會將一些任意的數據設置在那裡,打開存儲信號,然後點擊時鐘以加載它。然後我將設置一些不同的數據,這一次我將關閉存儲信號以測試其工作情況,它確實工作正常。好的,所以回憶一下我們之前的設置,它的運作完全失控,現在我們可以使用我們的新式帶有時鐘同步的寄存器進行改進。所以我將在這兩個中加載一些開始的數據,讓我們說 A 中加載 5。然後,我將將這些輸入連接到 B 中,並在其中存儲一個 3。和先前一樣,我將將它們都連接到 ALU,以將他們的值相加,然後將結果發送回 A。
最後,讓我們將存儲和時鐘信號連接到 A 中。所以目前它的輸出是 5,但我想讀取來自 ALU 的結果...所以,我可以在這裡打開存儲信號,在時鐘信號打開時,我們可以看到結果已經加載進去了,因為輸出已經變成了 8。與上次不同的是,新的來自 ALU 的結果並沒有立即將其覆蓋,所以我們現在有機會關閉存儲信號,如果我們想要停止存儲數據的話,時鐘就可以繼續工作,但是我們有了我們想要的數據。
所以,我們在本集節目中創建了一些基本的記憶組件,從這裡開始,我們將試著擴展這些組件,以創建計算機的隨機存取記憶體。希望你們會在下一集中加入我們。不過,在那之前,謝謝大家。