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

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

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

從2.2節的分析可以知道所謂的片選信號對4510來(lái)說(shuō)就是存儲器組選擇信號。4510把nRCS5:0>用作FLASH的片選信號,把nSDCS[3:0]用作SDRAM的片選信號。從參考文獻3看到HY57V1620的LDQM和UDQM兩引腳是起到DataInput/OutputMask的作用。存儲系統是如何利用這兩個(gè)引腳的呢?當4510執行內存中半字數據讀取指令LDRH、字節數據讀取指令LDRB等指令時(shí),這兩個(gè)引腳就發(fā)揮作用了。例如當執行LDRB時(shí),4510就會(huì )發(fā)出控制信號使得SDRAM1的UDQM、SDRAM2的LDQM和UDQM有效,就是它們把32位數據中的高24位屏蔽掉,從而進(jìn)行字節讀取。LDQM是Low(byte)DQMask的縮寫(xiě)。UDQM則是Upper(byte)DQMask的縮寫(xiě)。DQ指SDRAM的輸入/輸出數據。
上圖是存儲系統電路原理圖。兩片HY57V1620的并聯(lián)設計是為了充分發(fā)揮32位MPU的性能
4.存儲系統在嵌入式操作系統uClinux中的實(shí)現與配置
所謂的存儲系統在uClinux中的實(shí)現與配置實(shí)質(zhì)上就是對4510的各個(gè)存儲器組的控制寄存器進(jìn)行設置。此處運用的是uClinux-Samsung-20020318.tar.gz版本。所謂配置存儲系統所有的4510相關(guān)特殊寄存器的宏定義在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*/
真正進(jìn)行存儲系統映射的代碼在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中,是外部存儲寄存器組中第一個(gè)寄存器的地址*/
stmiar0,{r1-r12}
……
5.結束語(yǔ)
本文闡述了本人在嵌入式系統設計過(guò)程中遇到的關(guān)于存儲系統方面問(wèn)題,希望因同樣問(wèn)題感到迷惑的開(kāi)發(fā)人員能從本文中獲得啟發(fā)和幫助,從而能夠從更深的層次上理解和設計整個(gè)系統的硬件和軟件。
參考文獻:
[1]ARM7TDMIdatasheet.pdf
[2]um_s3c4510b_rev1.pdf
[3]HY57V641620HG(L)T.pdf
[4]中關(guān)村在線(xiàn),趙效民。理性VS激情,DDR內存的終極優(yōu)化.2004-03-30
[5]李駒光、聶雪媛、江澤明、王兆衛。ARM應用系統開(kāi)發(fā)詳解--基于S3C4510B的系統設計[M].清華大學(xué)出版社.2003-12-01
評論