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