官术网_书友最值得收藏!

3.2 內存組織和尋址

我們已經看到,觸發器在需要記住一個位時很有用,寄存器在需要記住一組位時很方便。可當我們需要記住更多的信息時,應該使用什么呢?例如,如果我們希望存儲幾個不同的加法結果呢?

我們可以使用一大堆寄存器。但是現在我們遇到了一個新問題:如何指定要使用的寄存器,如圖3-19所示。

圖3-19 多個寄存器

解決這個問題的一種方法是為每個寄存器分配一個編號,如圖3-19所示。我們可以根據第2.5.2節中的標準構件解碼器使用編號或地址指定寄存器。解碼器的輸出與寄存器上的使能輸入連接。

接下來,我們需要從寄存器中挑選出一個輸出。幸運的是,第2.5.4節中已經介紹了如何構建選擇器,這正是我們所需要的。

系統通常包括多個連接在一起的內存組件。現在來介紹另一個標準構件:三態輸出模塊。

把寄存器、選擇器、解碼器三者組合在一起即為一個內存組件,如圖3-20所示。

圖3-20 內存組件

內存組件有很多電氣連接。如果想處理32位數字,我們需要輸入和輸出各32個連接,加上地址、控制信號和電源的連接。程序員不必關心如何將電路裝入軟件包或如何布線,但硬件設計師卻需要關心。認識到一點:很少需要同時讀取和寫入內存,我們就可以減少連接的數量。我們可以簡化為一組數據連接加上一個093-04控制。圖3-21為一個簡化的存儲芯片的示意圖。使能控制可以打開和關閉整個設備,以便多個存儲芯片可以連接在一起。

圖3-21 簡化存儲芯片

你會注意到,圖3-21中地址和數據使用了大而粗的箭頭,而不是使用單個指示符號。我們把一組相關的信號稱為總線,因此存儲芯片有一個地址總線和一個數據總線。

封裝存儲芯片的一個挑戰是當內存大小增加時,需要連接大量地址位。回顧第1章的表1-2,對于一個4GiB內存組件,我們需要32個地址連接。

內存設計者和道路規劃師一樣需要處理類似的交通管理問題。許多城市按網格規劃,存儲芯片內部布局的方式也是如此。在圖2-3所示的CPU顯微照片中可以看到幾個矩形區域,它們是內存塊。地址被分成兩塊:行地址和列地址。內存位置使用行和列的交集進行內部尋址,如圖3-22所示。

圖3-22 行尋址與列尋址

顯然,我們不需要擔心圖3-22所示的16位內存中地址行的數量。但如果有更多的地址行數量呢?我們可以通過多路復用行地址和列地址將地址行數減半。我們需要的只是用存儲芯片上的寄存器保存它們,如圖3-23所示。

圖3-23 使用地址寄存器的內存

由于地址分為兩部分,因此如果只更改一部分,例如先設置行地址然后改變列地址,性能會更好。我們可以發現如今的大型存儲芯片確實是這樣的。

存儲芯片的大小是以深度×寬度來描述的。例如,一個256×8的芯片有256個8位寬的內存位置,一個64 Mib×1的芯片有64個兆比特寬的內存位置。

3.2.1 隨機存取存儲器

到目前為止,我們所討論的內存稱為隨機存取存儲器(Random-Access Memory, RAM)。使用RAM,任何內存位置的整個寬度可以以任何順序讀寫。

靜態RAM或SRAM雖然成本很高但速度很快。每個位需要6個晶體管。因為這些晶體管占用不少的空間,SRAM并不是存儲數十億或萬億位的好選擇。

動態內存(DRAM)是一個聰明的黑客。電子被儲存在稱為電容器的微型桶中,只使用一個晶體管作桶蓋。問題是,這些存儲桶可能泄漏電子,所以需要每隔一段時間刷新一次內存,這意味著需要定期將存儲桶加滿。你必須小心,不要在與訪問內存發生沖突的時刻將存儲桶加滿;第一批基于DRAM的計算機DEC LSI-11就存在這樣的問題。DRAM的一個有趣的副作用是,當光線照射到充滿電子的存儲桶時,它們會漏出更多的電子,這使得存儲桶可以用在數碼相機中。

DRAM由于其高密度(每個區域的位數)而被用于制作大容量存儲芯片。大容量存儲芯片意味著大量的地址,大量的地址意味著DRAM芯片使用前面討論的多路尋址方案。由于其他內部設計考慮因素,使用行地址選通存儲行地址,然后通過列地址選通改變列地址會更快。行有時被稱為頁,這是一個被過度使用的術語。讀內存地址和閱讀一本書差不多,瀏覽一頁比翻頁容易得多。正如偉大的表演先驅Jimmy Durante所言,最好的表演是a-ras-a-ma-cas。這是一個編程中非常重要的考慮因素:將一起使用的東西放在同一行可以大大提高性能。

SRAM和DRAM都是易失性存儲器,這意味著當電源中斷時,數據可能會丟失。磁芯存儲器是一種古老的非易失性RAM,它將位存儲在圓環形(甜甜圈形狀)鐵片中,如圖3-24所示。圓環體在一個方向被磁化為0,另一個方向為1。圓環體的物理性質很酷,因為它們抵抗來自圓環外部電磁干擾的能力很強。在這種類型的存儲器中,磁芯排列在一個稱為平面的網格中,其中成行列的導線穿過它們。還有第三條線,叫作感知線,因為讀取位的狀態的唯一方法就是嘗試改變位,然后感知發生了什么。當然,如果感知到位變了,就必須把它改回去,否則數據就會丟失,位就會變得毫無用處。除所有的拼接處外,實現這點還需要大量的電路。磁芯實際上是三維存儲的,就像是多個平面被組裝成積木一樣。

