1. 程式人生 > >CPU與儲存外設之間的地址線連線方法

CPU與儲存外設之間的地址線連線方法

flash連線CPU時,根據不同的資料寬度,比如16位的NOR FLASH (A0-A19),處理器的地址線要(A1-A20)左移偏1位。為什麼要偏1位?

從軟體和CPU的角度而言,一個地址對應一個位元組,就是8位資料。這是肯定的,不要懷疑這點。

對於具體器件而言,它的位寬是一定的,所謂位寬,指的是“讀/寫操作時,最小的資料單元”──別說最小單元是“位”,一般裝置上沒有單獨的“位操作”,修改位時通過把整個位元組、字或雙字讀出來、修改,再回寫。

CPU的地址線(A0-A20)對應的最小資料單元是位元組,即8位;
而位寬為16的NOR FLASH的地址線(A0-A19)對應的最小資料單元是16位。
這兩個怎麼對應起來?

如果說外設的位寬是16,難道我們寫程式時會“特意”以16位進行操作嗎?不用的,我們寫程式時根本不用管外設位寬是8、16還是32。

仔細想想,其實是可以想通的:既然CPU、外設NOR FLASH的最小讀/寫單元已經固定,那麼肯定就是CPU與NOR FLASH之間有個中間層,它來做處理:
這個中間層被稱為“Memory Controller”,CPU要進行讀寫操作時,“Memory Controller”根據NOR FLASH的位寬,每次總是讀/寫16位資料。
以讀操作為例:
CPU想進行8位操作時,它選擇其中的8位返回給CPU;
CPU想進行16位操作時,它直接把這16位資料返回給CPU;
CPU想進行32位操作時,它發起2次讀/寫,把結果組合成32位返回給CPU。

現在的連線是:CPU的(A1-A20)接到 16位的NOR FLASH (A0-A19),即CPU的A0不接──這說明:不管A0是0還是1,NOR FLASH接收到的地址是一樣的。
CPU發出地址0bxxxxxxxxx0、0bxxxxxxxxx1時,NOR FLASH看到的都是0bxxxxxxxxx,返回給“Memory Controller”的都是同一個16位資料。
再由“Memory Controller”選擇其中的低8位或高8位給CPU。

