小服務員給弄來的這套漁具相當有檔次。
用具一應俱全:釣竿、水兜、魚簍、小笊籬、魚餌……
居然還有個小摺疊凳。
江寒謝過小服務員,拿着這些東西,來到中央魚塘處。
在岸邊選了個沒人的地方,架好魚竿,就開始閉目養神。
當然,其實是進入了虛擬空間。
閒着也是閒着,不如做點事情。
上次做的算數邏輯單元,還有幾個地方,必須完善一下。
比如,其中的加法器部分,當時並沒有考慮執行效率的問題。
當進位從低位向高位,逐一傳遞時,可能會產生很高的延遲。
江寒通過看書,找到了一種解決方案。
這種被稱爲“進位預測(carry look-ahead)”的技術,通過特殊設計的邏輯電路,能有效地緩解進位延遲問題。
江寒按照資料中的講解,將原本的ALU改造了一下。
測試後,效果還算令人滿意。
附帶一提,這個ALU並沒有實現乘除法和浮點運算。
並不是不需要,而是如果一切都用硬件來實現,電路會過於複雜。
ALU是和操作系統搭配工作的,一個計算機系統能做多少事情,由二者共同決定。
在設計ALU時,硬件上需要實現多少種功能和操作指令,本質上是個性價比問題。
如果爲了性能,應該儘可能用硬件來實現所有的算數運算和邏輯運算。
但這樣做,成本太高昂了。
江寒權衡再三後,決定現階段只實現基本的算數和邏輯,剩下的部分交給操作系統,用軟件的方式解決。
接下來,江寒打算實現一個存儲系統。
計算機不僅要能做計算,還應該能根據需要,存儲、讀取數據。
計算機中的數據,都是以二進制來存儲的。
其中比較特別的,是機器指令代碼。
其實,在馮諾依曼體系中,指令也被看做一種數據,特殊的、可執行的數據。
這也就是存儲程序的概念……
計算機中的存儲單元,無論是寄存器,還是內部存儲器,通常都是由時序電路組成的。
時序電路的實現,其實並不算特別複雜,本質上就是個週期性電信號的處理。
但如果考慮到同步、時鐘、反饋等一系列問題,就稍微有點麻煩了。
江寒照舊將大任務分解成小模快,,然後從最基本的地方入手。
首先,要實現一個“觸發器”。
如果說ALU的基本部件是“與非門”,那麼時序單元的基本部件,就是“觸發器”。
工程實踐中,“觸發器”有多種設計方案。
江寒選用的,是最常用的,也是比較簡單的“D觸發器”(Data Flip-Flop),簡稱DFF。
此類“觸發器”通常包括4個“與非門”,並提供1個輸入管腳,一個輸出管腳,通過“反饋迴路”來連接基本的邏輯門。
大多數計算機系統裡,都是採用振盪器來實現時鐘信號。
用連續的交變信號序列,來表示時間流逝。
所謂交變,就是電信號從高到低,在從低到高,反覆循環。
用數字來表示,就是0-1-0-1-0-1……
每兩個波峰之間的間隔,稱之爲1個“時鐘週期”。
現代個人電子計算機的時鐘頻率,通常高達每秒鐘幾十、幾百甚至幾千兆赫!
計算機系統通過時序信號,來整體協調各個部件的運行。
“觸發器”根據主時鐘信號的連續交變,將前一個時鐘週期的輸入,當做當前時鐘週期的輸出。
這個過程可以用out(t)=in(t-1)來描述。
江寒用4個與非門打造出D觸發器後,又在其基礎上實現了“二進制存儲單元”。
這是隻能存取、記憶1個二進制位的小裝置。
包括一個輸入、一個輸出,和一個負責寫操作的load接口。
別看它小,可是構成寄存器和內存陣列的基本結構。
根據out(t)=in(t-1)的設計需求,D觸發器的輸出必須反饋到輸入。
但簡單的將輸出信號傳送給輸入端,肯定是行不通的。
必須通過合理的設計,才能讓其正確工作。
比如加裝一個“多路轉換器”,用它的“選擇位”作爲寄存器的“加載位”……
D觸發器的設計,保證了輸出變化僅發生在兩個時鐘週期之間的切換點上,而不會發生在時鐘週期內部。
這樣,即使時序邏輯電路在時鐘週期內出現不穩定,也不會影響輸出的準確性。
只需要保證在下一個時鐘週期開始時,輸出準確無誤的數值就可以了。
這種“離散化”的特性,對於保證計算機系統的同步協調十分重要。
比如,要讓ALU計算兩個數A與B的和。
假設A所在的RAM寄存器,距離ALU很近,而B所在的RAM寄存器,距離ALU較遠。
由於物理條件的限制,比如電阻、干擾、信號噪聲或者其他隨機因素,A、B信號也許無法同步到達ALU。
爲了不讓運算結果出錯,就要保證:在一個時鐘週期內,ALU輸出的結果,能到達最遠的RAM寄存器。
這樣才能將互相獨立的一系列硬件,同步成一個協調、統一的整體系統。
江寒耗費了一點腦細胞後,終於將“二進制單元”搞定。
接下來,就可以大展拳腳了。
只要做出一個二進制單元,就能很容易地做出n位寄存器。
只要將n個一模一樣的二進制單元,有機地組織在一起,就能構建出n個“比特門”。
然後將此寄存器的load信號,賦予每個“比特門”,就可以批量存取數據了。
通常用8個“比特門”,來實現一個字節的數據存取。
若干個字節組織在一起,又可以構成任意位寬的寄存器。
比如江寒打算實現的,就是一個由4個字節組成的32位寄存器。
每個寄存器存儲的位寬,也叫“字長”,若干個寄存器組織在一起,就形成了“寄存器組”。
江寒設計的寄存器組,由8個32位寄存器組成。
接下來,是“存儲塊”,也就是俗稱內存的RAM(隨機讀寫存儲器)。
這種內存在設計上,要求不管存儲單元的物理位置在哪裡,ALU都能花費基本相同的時間,直接訪問。
設計的時候,先給RAM的每個記憶單元,分配一個地址,然後構建一個由N個寄存器組成的陣列。
再構建一個邏輯門,使其通過地址訪問到對應的記憶單元……
典型的RAM接受三種輸入值:數據、地址和加載位。
RAM設計起來不容易,但實現起來意外的簡單。
江寒先做出了一個字節的RAM,然後將其與空白圖紙一起賣掉。
得到圖紙後,就利用自動搭建功能,批量生產出大量“字節存儲單元”。
接下來,就可以組裝出任意規模的存儲陣列了。
江寒組裝了一個8個字節的存儲陣列,稱之爲RAM8,然後將其再次轉換成圖紙。
接下來,製作8組RAM8陣列,設計配套的電路,將其組合在一起,就成了RAM64。
重複上述過程,就打造出了RAM512、RAM4K、RAM16K、RAM64K……
“我去,這麼貴?”
前面還好,從4kb內存開始,自動構建功能的附加收費,就超過了元件本身的價格了。
但爲了節省時間,消滅錯誤率,還是得使用這個自動構建功能。
浪費點積分也是值得的。
反正積分來的容易,萬一不夠了,再多做幾臺無線電發射器也就是了……