圖3-24 磁芯存儲器

雖然磁芯是一種古老的技術,但它的非易失性仍然備受重視,研究人員還在繼續開發商業化實用磁阻存儲器,將磁芯存儲器和RAM的優點結合起來。

3.2.2 只讀存儲器

只讀存儲器(Read-Only Memory, ROM)并不是一個非常準確的名字。只能讀而不能寫的存儲器是沒有用的。這個名字已經過時了,更準確的說法是一次寫入存儲器。ROM可以寫入一次,然后讀取多次。ROM對于那些需要內置程序的設備(比如微波爐)很重要,畢竟大家都不想每次爆米花時都要對微波爐現場編程。

ROM的早期形式之一是Hollerith卡(后被稱為IBM卡),如圖3-25所示。位被打散到一張紙上。IBM卡相當便宜,因為它的發明者赫爾曼·何樂禮(Herman Hollerith)(1860—1929)非常擅長“偷工減料”。

圖3-25 IBM卡

19世紀末,Hollerith發明了Hollerith卡,更準確地說,他是從1801年約瑟夫·瑪麗·雅卡爾(Joseph Marie Jacquard)發明的提花織機中汲取了靈感。提花織機用穿孔卡片來控制織布圖案。當然,提花織機的創意來自Basile Bouchon,Basile Bouchon在1725年發明了穿孔紙帶控制織機。有時很難區分發明和借鑒,畢竟未來就是建立在過去的基礎上的。當聽到有人主張延長專利和限制版權法時,請記住這一點:如果不能在前人的基礎上再接再厲,人類的進步就會減慢。

早期的IBM讀卡器使用開關來讀取位。卡片會在一排有彈性的金屬絲下面滑動,這些金屬絲會穿過孔與另一邊的金屬接觸。后來的IBM讀卡器是通過孔將光線照射到另一邊的一排光電探測器上,這樣讀卡器的運行速度會快得多。

穿孔紙帶是一種與ROM相關的技術,一卷帶孔的紙帶可以用來表示位(見圖3-26)。相比于卡片,紙帶更有優勢,弄丟一張卡片會使數據混亂,而紙帶則不存在這個問題。不過,紙帶可能會被撕裂,而且很難修復,許多修復過的紙帶都會阻塞讀卡器正常工作。

圖3-26 穿孔紙帶

卡片和紙帶的速度非常慢,因為它們必須被移動才能被讀取。

阿波羅飛行計算機使用了一種稱為奧爾遜存儲器的ROM變體(見圖3-27)。因為它只能通過針腳寫入,所以它不受干擾,在惡劣的太空環境中,不受干擾的特點很重要。

圖3-27 阿波羅飛行導航計算機的奧爾遜存儲器

IBM卡和紙帶是順序存儲器,即數據是按順序讀取的。讀卡器不能倒轉,所以它們只適合長期存儲數據。為了方便使用,內容必須被讀入某種RAM中。1971年首次推出的商用單芯片微處理器英特爾4004,為更好的程序存儲技術創造了需求。這些最初的微處理器用于運行固定程序的計算器等設備。在單芯片微處理器之后而來的是掩模式可編程只讀存儲器。掩模是集成電路制造過程中使用的模板。你需要編寫一個程序,然后把位型和一張大額支票發送給半導體制造商。半導體制造商會把位型變成一個掩模,然后制造出包含程序的芯片。它是只讀的,因為如果不寫另一張大額支票且不做另一個不同的掩模,是沒有辦法改變它的。掩模式可編程只讀存儲器可以隨機存取的方式讀取。

掩模成本非常高昂,只能用于大容量應用設備。在掩模之后而來的是可編程只讀存儲器(Programmable Read-Only Memory, PROM),它是一種可以讓你自己編程的只讀存儲器(ROM)芯片,但只能編寫一次。PROM最初的機制涉及在芯片上熔化鎳鉻(一種鎳鉻合金)熔斷器。鎳鉻合金和烤箱里發光絲的材質是一樣的。

開發程序時,人們需要快速瀏覽一大堆PROM芯片。工程師不喜歡麻煩,所以接下來出現了可擦可編程只讀存儲器(Erasable Programmable Read-Only Memory, EPROM)。這些芯片與可編程只讀存儲器類似,只不過它們上面有一個石英窗,你可以把它們放在特殊的紫外線下擦掉它們。

隨著電擦除可編程只讀存儲器(Electrically Erasable Programmable Read-Only Memory, EEPROM)的引入,生活變得更好了。EPROM芯片可以用電擦除,不需要紫外光,也沒有石英窗。相對來說,擦除EEPROM的速度非常慢,所以人們不太想經常做這樣的事情。

從技術角度講,EEPROM是一種RAM,因為它可以按任何順序讀寫內容。但由于它們寫得慢而且比RAM貴,所以它們只被用作ROM的替代品。

主站蜘蛛池模板: 江北区| 呈贡县| 尤溪县| 临海市| 延寿县| 齐齐哈尔市| 甘孜| 泰兴市| 柞水县| 曲水县| 阳信县| 奇台县| 建瓯市| 韩城市| 酒泉市| 武平县| 虞城县| 敦煌市| 嘉兴市| 陕西省| 临城县| 漾濞| 镇沅| 万荣县| 彭山县| 墨玉县| 临海市| 沅江市| 黄大仙区| 扬州市| 亳州市| 筠连县| 冷水江市| 宁安市| 凉山| 鸡西市| 蚌埠市| 志丹县| 甘孜| 宜良县| 邛崃市|