歡迎您光臨本站 註冊首頁

處理器和存儲器的錯位相連

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

處理器和存儲器的錯位相連

處理器和存儲器的錯位相連         
      
  對於具體存儲器而言,它的位寬是一定的,所謂位寬,指的是「讀/寫操作時,最小的數據單元」──別說最小單元是「位」,一般存儲器上沒有單獨的「位操作」,修改位時通過把整個位元組、字或雙字讀出來、修改,再回寫。對於處理器來說,一個地址對應的是一個位元組(8位),也就是說處理器的地址線對應的最小數據單元是位元組。
        這裡需要注意的是,不要把「存儲器的位寬」和「處理器的位數」這兩個概念混淆了。存儲器的位寬是讀寫存儲器的最小數據單元,處理器位數是處理器可以一次處理的位元組數,32位處理器可以一次處理4位元組數據。
       如果處理器最小數據單元是8位,存儲器位寬是16位,那在我們寫程序時會特意進行16位操作嗎?顯然不會,我們寫代碼時,可不管外設到底是多少位。這是如何實現的呢?原因在於有存儲控制器(Memory Controller)這個中間層。
       存儲控制器根據存儲器的位寬,每次總是讀/寫16位數據。
       以讀操作為例:
       處理器進行8位操作時,它選擇其中的8位返回給處理器;
       處理器進行16位操作時,它直接把這16位數據返回給處理器;
       處理器進行32位操作時,它發起2次讀/寫,把結果組合成32位返回給處理器。
       假設現在的連線是:處理器的(ADDR1-ADDR20)接到 16位的存儲器(A0-A19),即處理器的ADDR0不接──這說明:不管ADDR0是0還是1,存儲器接收到的地址是一樣的。處理器發出地址0bxxxxxxxxx0、0bxxxxxxxxx1時,存儲器看到的都是0bxxxxxxxxx,返回給存儲控制器的都是同一個16位數據。再由Memory Controller選擇其中的低8位或高8位給處理器。
        存儲控制器會做以下事情:
        軟體要讀取地址0上的8位數據時,硬體是這樣進行的:
         ① Memory Controller發出0b000000000000000000000的地址信號,存儲器的A0-A19線上的信號是:0b00000000000000000000
         ② 存儲器在數據匯流排D0~D15上提供一個16位的「最小數據單元」的數據;
         ③ 存儲控制器讀入16位數據;
         ④ 存儲控制器把16位數據的低8位返回給處理器,就得到了一個8位數據。
        軟體要讀取地址1上的8位數據時,硬體是這樣進行的:
        ① 存儲控制器發出0b000000000000000000001的地址信號,存儲器的A0-A19線上的信號是:0b00000000000000000000
        ② 存儲器在數據匯流排D0~D15上提供一個16位的數據,這是存儲器中的第1個「最小數據單元」
        ③ 存儲控制器讀入這個16位數據
        ④ 存儲控制器把這個16位數據的高8位(注意,前面的低8位)返回給處理器,這就是一個8位數據。
       所以:
        外設位寬是8時,處理器的A0~AXX與外設的A0~AXX直接相連
        外設位寬是16時,處理器的A1~AXX與外設的A0~AYY直接相連,表示不管處理器的A0是0還是1,外設看到的都是同一個地址,對應16位的數據,存儲控制器對數據進行選擇或組合,再提供給處理器。
        外設位寬是32時,處理器的A2~AXX與外設的A0~AZZ直接相連,表示不管處理器的A0A1是00,01,10還是11,外設看到的都是同一個地址,對應32位的數據,「Memory Controller」對數據進行選擇或組合,再提供給處理器
《解決方案》

謝謝分享

[火星人 ] 處理器和存儲器的錯位相連已經有238次圍觀

http://coctec.com/docs/service/show-post-1478.html