“Memory Controller”會幫助我們做這些事情,舉例為證:
1. 軟體要讀取地址0上的8位資料時,硬體是這樣進行的:
① “Memory Controller”發出0b000000000000000000000的地址訊號,NOR FLASH的A0-A19線上的訊號是:0b00000000000000000000
② NOR FLASH在資料匯流排D0~D15上提供一個16位的資料,這是NOR FLASH中的第1個“最小資料單元”
③ “Memory Controller”讀入這個16位資料
④ “Memory Controller”把這個16位資料的低8位返回給CPU,這就是一個8位資料。

  1. 軟體要讀取地址1上的8位資料時,硬體是這樣進行的:
    ① “Memory Controller”發出0b000000000000000000001的地址訊號,NOR FLASH的A0-A19線上的訊號是:0b00000000000000000000
    ② NOR FLASH在資料匯流排D0~D15上提供一個16位的資料,這是NOR FLASH中的第1個“最小資料單元”
    ③ “Memory Controller”讀入這個16位資料
    ④ “Memory Controller”把這個16位資料的高8位(注意,前面的低8位)返回給CPU,這就是一個8位資料。

  2. 軟體要讀取地址2上的8位資料時,硬體是這樣進行的:
    ① “Memory Controller”發出0b000000000000000000010的地址訊號,NOR FLASH的A0-A19線上的訊號是:0b00000000000000000001
    ② NOR FLASH在資料匯流排D0~D15上提供一個16位的資料,這是NOR FLASH中的第2個“最小資料單元”
    ③ “Memory Controller”讀入這個16位資料
    ④ “Memory Controller”把這個16位資料的低8位返回給CPU,這就是一個8位資料。

  3. 軟體要讀取地址3上的8位資料時,硬體是這樣進行的:
    ① “Memory Controller”發出0b000000000000000000011的地址訊號,NOR FLASH的A0-A19線上的訊號是:0b00000000000000000001
    ② NOR FLASH在資料匯流排D0~D15上提供一個16位的資料,這是NOR FLASH中的第2個“最小資料單元”
    ③ “Memory Controller”讀入這個16位資料
    ④ “Memory Controller”把這個16位資料的高8位(注意,第3點是低8位)返回給CPU,這就是一個8位資料。

  4. 軟體要讀取地址0和1上的16位資料時,硬體是這樣進行的:
    ① “Memory Controller”發出0b000000000000000000000的地址訊號,NOR FLASH的A0-A19線上的訊號是:0b00000000000000000000
    ② NOR FLASH在資料匯流排D0~D15上提供一個16位的資料,這是NOR FLASH中的第1個“最小資料單元”
    ③ “Memory Controller”讀入這個16位資料
    ④ “Memory Controller”把這個16位資料返回給CPU

  5. 軟體要讀取地址2和3上的16位資料時,硬體是這樣進行的:
    ① “Memory Controller”發出0b000000000000000000010的地址訊號,NOR FLASH的A0-A19線上的訊號是:0b00000000000000000001
    ② NOR FLASH在資料匯流排D0~D15上提供一個16位的資料,這是NOR FLASH中的第2個“最小資料單元”
    ③ “Memory Controller”讀入這個16位資料
    ④ “Memory Controller”把這個16位資料返回給CPU

  6. 軟體要讀取地址0、1、2、3上的32位資料時,硬體是這樣進行的:
    ① “Memory Controller”發出0b000000000000000000000的地址訊號,NOR FLASH的A0-A19線上的訊號是:0b00000000000000000000
    ② NOR FLASH在資料匯流排D0~D15上提供一個16位的資料,這是NOR FLASH中的第1個“最小資料單元”
    ③ “Memory Controller”讀入這個16位資料

    ④ “Memory Controller”發出0b000000000000000000010的地址訊號,NOR FLASH的A0-A19線上的訊號是:0b00000000000000000001
    ⑤ NOR FLASH在資料匯流排D0~D15上提供一個16位的資料,這是NOR FLASH中的第2個“最小資料單元”
    ⑥ “Memory Controller”讀入這個16位資料
    ⑦ “Memory Controller”把兩個16位的資料組合成一個32位的資料,返回給CPU。

    從1~7可知:
    ① 對於軟體而言,它不知道底下發生了什麼事,它只管結果:
    讀取地址0的8位資料,就得到了一個8位資料;讀取地址1的8位資料,就得到另一個緊挨著的8位資料
    讀取地址0開始的16位資料,就得到了一個16位資料;讀取地址2開始的16位資料,就得到另一個緊挨著的16位資料
    讀取地址0開始的32位資料,就得到了一個32位資料;讀取地址4開始的32位資料,就得到另一個緊挨著的32位資料
    ② 對於NOR FLASH,它只按照A0-A19地址線,提供16位資料,才不管軟體要的是8位、16位,還是32位呢。
    ③ “Memory Controller”完成了這些位寬之間的資料選擇、合併。

所以:
外設位寬是8時,CPU的A0~AXX與外設的A0~AXX直接相連
外設位寬是16時,CPU的A1~AXX與外設的A0~AYY直接相連,表示不管CPU的A0是0還是1,外設看到的都是同一個地址,對應16位的資料,“Memory Controller”對資料進行選擇或組合,再提供給CPU。
外設位寬是32時,CPU的A2~AXX與外設的A0~AZZ直接相連,表示不管CPU的A0A1是00,01,10還是11,外設看到的都是同一個地址,對應32位的資料,“Memory Controller”對資料進行選擇或組合,再提供給CPU。

但是也不是所有位寬16bit的flash與cpu的連線 都是像上述那樣錯開一位的,與具體的flash晶片設計有關係,所以需要檢視其datsheet,下文以晶片士通的29LV650和intel的E29F128為例進行說明

