久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4070|回復: 3
收起左側

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

[復制鏈接]
ID:99624 發表于 2015-12-27 05:15 | 顯示全部樓層 |閱讀模式
對于具體存儲器而言,它的位寬是一定的,所謂位寬,指的是“讀/寫操作時,最小的數據單元”──別說最小單元是“位”,一般存儲器上沒有單獨的“位操作”,修改位時通過把整個字節、字或雙字讀出來、修改,再回寫。對于處理器來說,一個地址對應的是一個字節(8位),也就是說處理器的地址線對應的最小數據單元是字節。
       這里需要注意的是,不要把“存儲器的位寬”和“處理器的位數”這兩個概念混淆了。存儲器的位寬是讀寫存儲器的最小數據單元,處理器位數是處理器可以一次處理的字節數,32位處理器可以一次處理4字節數據。
     如果處理器最小數據單元是8位,存儲器位寬是16位,那在我們寫程序時會特意進行16位操作嗎?顯然不會,我們寫代碼時,可不管外設到底是多少位。這是如何實現的呢?原因在于有存儲控制器(MemoryController)這個中間層。
      存儲控制器根據存儲器的位寬,每次總是讀/寫16位數據。
      以讀操作為例:
      處理器進行8位操作時,它選擇其中的8位返回給處理器;
      處理器進行16位操作時,它直接把這16位數據返回給處理器;
      處理器進行32位操作時,它發起2次讀/寫,把結果組合成32位返回給處理器。
      假設現在的連線是:處理器的(ADDR1-ADDR20)接到16位的存儲器(A0-A19),即處理器的ADDR0不接──這說明:不管ADDR0是0還是1,存儲器接收到的地址是一樣的。處理器發出地址0bxxxxxxxxx0、0bxxxxxxxxx1時,存儲器看到的都是0bxxxxxxxxx,返回給存儲控制器的都是同一個16位數據。再由MemoryController選擇其中的低8位或高8位給處理器。
       存儲控制器會做以下事情:
       軟件要讀取地址0上的8位數據時,硬件是這樣進行的:
        ① MemoryController發出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位的數據,“MemoryController”對數據進行選擇或組合,再提供給處理器


ARM與不同位寬存儲器的地址線錯位接口 , 外部總線接口深入
ARM是32位,地址空間是2的32次冪,4G地址空間。所有的外設(FLASH,RAM,SD卡等等)都映射到這4G的空間上。比如大部分ARM7都把RAM映射到0x40000000,所以對RAM的操作就在0X40000000開始的地址上。FLASH從0X0開始。使用FLASH還要考慮地址重映射,就是選擇片內FLASH或片外FLASH。

  FLASH一般是8位或16位,當它接到32位的ARM上時,地址位就會錯位。對于16位FLASH,FLASH的A0要接ARM的A1。對于8位FLASH,FLASH的A0要接ARM的A0。ARM的A0對應8位,ARM的A1對應16位,ARM的A2對應32位,如果FLASH是32位,那么FLASH的A0接ARM的A2

32位的FLASH,FLASH的A0要接ARM的A2,因為32位地址表示4個字節,每次要跳4個字節的話,那么就是從A2開始才變化,A1 A0不變化
16位的FLASH,FLASH的A0要接ARM的A1,因為16位地址表示2個字節,每次要跳2個字節的話,那么就是從A1開始才變化,A0不變化
8位的FLASH,FLASH的A0要接ARM的A0,因為8位地址表示1個字節,每次要跳1個字節的話,那么就是從A0開始才變化。
    對于 16位的FLASH ,我們可以這樣認為:16位存儲器的設計者將低位A[0]省掉了,我們只要讀取一次就可以得到兩個字節,讀取的
這個地址對應于ARM發出的地址的A[21..1],即實際上是存儲器需要的偶地址(偶地址是針對ARM發出的地址而言的)。
   
    LPC2200,S3C2410A,S3C2440等都是上述這樣的,當然也有不同的。
   IMX27和BF537這兩款CPU都是不管存儲器是多少位的的,都是直接A0-B0,沒有任何考慮錯位的情況,是因為他們的存儲控制器已經內部作了處理
