基于S3C4510B的存儲系統(tǒng)原理與設計
關鍵詞:尋址,內部系統(tǒng)總線,外部地址總線,Bank地址
1.引言
對于嵌入式系統(tǒng)的開發(fā)人員來說,深刻地理解其存儲系統(tǒng)的尋址原理和有效的管理存儲系統(tǒng)對正確高效地設計嵌入式系統(tǒng)的硬件和底層軟件編程具有重要的意義。目前嵌入式系統(tǒng)中最常用的存儲器包括有EEPROM、FLASH、NormalDRAM和Sync.DRAM等。本文所采用的存儲器包括有SDRAM和FLASH。S3C4510B(以下簡稱4510)微處理器是構建在ARM核ARM7TDMI之上的,ARM7TDMI的地址總線為32位的,4510的內部系統(tǒng)總線卻是26bit:SA[25:0],它的外部地址總線卻是22bit:ADDR[21:0],它們之間是如何譯碼的,而僅用14根外部地址總線為什么能夠訪問多達16MB的內存地址空間,本文就試圖回答這些問題。最后還介紹了基于S3C4510B的存儲系統(tǒng)在硬件級別上的設計即接口設計和uClinux中對存儲系統(tǒng)編程的實現(xiàn)。
2.基于S3C4510B的存儲系統(tǒng)原理
2.1.32位地址總線與26位內部系統(tǒng)總線的關系
ARM7TDMI把存儲器看作是從零向上增長的許多字節(jié)的線性集合,0字節(jié)到3字節(jié)為第一個字,4字節(jié)到7字節(jié)為第二個字如此等等,它的地址總線是32位的,而4510的內部系統(tǒng)總線卻是26bit的,也就是說它能夠尋址的最大空間是226byte,即64MB的地址空間0x0000000~0x3FFFFFF。很顯然構建在ARM7TDMI上的RISC微控制器4510的內部地址總線僅用到了ARM7TDMI的32位地址總線的低26位,并且是一一對應的相連。
2.2.4510尋址原理
4510采用了統(tǒng)一編址的方式,將系統(tǒng)的片內、片外存儲器、特殊功能寄存器和外部的I/O設備都映射到了64MB的地址空間,同時為便于管理,又將地址空間分為若干個存儲器組(Bank),包括6個ROMBank、4個DRAMBank、內部SRAM和特殊寄存器組等,每一個存儲器組都對應一個控制寄存器,可以通過配置其中的基指針(BasePointer)和尾指針(EndPointer)來設定每個存儲器組的大小和位置。上圖是DRAM#(#取0~3)組的控制寄存器。[19:10]是DRAM組基指針,該設定值左移16位即為DRAM#組的起始物理地址。因此我們可以推出每個存儲器組的位置是通過4510的26位系統(tǒng)地址總線中高10位SA[25:16]來設定和區(qū)分的。[29:20]是DRAM組尾指針,該設定值左移16位-1即為DRAM#組的結束物理地址。因此我們還可以推出只要設定了任意一組控制寄存器中的基指針和尾指針,也就確定了該組存儲器在4510可尋址空間64MB中的位置和該組存儲器的大小,另一方面還可以得出如下結論:對于任一要尋址的系統(tǒng)地址,可以通過該地址的高10位來判斷它屬于哪一個存儲器組,而該地址的低16位就是它在所判斷存儲器組中的偏移地址。事實上4510正是通過這種機制來尋址的。4510把請求地址的高10位與所有的存儲器組的基指針相減來實現(xiàn)組選擇和計算偏移地址。當選定了組和計算出偏移地址,4510就會產生相應的組選擇信號并且通過物理地址總線用偏移地址去尋址外部存儲器,從而完成了尋址的全過程。
2.3.26位內部系統(tǒng)地址總線與22根外部地址總線的關系
4510通過設定寄存器EXTDBWIHD的值可以支持同外部存儲器的8、16、32位接口,而SA[25:0]到ADDR[21:0]的地址譯碼就是依賴于這個不同接口的數(shù)據寬度。當4510發(fā)出字訪問信號時,存儲系統(tǒng)忽略低2位SA[1:0],即SA[2]與ADDR[0]相連,依次類推,直到SA[23]與ADDR[21]相連,同理當發(fā)出半字訪問信號時,存儲系統(tǒng)忽略低位SA[0],即SA[1]與ADDR[0]相連,依次類推,這樣做的目的就是在原理圖設計時4510的地址總線可以方便地與存儲器的地址總線一一對應連接即可。
2.4.SDRAM的尋址問題
以SDRAM芯片HY57V1620HG為例說明。該芯片的內部存儲組織是4Banks*1M*16Bit,即共有4個Banks,每Bank中有1M個半字(16Bit)。因為該芯片引腳中有行地址鎖存引腳#RAS和列地址鎖存引腳#CAS,所以我們可以把每Bank看作如下圖所示的一張存儲單元陣列表格。其中每一個表格代表16Bit的數(shù)據存儲單元。在實際工作中,首先Bank地址與相應的行地址是同時發(fā)出的,然后再同時發(fā)送列地址尋址命令與具體的操作命令(是讀還是寫),這時我們就先后選中了Bank、行地址和列地址,因此也就唯一確定了該存儲單元陣列表格中的一個存儲單元。至此我們就能明白了僅用它的12根地址線卻能夠訪問8MB地址空間的問題。
3.存儲系統(tǒng)接口電路具體設計
從2.2節(jié)的分析可以知道所謂的片選信號對4510來說就是存儲器組選擇信號。4510把nRCS5:0>用作FLASH的片選信號,把nSDCS[3:0]用作SDRAM的片選信號。從參考文獻3看到HY57V1620的LDQM和UDQM兩引腳是起到DataInput/OutputMask的作用。存儲系統(tǒng)是如何利用這兩個引腳的呢?當4510執(zhí)行內存中半字數(shù)據讀取指令LDRH、字節(jié)數(shù)據讀取指令LDRB等指令時,這兩個引腳就發(fā)揮作用了。例如當執(zhí)行LDRB時,4510就會發(fā)出控制信號使得SDRAM1的UDQM、SDRAM2的LDQM和UDQM有效,就是它們把32位數(shù)據中的高24位屏蔽掉,從而進行字節(jié)讀取。LDQM是Low(byte)DQMask的縮寫。UDQM則是Upper(byte)DQMask的縮寫。DQ指SDRAM的輸入/輸出數(shù)據。
上圖是存儲系統(tǒng)電路原理圖。兩片HY57V1620的并聯(lián)設計是為了充分發(fā)揮32位MPU的性能
4.存儲系統(tǒng)在嵌入式操作系統(tǒng)uClinux中的實現(xiàn)與配置
所謂的存儲系統(tǒng)在uClinux中的實現(xiàn)與配置實質上就是對4510的各個存儲器組的控制寄存器進行設置。此處運用的是uClinux-Samsung-20020318.tar.gz版本。所謂配置存儲系統(tǒng)所有的4510相關特殊寄存器的宏定義在Linux-2.4.x/Include/Asm-armnommu/Arch-samsung/Hardware.h中。部分代碼如下:
…..
#defineDSR0(20)/*ROMBank0數(shù)據寬度為半字*/
…..
#defineDSD0(312)/*RAMBank0數(shù)據寬度為字*/
…..
#defineROM_BASE0_R((0x00000000>>16)10)/*ROMBank0的基指針是0x000*/
…..
#defineSDRAM_BASE0_R((0x01000000>>16)10)/*RAMBank0基指針是0x0100*/
真正進行存儲系統(tǒng)映射的代碼在Linux-
2.4.x/Arch/Armnommu/Boot/Compressed/head.S部分代碼如下:
…….
#ifdefCONFIG_ARCH_SAMSUNG
ldrr0,=SYSCFG/*設定系統(tǒng)寄存器的值*/
ldrr1,=rSYSCFG
strr1,[r0]
adrr0,SDRAM_SYSINIT_RESET/*設定初始化存儲映射*/
ldmiar0,{r1-r12}
ldrr0,=SYS_INIT_BASE/*該宏定義位于上面提到的Hardware.h中,是外部存儲寄存器組中第一個寄存器的地址*/
stmiar0,{r1-r12}
……
5.結束語
本文闡述了本人在嵌入式系統(tǒng)設計過程中遇到的關于存儲系統(tǒng)方面問題,希望因同樣問題感到迷惑的開發(fā)人員能從本文中獲得啟發(fā)和幫助,從而能夠從更深的層次上理解和設計整個系統(tǒng)的硬件和軟件。
參考文獻:
[1]ARM7TDMIdatasheet.pdf
[2]um_s3c4510b_rev1.pdf
[3]HY57V641620HG(L)T.pdf
[4]中關村在線,趙效民。理性VS激情,DDR內存的終極優(yōu)化.2004-03-30
[5]李駒光、聶雪媛、江澤明、王兆衛(wèi)。ARM應用系統(tǒng)開發(fā)詳解--基于S3C4510B的系統(tǒng)設計[M].清華大學出版社.2003-12-01
評論