這裡看來intel nor flash在位寬為16bit時(由VPEN選擇),把A0忽略掉了(需要查手冊查證)

下面研究一下系統匯流排地址(cpu_addr)、寬度(bus_width)與nor flash裝置匯流排地址(device_addr)、位度(device_width)的區別與聯絡:

一、對於nor flash裝置來說
1、nor flash裝置的位寬視晶片廠商而定,有x8、x16兩總方式(雖然現在主要使用x16的方式,不過核心於啟動程式碼裡面仍然保留著對x8和x16兩種方式的支援);把多片nor flash並起來使用可以擴大位寬(比如兩片x8的nor flash並起來使用位寬擴大為x16)。

2、nor flash裝置的匯流排地址(定址)範圍視具體晶片以及其採用的位寬而定:

以富士通的29LV650為例:
(29LV650的容量是8Mbyte,共128個sector,每個sector的大小是64 kbyte)
1)如果選擇位寬為x8,裝置匯流排的每個地址代表了一個byte的儲存單元,固其匯流排地址範圍為8M(0x000000~0x7fffff);
2)如果選擇位寬為x16,裝置匯流排的每個地址代表了兩個byte的儲存單元,固其匯流排地址範圍為4M(0x000000~0x3fffff);

再來看看intel的E29F128:
(E29F128的容量為16Mbyte,共128個sector,每個sector的大小是128Kbyte)
1)如果選擇位寬為x8,裝置匯流排的每個地址代表了一個byte的儲存單元,固其匯流排地址範圍為16M(0x000000~0xffffff);
2)如果選擇位寬為x16,情況和富士通的29LV650不同,這時候裝置的A0腳不可用,所以你不能訪問到奇地址的儲存單元,而只能0、2、4…地址的來訪問,其匯流排地址範圍為8M(0x000000~0xffffff的偶地址)

二、對於系統來說
以S3C2410為例,cpu匯流排寬度是32位,可以通過8、16、32位的匯流排寬度來訪問nor flash裝置,視裝置的位寬和是否並起來使用而定:
注:
buswidth=device_width*interleave:

然而,在cpu的眼裡,每一個地址代表1byte的儲存單元,不像nor flash裝置那樣,還有byte、word之分。

三、好了,瞭解了系統匯流排地址、寬度與nor flash裝置匯流排地址、位寬後的區別後,
現在討論一下cpu與nor flash的接法問題(通過舉例來說明):

1、對於富士通的29LV650
1)選擇x8方式,cpu的A0~A22接nor flash的A0~A22
2)選擇x16方式,cpu的A1~A22接nor flash的A0~A21
注意:
cpu的A1接nor flash的A0,cpu只能訪問偶地址,cpu的一次操作訪問了2byte大小的儲存單元。

2、對於intel的E29F128
1)選擇x8方式,cpu的A0~A23接nor flash的A0~A23
2)選擇x16方式,由於這時候地址線A0不再有效(這點與富士通的29LV650不同),
intel E29F128的A1等價於富士通的29LV650的A0,所以系統匯流排A1~A23接nor flash的A1~A23

四、在cpu對nor flash定址方面

1、對於富士通的29LV650
1)在x8模式,系統匯流排和nor flash匯流排一一對應,直接訪問
2)在x16模式,nor flash的對外匯流排縮小一半,一個地址可定址的儲存單元由原來的1 byte變為1 word(1 sector的地址範圍由原來的1<<16變為1<<15),所以我們對其進行定址的時候,需要把所要定址的儲存單元地址>>1位
注意:
我這裡說的是以byte為單位的儲存單元地址

由於系統匯流排的A1接nor flash的A0,固系統匯流排地址等於nor flash匯流排地址<<1位

注意:
我這裡說的是nor flash的匯流排地址,對於x8方式以byte為單位,對於x16方式以word為單位