了,三星的如S3C2443S3C2450S3C6410等后續的也都是這樣子了
   再來看看外部總線配置EMC和外部總線功能引腳的關系:
    OE:輸出使能OUT EABLE
    WE:WRITEEABLE 寫入使能
    CE:chipEABLE 片選
   ALE:地址鎖存使能(ADRESS LOCK EABLE)
   BLS:字節選擇信號
   重點看 WE BLS 的關系
   
   在LPC2200系列ARM中,為了適應外部存儲器組的寬度和類型,EMC提供了一組字節選擇信號,要實現這些功能,需要對相應存儲器配置寄存器中的RBLE位進行設定。
   對外部存儲器組進行寫訪問時,RBLE位決定WE信號是否有效;
   對外部存儲器組進行讀訪問時,RBLE位決定BLSn信號是否有效。
   外部存儲器的接口取決于存儲器組的寬度(32位、16位、8位,由BCFG的MW位決定)。而且,存儲器芯片的選擇也需要對BCFG寄存器的RBLE位進行適當的設置。選擇8位或者不按字節區分的的存儲器的時候,RBLE位應該為0,在讀訪問期間EMC將BLS[3:0]拉高。當存儲器組為含有字節選擇選擇輸入的16位或32位存儲器組成的時候,RBLE位應該為1,在讀訪問期間EMC將BLS[3:0]拉低。注意這里沒有對RBLE為0或1的時候,寫訪問期間BLS[3:0]引腳的電平作出交代。
   以16位寬的存儲器組連接16位的存儲器芯片為例(這種情況比較常見,周立功的easyarm2200就是這樣的)。很顯然這里RBLE位應該為1。
BLS[1]、BLS[0]分別接到了存儲器芯片的UB、LB腳。作為16位的存儲器芯片,要取得16位寬度的字,無論是讀訪問還是寫訪問,UB和LB位都必須為低電平0。作為16位的ram,程序中不可避免的存在對它的寫操作。程序能正常運行就說明對它的寫操作是成功的。可以進一步推斷在寫訪問期間,BLS[1]、BLS[0]是低電平的。當存儲器組為含有字節選擇選擇輸入的16位或32位存儲器組成的時候,RBLE位應該為1,在讀訪問期間EMC將BLS[3:0]拉低。在寫訪問周期EMC同樣是將BLS[3:0]拉低。
這種操作也符合使用8位單片機時候的習慣,WR扮演了“寫”的角色。
   
    下面是32位寬的存儲器組連接8位的存儲器芯片,很顯然這里RBLE位應該為0。
網友wag提出這樣的問題,能否用ARM的WE引腳直接連接到存儲器芯片的WE引腳。有這樣的問題可能是源于以前的習慣,也可能是不清楚RBLE位為0時,寫訪問期間BLS[3:0]引腳的狀態。
LPC2210/2220 User Manual上面介紹了RBLE=0的時候的讀寫情況。EMC的WE信號沒有被使用。在寫周期,BLS[3:0]拉低,將數據送到要寫入的地址。對于讀周期,BLS[3:0]拉高。
網友sky421提到“我用的是2214,接一片8位的RAM,寫的時候WE腳不會有變化,BLS0在變化”
我個人理解,如果RBLE=0,BLS引腳就取代了WR的功能,WR腳就不可以使用了。
有心的朋友可以用邏輯分析儀測一下,實際情況如何,驗證一把。
   

總結,當RBLE=1,WR有效,BLS充當字節選擇,其隨WR,OE的變化而變化,讀、寫操作時BLS都是低電平,此時用于有字節選擇的外部設備。
     當RBLE=0,WR無效,此時用于無字節選擇的外部設備,BLS可以充當WR信號,而WR 無效。
不是ARM9S3C2440的,但是有相似之處!

