基于S3C4510B的存儲系統原理與設計
關鍵詞:尋址,內部系統總線,外部地址總線,Bank地址
1.引言
對于嵌入式系統的開發人員來說,深刻地理解其存儲系統的尋址原理和有效的管理存儲系統對正確高效地設計嵌入式系統的硬件和底層軟件編程具有重要的意義。目前嵌入式系統中最常用的存儲器包括有EEPROM、FLASH、NormalDRAM和Sync.DRAM等。本文所采用的存儲器包括有SDRAM和FLASH。S3C4510B(以下簡稱4510)微處理器是構建在ARM核ARM7TDMI之上的,ARM7TDMI的地址總線為32位的,4510的內部系統總線卻是26bit:SA[25:0],它的外部地址總線卻是22bit:ADDR[21:0],它們之間是如何譯碼的,而僅用14根外部地址總線為什么能夠訪問多達16MB的內存地址空間,本文就試圖回答這些問題。最后還介紹了基于S3C4510B的存儲系統在硬件級別上的設計即接口設計和uClinux中對存儲系統編程的實現。
2.基于S3C4510B的存儲系統原理
2.1.32位地址總線與26位內部系統總線的關系
ARM7TDMI把存儲器看作是從零向上增長的許多字節的線性集合,0字節到3字節為第一個字,4字節到7字節為第二個字如此等等,它的地址總線是32位的,而4510的內部系統總線卻是26bit的,也就是說它能夠尋址的最大空間是226byte,即64MB的地址空間0x0000000~0x3FFFFFF。很顯然構建在ARM7TDMI上的RISC微控制器4510的內部地址總線僅用到了ARM7TDMI的32位地址總線的低26位,并且是一一對應的相連。
2.2.4510尋址原理

4510采用了統一編址的方式,將系統的片內、片外存儲器、特殊功能寄存器和外部的I/O設備都映射到了64MB的地址空間,同時為便于管理,又將地址空間分為若干個存儲器組(Bank),包括6個ROMBank、4個DRAMBank、內部SRAM和特殊寄存器組等,每一個存儲器組都對應一個控制寄存器,可以通過配置其中的基指針(BasePointer)和尾指針(EndPointer)來設定每個存儲器組的大小和位置。上圖是DRAM#(#取0~3)組的控制寄存器。[19:10]是DRAM組基指針,該設定值左移16位即為DRAM#組的起始物理地址。因此我們可以推出每個存儲器組的位置是通過4510的26位系統地址總線中高10位SA[25:16]來設定和區分的。[29:20]是DRAM組尾指針,該設定值左移16位-1即為DRAM#組的結束物理地址。因此我們還可以推出只要設定了任意一組控制寄存器中的基指針和尾指針,也就確定了該組存儲器在4510可尋址空間64MB中的位置和該組存儲器的大小,另一方面還可以得出如下結論:對于任一要尋址的系統地址,可以通過該地址的高10位來判斷它屬于哪一個存儲器組,而該地址的低16位就是它在所判斷存儲器組中的偏移地址。事實上4510正是通過這種機制來尋址的。4510把請求地址的高10位與所有的存儲器組的基指針相減來實現組選擇和計算偏移地址。當選定了組和計算出偏移地址,4510就會產生相應的組選擇信號并且通過物理地址總線用偏移地址去尋址外部存儲器,從而完成了尋址的全過程。
2.3.26位內部系統地址總線與22根外部地址總線的關系
4510通過設定寄存器EXTDBWIHD的值可以支持同外部存儲器的8、16、32位接口,而SA[25:0]到ADDR[21:0]的地址譯碼就是依賴于這個不同接口的數據寬度。當4510發出字訪問信號時,存儲系統忽略低2位SA[1:0],即SA[2]與ADDR[0]相連,依次類推,直到SA[23]與ADDR[21]相連,同理當發出半字訪問信號時,存儲系統忽略低位SA[0],即SA[1]與ADDR[0]相連,依次類推,這樣做的目的就是在原理圖設計時4510的地址總線可以方便地與存儲器的地址總線一一對應連接即可。
2.4.SDRAM的尋址問題