2、對於intel的E29F128
1)在x8模式,系統匯流排和nor flash匯流排一一對應,直接訪問
2)在x16模式,nor flash匯流排的A0不再使用,有效的匯流排為A1~A23,所以我們對其定址的時候,不必像富士通的29LV650那樣需要把所要訪問的儲存單元地址>>1位(因為A0不再有效,等於奇地址自動被忽略,只有偶地址起作用)
同樣:
由於nor flash匯流排的A0不起作用,系統匯流排的A1接nor flash的A1,所以我們只要直接給出儲存單元的地址即可,不比對其進行<<1位操作(不過由於裝置匯流排A0不起作用,所以系統只能訪問到偶地址的儲存單元,奇地址將會被忽略)

相關推薦

CPU儲存外設之間地址連線方法

flash連線CPU時,根據不同的資料寬度,比如16位的NOR FLASH (A0-A19),處理器的地址線要(A1-A20)左移偏1位。為什麼要偏1位? 從軟體和CPU的角度而言,一個地址對應一個位元組,就是8位資料。這是肯定的,不要懷疑這點。 對於具體器

FLASH位寬為8、16、32時,CPU外設之間地址連線方法

FLASH連線CPU時,根據不同的資料寬度,比如16位的NOR FLASH (A0-A19),處理器的地址線要(A1-A20)左移偏1位。為什麼要偏1位? 從軟體和CPU的角度而言,一個地址對應一個位元組,就是8位資料。這是肯定的,不要懷疑這點。 對於具體器件而言,它的位寬

JDBCSQL SERVER各個版本的連線方法

由於工作的需要,最近總是接觸SQL SERVER 。但各個版本的JDBC連線方式都有所不同,這給我的軟體開發帶來了一定的麻煩,現在將各個版本的SQL SERVER與JDBC連線的方式總結如下: 1.SQL SERVER 2000   JDBC驅動程式:msbase.jar、m

iframe子頁面父頁面之間互相操作的方法