存儲器映射
0-1G(0x0000,0000 -0x3fff,ffff): 片內Flash.
1-2G(0x4000,0000 - 0x7fff,ffff):
片內RAM.
2-3.5G(0x8000,0000 - 0xbfff,ffff - 0xdfff,ffff):
片外存儲器。
3.5G - 3.75G(0xe000,0000 -0xefff,ffff): VPB外設。
3.75G - 4G(0xf000,0000 -0xffff,ffff): AHB外設。
雖然ARM7的尋址空間為4G,但是LPC2200系列只提供A0~A23總共16M的地址。片選信號CS0 - CS3A24A25的譯碼輸出,將片外存儲區0x8000,0000 -0x83ff,ffff劃分為bank0 -bank3,16M*4=64M. 4bank可以被分別配置為8/16/32位總線寬度。復位時,bank0的總線寬度由Boot1:0引腳決定, bank132位,bank216位,bank38位。
字節定位信號(BLS0 - BLS3)協調總線寬度和外存芯片數據線寬度。
Memory字節寬度器件(如62256)或者未按照字節區分的多字節器件組成時,應將RBLE設置為"0"。此時,讀訪問時EMCBLS0~BLS3拉高。
Memory含有字節選擇輸入的16位或32位器件組成時,應將RBLE設置為"1"。此時,讀訪問時EMCBLS0~BLS3拉低。
所以,
Memory62256組成時,由于不需要片內字節選擇輸入,故令RBLE ='0',則BLS0~BLS3只會與nWR同步,可以代替nWR使用。
但是,
MemoryIS61LV25616AL組成時,由于該芯片有"nLB""nUB"控制低/8位的輸入,故令RBLE ='1',則BLS0~BLS3nRDnWR都會同步,此時,不可以使用BLS0~BLS3代替nWR信號。
地址數據總線:D0 - D31, A0 - A23, OE, WE, CS0 - CS3, BLS0 -BLS3
啟動后由P2.7/P2.6控制引導方式,然后由程序設置MEMMAP決定中斷向量的映射。
BCFG0 - BCFG3控制讀寫延時和總線寬度。注意復位后的默認值。
PINSEL2控制引腳功能。
Boot Block
LPC2114/2214
BootBlock被固化在最高的Flash塊中,運行時被映射到0x7FFF,E000 -0x7FFFF,FFFF的區域。而LPC2210沒有片內Flash,但它有8K片內ROM存儲了BootBlock,也被映射到0x7FFF,E000處。

回復

使用道具 舉報

ID:600070 發表于 2019-8-14 15:11 | 顯示全部樓層
@徐峰 @軍 請教個問題:關于743這個芯片是否需要和外掛的SDRAM地址線錯位相連的問題,軟件確實需要處理器32位寬訪問外部SDRAM.這個取決于743內部的存儲控制器是否需要硬件地址線錯位相連來實現32位訪問。這塊再幫忙看看。
回復

使用道具 舉報

ID:600070 發表于 2019-8-14 14:19 | 顯示全部樓層
STM32H7x外掛SDRAM是否需要錯位相連?高人指點
回復

使用道具 舉報

ID:600070 發表于 2019-8-14 14:18 | 顯示全部樓層
STM32H743這個芯片外掛的SDRAM是否需要錯位鏈接?急急急,哪位大俠幫忙看看!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩欧美在线观看 | 99riav3国产精品视频 | 在线免费观看亚洲 | 91在线精品播放 | 亚洲色图在线观看 | 国产96色在线 | 欧美精品被 | 一区在线视频 | 成人免费在线视频 | www.久草| 又爽又黄axxx片免费观看 | 欧美日韩综合精品 | 草久久| 欧美日韩在线一区二区三区 | 日韩欧美视频网站 | 91成人在线视频 | 成人国产精品免费观看 | 欧美黄色片 | 免费看黄视频网站 | 91极品欧美视频 | 久久免费精品视频 | 在线观看免费毛片 | 成人深夜福利网站 | 久久精品欧美一区二区三区不卡 | 国产精品 欧美精品 | 久草视频在线播放 | 在线日韩福利 | 一区二区三区四区在线 | 一区二区国产在线观看 | 欧美黄色性生活视频 | 麻豆91精品91久久久 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 久久综合狠狠综合久久 | 99亚洲| 久久久久国产 | 国产精品日韩欧美一区二区 | 免费观看的av毛片的网站 | 亚洲人成人一区二区在线观看 | www.久久久久久久久久久久 | 亚洲电影免费 | av一区二区三区 |