以SDRAM芯片HY57V1620HG為例說明。該芯片的內部存儲組織是4Banks*1M*16Bit,即共有4個Banks,每Bank中有1M個半字(16Bit)。因為該芯片引腳中有行地址鎖存引腳#RAS和列地址鎖存引腳#CAS,所以我們可以把每Bank看作如下圖所示的一張存儲單元陣列表格。其中每一個表格代表16Bit的數據存儲單元。在實際工作中,首先Bank地址與相應的行地址是同時發出的,然后再同時發送列地址尋址命令與具體的操作命令(是讀還是寫),這時我們就先后選中了Bank、行地址和列地址,因此也就唯一確定了該存儲單元陣列表格中的一個存儲單元。至此我們就能明白了僅用它的12根地址線卻能夠訪問8MB地址空間的問題。
3.存儲系統接口電路具體設計

從2.2節的分析可以知道所謂的片選信號對4510來說就是存儲器組選擇信號。4510把nRCS5:0>用作FLASH的片選信號,把nSDCS[3:0]用作SDRAM的片選信號。從參考文獻3看到HY57V1620的LDQM和UDQM兩引腳是起到DataInput/OutputMask的作用。存儲系統是如何利用這兩個引腳的呢?當4510執行內存中半字數據讀取指令LDRH、字節數據讀取指令LDRB等指令時,這兩個引腳就發揮作用了。例如當執行LDRB時,4510就會發出控制信號使得SDRAM1的UDQM、SDRAM2的LDQM和UDQM有效,就是它們把32位數據中的高24位屏蔽掉,從而進行字節讀取。LDQM是Low(byte)DQMask的縮寫。UDQM則是Upper(byte)DQMask的縮寫。DQ指SDRAM的輸入/輸出數據。
上圖是存儲系統電路原理圖。兩片HY57V1620的并聯設計是為了充分發揮32位MPU的性能
4.存儲系統在嵌入式操作系統uClinux中的實現與配置
所謂的存儲系統在uClinux中的實現與配置實質上就是對4510的各個存儲器組的控制寄存器進行設置。此處運用的是uClinux-Samsung-20020318.tar.gz版本。所謂配置存儲系統所有的4510相關特殊寄存器的宏定義在Linux-2.4.x/Include/Asm-armnommu/Arch-samsung/Hardware.h中。部分代碼如下:
…..
#defineDSR0(20)/*ROMBank0數據寬度為半字*/
…..
#defineDSD0(312)/*RAMBank0數據寬度為字*/
…..
#defineROM_BASE0_R((0x00000000>>16)10)/*ROMBank0的基指針是0x000*/
…..
#defineSDRAM_BASE0_R((0x01000000>>16)10)/*RAMBank0基指針是0x0100*/
真正進行存儲系統映射的代碼在Linux-
2.4.x/Arch/Armnommu/Boot/Compressed/head.S部分代碼如下:
…….
#ifdefCONFIG_ARCH_SAMSUNG
ldrr0,=SYSCFG/*設定系統寄存器的值*/
ldrr1,=rSYSCFG
strr1,[r0]
adrr0,SDRAM_SYSINIT_RESET/*設定初始化存儲映射*/
ldmiar0,{r1-r12}
ldrr0,=SYS_INIT_BASE/*該宏定義位于上面提到的Hardware.h中,是外部存儲寄存器組中第一個寄存器的地址*/
stmiar0,{r1-r12}
……
5.結束語
本文闡述了本人在嵌入式系統設計過程中遇到的關于存儲系統方面問題,希望因同樣問題感到迷惑的開發人員能從本文中獲得啟發和幫助,從而能夠從更深的層次上理解和設計整個系統的硬件和軟件。
參考文獻:
[1]ARM7TDMIdatasheet.pdf
[2]um_s3c4510b_rev1.pdf
[3]HY57V641620HG(L)T.pdf
[4]中關村在線,趙效民。理性VS激情,DDR內存的終極優化.2004-03-30
[5]李駒光、聶雪媛、江澤明、王兆衛。ARM應用系統開發詳解--基于S3C4510B的系統設計[M].清華大學出版社.2003-12-01
評論