jQuery取得iframe中元素的幾種方法 在iframe子頁面獲取父頁面元素 程式碼如下: $('#objId', parent.document); 在父頁面 獲取iframe子頁面的元素 程式碼如下: $("#objid",documen

qemu-kvm虛擬機器宿主機之間簡單檔案傳輸方法

 qemu-kvm虛擬機器與宿主機之間實現檔案傳輸,大概兩類方法: 1. 虛擬機器與宿主機之間,使用網路來進行檔案傳輸。這個需要先在宿主機上配置網路橋架,在qemu-kvm啟動配置網絡卡就可以實現檔案傳輸。 2. 使用9psetup協議實現虛擬機器與宿主機之間檔案傳輸。

計算機組成原理儲存器的補充——半導體儲存晶片儲存容量資料線和地址的關係

1、儲存器 Ⅰ Flash ROM: SST39VF1601 資料位寬為16位(16根資料線);20根地址線;2M(1M*16bit)。 Ⅱ SDRAM: HY57V641620HG 資料位寬為16位(16根資料線);12根地址線(行地址選擇線有12根,列地址選擇線有8根(1

C# 子主線程之間的通信

通知 spl 等待 bject src gif tro 分享 pen   先說明一下,本人最近遇到了什麽問題,就是在寫寫消息隊列的時候,發現消息隊列每次接收一個消息的時候都是創建了一個新的線程。這樣就導致了消息處理的時候沒有在主線程上進行,然而其中的一些步事項是要通過主線程

進程之間的聯系和區別

ID 情況下 線程棧 情況 自己 有一個 靜態 CP 文件描述 線程和進程之間的聯系和區別: 線程擁有自己的線程id,一組寄存器值,調度優先級和策略,線程棧,除此以外,線程共享進程的所有資源,如堆、文件描述符、進程的代碼段、全局變量區(靜態局部變量、全局變量)。進程是系統資

計算機組成原理——匯流排補充:地址匯流排、資料匯流排、定址能力、字長及cpu位數等概念之間的關係

地址匯流排決定了CPU的定址能力;資料匯流排的寬度與字長及CPU位數一致。 詳細解釋見下文: 1.地址匯流排與定址能力 要存取資料或指令就要知道資料或指令存放的位置,地址暫存器儲存的就是CPU當前要存取的資料或指令的地址,該地址是由地址匯流排傳輸到地址暫存器上的。

一個jdbc儲存過程呼叫之間的資料對映問題

背景 一個功能,管理員直接新增使用者賬號,儲存過程如下【postgresql資料庫】: -- 儲存過程 管理員直接新增會員賬號 CREATE OR REPLACE FUNCTION "sp_account_member_reg_by_admin"( para_nam

宿主機docker容器之間免密碼ssh連結,容器容器之間ssh免密碼連線

轉:https://segmentfault.com/a/1190000012484646 若要實現免密登陸,意味著無論是宿主機,還是容器都要彼此互動公鑰: 容器A傳送自身公鑰給中心機器,統一由中心機器,回發全部需要ssh到容器A的公鑰資訊,任何一個新加入的容器,傳送資訊給中心機器,則中心機

IP地址點分十進位制二進位制整數之間的轉換

error C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnin

Shader學習——CPUGPU之間的通訊

應用階段分為3個階段: 1、把資料載入到視訊記憶體中   把渲染所需的資料從硬碟載入到系統記憶體,再從記憶體載入到視訊記憶體。顯示卡對視訊記憶體的訪問速度更快。 2、設定渲染狀態   渲染狀態定義了場景中的網格是怎樣被渲染的。如設定使用哪個頂點著色器,材

遠端桌面連線本地機器之間資料拷貝

遠端桌面連線也就是mstsc.exe應用程式,開啟遠端桌面連線,如果我們想把本地資料拷貝到遠端桌面,或者將遠端桌面的資料拷貝到本地,該如何操作呢?有兩種方式可以選擇: 方式一:普通文字或其他格式的資料(資料大小在2G以下),可以在遠端桌面與本地桌面之間直接拖拽即可 方式二:將本地硬碟掛接到遠端桌面所在的機

CPUGPU之間資料傳輸(轉)

一般的資料複製到的顯示卡記憶體的部份,稱為 global memory int* gpudata, *result;     cudaMalloc((void**) &gpudata, sizeof(int) * DATA_SIZE);     cudaMallo

計算機概論:02---電腦主機板架構、CPU、記憶體、顯示卡、硬碟儲存裝置、擴充套件卡介面、主機板、主機電源簡介

一、電腦主機板架構 1.概念:主機板是連線各元件的重要部分。主機板上連線各部分元件的晶片組,其設計優劣,會影響電腦的效能 2.晶片組 ①早期晶片組:早期的晶片組通常分為兩個網橋來控制各元件的通訊 北橋:負責連線速度較快的CPU、記憶體與顯示卡等元件 南橋:負責連線速度

githubgit之間怎麼建立連線

git是一款強大的分散式版本控制系統。與之對應的是集中式版本控制系統,例如SVN。看一下區別:集中式(代表作:SVN):多臺電腦連線一個主機,修改東西之後推到一個主機。分散式(代表作:git):每臺電腦上都有一個專案,改完之後推到主機上方便成員互動。集中式的假如網速很慢,那你

處理器字長、儲存容量 和資料線、地址、控制線的關係

地址匯流排,字長,記憶體容量,定址範圍 之間的計算 1.處理器字長與資料線位數的關係 2.儲存容量和地址線位數的關係 3.定址能力和地址線位數的關係 4.儲存空間的編號也就是記憶體編號取決於地址線還是資料線     處理機字長是指處理機能同時處理(或運算)

修改易通CmsEasy產品圖片的較寬內邊距為細和左側文字說明小圖示之間的距離

在模板編輯狀態下,對/archive/show_products.html檔案裡的程式碼進行修改: #image_box { margin:0 auto; width:326px; height:90%; /*非IE的主流瀏覽器識別的垂直居中的方法*/

儲存器容量、位寬及其地址根數三者之間的關係

轉載於:http://blog.sina.com.cn/s/blog_498dc96f0100gc2r.html 1、儲存器 Ⅰ   Flash ROM:  SST39VF1601 資料位寬為16位(16根資料線);20根地址線;2M(1M*16bit)。 Ⅱ