單片機內(nei) 部存儲(chu) 結構分析
我們(men) 來思考一個(ge) 問題,當我們(men) 在編程器中把一條指令寫(xie) 進單片要內(nei) 部,然後取下單片機,單片機就可以執行這條指令,那麽(me) 這條指令一定保存在單片機的某個(ge) 地方,並且這個(ge) 地方在單片機掉電後依然可以保持這條指令不會(hui) 丟(diu) 失,這是個(ge) 什麽(me) 地方呢?這個(ge) 地方就是單片機內(nei) 部的隻讀存儲(chu) 器即ROM(READ ONLY MEMORY)。為(wei) 什麽(me) 稱它為(wei) 隻讀存儲(chu) 器呢?剛才我們(men) 不是明明把兩(liang) 個(ge) 數字寫(xie) 進去了嗎?原來在89C51中的ROM是一種電可擦除的ROM,稱為(wei) FLASH ROM,剛才我們(men) 是用的編程器,在特殊的條件下由外部設備對ROM進行寫(xie) 的操作,在單片機正常工作條件下,隻能從(cong) 那麵讀,不能把數據寫(xie) 進去,所以我們(men) 還是把它稱為(wei) ROM。
數的本質和物理現象:我們(men) 知道,計算機能進行數學運算,這可令我們(men) 非常的難以理解,計算機嗎,我們(men) 雖不了解它的組成,但它總隻是一些電子元器件,怎麽(me) 能進行數學運算呢?我們(men) 做數學題如37+45是這樣做的,先在紙上寫(xie) 37,然後在下麵寫(xie) 45,然後大腦運算,最後寫(xie) 出結果,運算的原材料:37、45和結果:82都是寫(xie) 在紙上的,計算機中又是放在什麽(me) 地方呢?為(wei) 了解決(jue) 這個(ge) 問題,先讓我們(men) 做一個(ge) 實驗:這裏有一盞燈,我們(men) 知道燈要麽(me) 亮,要麽(me) 不亮,就有兩(liang) 種狀態,我們(men) 能用’0’和’1’來代替這兩(liang) 種狀態,規定亮為(wei) ’1’,不亮為(wei) ’0’。現在放上兩(liang) 盞燈,一共有幾種狀態呢?我們(men) 列表來看一下:
狀態 |
![]() ![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
表達 |
0 0 |
0 1 |
1 0 |
1 1 |
請大家自已寫上3盞燈的情況000 001 010 011 100 101 110 111
我們(men) 來看,這個(ge) 000,001,101 不就是我們(men) 學過的的二進製數嗎?本來,燈的亮和滅隻是一種物理現象,可當我們(men) 把它們(men) 按一按的次序排更好後,燈的亮和滅就代表了數字了。讓我們(men) 再抽象一步,燈為(wei) 什麽(me) 會(hui) 亮呢?看電路1,是因為(wei) 輸出電路輸出高電平,給燈通了電。因此,燈亮和滅就能用電路的輸出是高電平還是低電平來替代了。這樣,數字就和電平的高、低聯係上了。(請想一下,我們(men) 還看到過什麽(me) 樣的類似的例程呢?(海軍(jun) 之)燈語、旗語,電報,甚至紅、綠燈)
什麽(me) 是位:
通過上麵的實驗我們(men) 已經知道:一盞燈亮或者說一根線的電平的高低,能代表兩(liang) 種狀態:0和1。實際上這就是一個(ge) 二進製位,因此我們(men) 就把一根線稱之為(wei) 一“位”,用BIT表示。
什麽(me) 是字節:
一根線能表於(yu) 0和1,兩(liang) 根線能表達00,01,10,11四種狀態,也就是能表於(yu) 0到3,而三根能表達0-7,計算機中常常用8根線放在一起,同時計數,就能表過到0-255一共256種狀態。這8根線或者8位就稱之為(wei) 一個(ge) 字節(BYTE)。不要問我為(wei) 什麽(me) 是8根而不是其它數,因為(wei) 我也不知道。(計算機世界是一本人造的世界,不是自然界,很多事情你無法問為(wei) 什麽(me) ,隻能說:它是一種規定,大家在以後的學習(xi) 過程中也要注意這個(ge) 問題)
存儲(chu) 器的工作原理:
1、存儲(chu) 器構造
存儲(chu) 器就是用來存放數據的地方。它是利用電平的高低來存放數據的,也就是說,它存放的實際上是電平的高、低,而不是我們(men) 所習(xi) 慣認為(wei) 的1234這樣的數字,這樣,我們(men) 的一個(ge) 謎團就解開了,計算機也沒什麽(me) 神秘的嗎。
讓我們(men) 看圖2。單片機裏麵都有這樣的存儲(chu) 器,這是一個(ge) 存儲(chu) 器的示意圖:一個(ge) 存儲(chu) 器就象一個(ge) 個(ge) 的小抽屜,一個(ge) 小抽屜裏有八個(ge) 小格子,每個(ge) 小格子就是用來存放“電荷”的,電荷通過與(yu) 它相連的電線傳(chuan) 進來或釋放掉,至於(yu) 電荷在小格子裏是怎樣存的,就不用我們(men) 操心了,你能把電線想象成水管,小格子裏的電荷就象是水,那就好理解了。存儲(chu) 器中的每個(ge) 小抽屜就是一個(ge) 放數據的地方,我們(men) 稱之為(wei) 一個(ge) “單元”。
有了這麽(me) 一個(ge) 構造,我們(men) 就能開始存放數據了,想要放進一個(ge) 數據12,也就是00001100,我們(men) 隻要把第二號和第三號小格子裏存滿電荷,而其它小格子裏的電荷給放掉就行了(看圖3)。可是問題出來了,看圖2,一個(ge) 存儲(chu) 器有好多單元,線是並聯的,在放入電荷的時候,會(hui) 將電荷放入所有的單元中,而釋放電荷的時候,會(hui) 把每個(ge) 單元中的電荷都放掉,這樣的話,不管存儲(chu) 器有多少個(ge) 單元,都隻能放同一個(ge) 數,這當然不是我們(men) 所希望的,因此,要在結構上稍作變化,看圖2,在每個(ge) 單元上有個(ge) 控製線,我想要把數據放進哪個(ge) 單元,就給一個(ge) 信號這個(ge) 單元的控製線,這個(ge) 控製線就把開關(guan) 打開,這樣電荷就能自由流動了,而其它單元控製線上沒有信號,所以開關(guan) 不打開,不會(hui) 受到影響,這樣,隻要控製不一樣單元的控製線,就能向各單元寫(xie) 入不一樣的數據了,同樣,如果要某個(ge) 單元中取數據,也隻要打開對應的控製開關(guan) 就行了。
2、存儲(chu) 器譯碼
那麽(me) ,我們(men) 怎樣來控製各個(ge) 單元的控製線呢?這個(ge) 還不簡單,把每個(ge) 單元元的控製線都引到集成電路的外麵不就行了嗎?事情可沒那麽(me) 簡單,一片27512存儲(chu) 器中有65536個(ge) 單元,把每根線都引出來,這個(ge) 集成電路就得有6萬(wan) 多個(ge) 腳?不行,怎麽(me) 辦?要想法減少線的數量。我們(men) 有一種辦法稱這為(wei) 譯碼,簡單介紹一下:一根線能代表2種狀態,2根線能代表4種狀態,3根線能代表幾種,256種狀態又需要幾根線代表?8種,8根線,所以65536種狀態我們(men) 隻需要16根線就能代表了。
(圖4)
3、存儲(chu) 器的選片及總線的概念
至此,譯碼的問題解決(jue) 了,讓我們(men) 再來關(guan) 注另外一個(ge) 問題。送入每個(ge) 單元的八根線是用從(cong) 什麽(me) 地方來的呢?它就是從(cong) 計算機上接過來的,一般地,這八根線除了接一個(ge) 存儲(chu) 器之外,還要接其它的器件,如圖4所示。這樣問題就出來了,這八根線既然不是存儲(chu) 器和計算機之間專(zhuan) 用的,如果總是將某個(ge) 單元接在這八根線上,就不好了,比如這個(ge) 存儲(chu) 器單元中的數值是0FFH另一個(ge) 存儲(chu) 器的單元是00H,那麽(me) 這根線到底是處於(yu) 高電平,還是低電平?豈非要打架看誰曆害了?所以我們(men) 要讓它們(men) 分離。辦法當然很簡單,當外麵的線接到集成電路的管腳進來後,不直接接到各單元去,中間再加一組開關(guan) (參考圖4 )就行了。平時我們(men) 讓開關(guan) 關(guan) 閉著,如果確實是要向這個(ge) 存儲(chu) 器中寫(xie) 入數據,或要從(cong) 存儲(chu) 器中讀出數據,再讓開關(guan) 接通就行了。這組開關(guan) 由三根引線選擇:讀控製端、寫(xie) 控製端和片選端。要將數據寫(xie) 入片中,先選中該片,然後發出寫(xie) 信號,開關(guan) 就合上了,並將傳(chuan) 過來的數據(電荷)寫(xie) 入片中。如果要讀,先選中該片,然後發出讀信號,開關(guan) 合上,數據就被送出去了。注意圖4,讀和寫(xie) 信號同時還接入到另一個(ge) 存儲(chu) 器,但是由於(yu) 片選端不一樣,所以雖有讀或寫(xie) 信號,但沒有片選信號,所以另一個(ge) 存儲(chu) 器不會(hui) “誤會(hui) ”而開門,造成衝(chong) 突。那麽(me) 會(hui) 不一樣時選中兩(liang) 片芯片呢?隻要是設計好的係統就不會(hui) ,因為(wei) 它是由計算控製的,而不是我們(men) 人來控製的,如果真的出現同時出現選中兩(liang) 片的情況,那就是電路出了故障了,這不在我們(men) 的討論之列。
從(cong) 上麵的介紹中我們(men) 已經看到,用來傳(chuan) 遞數據的八根線並不是專(zhuan) 用的,而是很多器件大家共用的,所以我們(men) 稱之為(wei) 數據總線,總線英文名為(wei) BUS,總即公交車道,誰者能走。而十六根地址線也是連在一起的,稱之為(wei) 地址總線。
半導體(ti) 存儲(chu) 器的分類
按功能能分為(wei) 隻讀和隨機存取存儲(chu) 器兩(liang) 大類。所謂隻讀,從(cong) 字麵上理解就是隻能從(cong) 裏麵讀,不能寫(xie) 進去,它類似於(yu) 我們(men) 的書(shu) 本,發到我們(men) 手回之後,我們(men) 隻能讀裏麵的內(nei) 容,不能隨意更改書(shu) 本上的內(nei) 容。隻讀存儲(chu) 器的英文縮寫(xie) 為(wei) ROM(READ ONLY MEMORY)
所謂隨機存取存儲(chu) 器,即隨時能改寫(xie) ,也能讀出裏麵的數據,它類似於(yu) 我們(men) 的黑板,我能隨時寫(xie) 東(dong) 西上去,也能用黑板擦擦掉重寫(xie) 。隨機存儲(chu) 器的英文縮寫(xie) 為(wei) RAM(Random Access Memory)這兩(liang) 種存儲(chu) 器的英文縮寫(xie) 一定要記牢。
注意:所謂的隻讀和隨機存取都是指在正常工作情況下而言,也就是在使用這塊存儲(chu) 器的時候,而不是指製造這塊芯片的時候。不然,隻讀存儲(chu) 器中的數據是怎麽(me) 來的呢?其實這個(ge) 道理也很好理解,書(shu) 本拿到我們(men) 手裏是不能改了,能當它還是原材料——白紙的時候,當然能由印刷廠印上去了。
順便解釋一下其它幾個(ge) 常見的概念。
PROM,稱之為(wei) 可編程存儲(chu) 器。這就象我們(men) 的練習(xi) 本,買(mai) 來的時候是空白的,能寫(xie) 東(dong) 西上去,可一旦寫(xie) 上去,就擦不掉了,所以它隻能用寫(xie) 一次,要是寫(xie) 錯了,就報銷了。(現在已經被淘汰)
EPROM,稱之為(wei) 紫外線擦除的可編程隻讀存儲(chu) 器。它裏麵的內(nei) 容寫(xie) 上去之後,如果覺得不滿意,能用一種特殊的辦法去掉後重寫(xie) ,這就是用紫外線照射,紫外線就象“消字靈”,能把字去掉,然後再重寫(xie) 。當然消的次數多了,也就不靈光了,所以這種芯片能擦除的次數也是有限的——幾百次吧。(現在已經被淘汰)
EEPROM,也叫 E2PROM稱之為(wei) 電可擦可編程隻讀存儲(chu) 器,它和EEPROM類似,寫(xie) 上去的東(dong) 西也能擦掉重寫(xie) ,但它要方便一些,不需要光照了,隻要用電就能擦除或者重新改寫(xie) 數據,所以就方便許多,而且壽命也很長(幾萬(wan) 到幾十萬(wan) 次不等)。
FLASH,稱之為(wei) 閃速存儲(chu) 器,屬於(yu) EEPROM的改進產(chan) 品,它的最大特點是必須按塊(Block)擦除(每個(ge) 區塊的大小不定,不同廠家的產(chan) 品有不同的規格), 而EEPROM則可以一次隻擦除一個(ge) 字節(Byte)。FLASH現在常用於(yu) 大容量存儲(chu) ,比如u盤
再次強調,這裏的所有的寫(xie) 都不是指在正常工作條件下。不管是PROM還是EPROM,它們(men) 的寫(xie) 都要有特殊的條件,一般我們(men) 用一種稱之為(wei) “編程器”的設備來做這項工作,一旦把它裝到它的工作位置,就不能隨便改寫(xie) 了。