摘要:以MCS-96系列單片機為例,介紹了一種采用可編程邏輯器件(PLD)的存儲器模塊的設計方案,該模塊包含了Flash閃存和RAM。提出了一種方便的存儲器擴展方法,該方法有效地解決了嵌入式系統(tǒng)尤其是數(shù)據(jù)采集、存儲等系統(tǒng)中存在的存儲空間不足問題。該方案具有通用性強、讀寫控制簡單等特點,具有很強的實用性。
在嵌入式系統(tǒng)中,由于設計成本和體積等因素的限制,往往會使CPU(包括DSP、單片機等)存在地址空間不足的問題。很多文獻(如參考文獻[1]都有相關(guān)的存儲器擴展方法的介紹, 目前已有的方法通常是借助于CPU的I/0接口產(chǎn)生片選或者高位地址信號,
利用這些信號將內(nèi)存分頁,但當頁間跳轉(zhuǎn)時將給程序設計帶來不便。對于沒有內(nèi)部存儲器并且采用統(tǒng)一編址的CPU,如80C196KC20[1],這種頁間切換將造成CPU無法繼續(xù)執(zhí)行當前程序而產(chǎn)生錯誤(見圖1)。在CPU執(zhí)行頁面切換操作后,本應該繼續(xù)執(zhí)行頁面1的指令,可是卻錯誤地執(zhí)行了頁面2中的相應指令,這種結(jié)果不是所需要的。因此尋找一個有效的存儲器擴展方法是實際應用中亟待解決的問題。
1 存儲器擴展方法解決方案
在對MCS-96系列單片機的使用中發(fā)現(xiàn),64K字節(jié)的存儲空間用來存放程序能滿足絕大多數(shù)的使用需求(通常用戶的應用程序不到10K字節(jié)),但如果使用其進行數(shù)據(jù)存儲控制,則會帶來存儲空間上的嚴重不足。通過對實際應用的統(tǒng)計分析發(fā)現(xiàn),在很多情況下,數(shù)據(jù)的
存取僅限于順序的連續(xù)操作。利用這個特點,可以對數(shù)據(jù)存儲空間進行簡化設計,具體的說就是通過對同一個地址連續(xù)讀或者連續(xù)寫來進行批量數(shù)據(jù)的存取,從而節(jié)省地址空間。在16位CPU中,可以將任何一段64K字(2的16次方)的存儲空間映射到兩個地址(一個作為讀取的位置,一個作為寫入的位置),采用這樣的映射方法可以將內(nèi)存最大擴展到2G字(2的31次方),但這樣的設計同時也帶來了諸多邏輯控制上的困難。隨著可編程邏輯器件(PLD)包括FPGA、EPLDE4[4]、CPLD等的迅速發(fā)展,數(shù)字邏輯電路的設計得到了大大簡化,從而使這種存儲器擴展想法可以得到實現(xiàn)。
2 存儲器擴展方法的具體實現(xiàn)
下面以筆者設計的系統(tǒng)為例來詳細說明這種存儲器擴展方法的實現(xiàn)。該系統(tǒng)是一個多功能數(shù)據(jù)采集設備,能夠以最高40k次/s的速率進行12位A/D轉(zhuǎn)換,并且可以將采集到的數(shù)據(jù)保存至Flash ROM中,以防止掉電丟失。技術(shù)參數(shù)要求如下:①最多可以保存32K字節(jié)的采樣數(shù)據(jù);②可以同時存儲4段系統(tǒng)工作配置程序,每段4K字節(jié),共計16K字節(jié);③由于Flash ROM自身的特點,在寫人數(shù)據(jù)后的編程階段不能進行讀寫操作,因此為了保證系統(tǒng)采樣和單片機運行的正常進行,需要額外增加32K字節(jié)的RAM作為數(shù)據(jù)緩存;④系統(tǒng)程序、中斷服務程序等共占用56K字節(jié)(Flash ROM和RAM各保留28K字節(jié)),總計需要存儲空間136K字節(jié)。這個需求已經(jīng)超過96系列單片機的64K字節(jié)尋址范圍,為此設計了一個存儲器模塊,其結(jié)構(gòu)如圖2所示。
圖2
Flash ROM采用ATMEL公司的AT29C1024,容量為128K字節(jié),數(shù)據(jù)線寬度為16位;RAM存儲器由兩片CY7C199組成,數(shù)據(jù)線寬度為16位,容量為64K字節(jié)。80C196單片機的ALE為地址鎖存信號,/WE為寫有效信號,/RD為讀有效信號,READY為準備就緒信號。MCS-96系列單片機支持8位和16位兩種工作模式,為了提高系統(tǒng)的性能,選擇16位工作模式。96系列單片機地址是按照字節(jié)的方式來計算的,因此在16位工作模式下的A0=0沒有實際意義。在通常的讀寫情況下,取經(jīng)過鎖存后的AD1~AD15地址作為A1~A15而A16=0。
下面以讀Flash ROM為例介紹地址擴展方法。對于可以直接尋址的地址,EPLD作為鎖存器,將AD0~AD15分時的地址數(shù)據(jù)總線分開,生成獨立的地址和數(shù)據(jù)總線。在這里定義了兩個特殊的地址:Flash ROM數(shù)據(jù)塊的讀地址Address_F_R和讀位置指針地址Address_F_RP。首先向Ad-dress_F_RP寫入一個16位的二進制數(shù),該數(shù)代表了將要讀取的數(shù)據(jù)塊的首地址,16位表示范圍是0~65535,因此可以指定的首地址范圍是64K字即128K字節(jié);然后連續(xù)地從Address_F_R進行讀取操作,每讀一次,位置指針會自動加1而不需要重新設置。如果需要讀取新的位置,只需要向Address_F_RP地址寫入新的位置數(shù)據(jù)即可。該功能在EPLD器件內(nèi)部的實現(xiàn)方法見圖3。計數(shù)器可同步設置初值、同步計數(shù),在AHDL語言中聲明為1pm_counter[5]。其中,CNT_EN為計數(shù)使能控制,當CNT_EN為高電平時,每當CLOCK上升沿到來時計數(shù)器便會自動加一,從而實現(xiàn)了地址自動增加的功能;CLOCK為同步時鐘輸入端,上升沿有效;SLOAD為計數(shù)器同步設置初值信號,當該信號為高電平時,在CLOCK上升沿的作用下,計數(shù)器的輸出Q[15..0]=D[15..0],從而實現(xiàn)初始化讀取位置的功能。計數(shù)器用AHDL語言描述如下:
counter : lPm_counter with(1pm_width=16);
counter.clock=/rd&(/we#(a[15..0]!=Address_F_RP);
counter.sload=(a[15..0]==Address_F_RP);
counter.cnt_en=(a[15..0]=Address_F_R);
counter.data[15..0]=D[15..0];
clock信號要保證在寫Address_F_RP地址修改讀取位置時,或讀Address_F_R地址取數(shù)據(jù)時都能產(chǎn)生上升沿信號??偩€a0-a15和D0~D15分別是由AD0-AD15分離出來的地址和數(shù)據(jù)總線。多路選擇器則根據(jù)地址譯碼產(chǎn)生的S0-S3選擇輸出地址,輸出地址直接連接到RAM和Flash ROM的地址線上。如果訪問除Address_F_RP和Address_F_RP以外的地址,則地址輸出總線A115..1)=a[15..1]、A16=0,即單片機直接訪問存儲器;如果讀取Address_F_R,則片選/CS2有效并且A[16..1)Q(15..0]作為輸出地址。這樣就可以自動地在不同存儲區(qū)域進行切換,從而大大地增加了內(nèi)存的擴充能力,并且簡化了程序設計。運用同樣的方法還可以定義FlashROM中的數(shù)據(jù)塊寫入地址Address_F_W和寫位置指針地址Address_F_WP,RAM中也有類似的方法定義Address_R_(RAM數(shù)據(jù)塊讀地址)、Address_R_RP(RAM數(shù)據(jù)塊的讀位置指針地址)、Address_R_W(RAM數(shù)據(jù)塊寫地址)和Address_R_WP(RAM數(shù)據(jù)塊的寫位置指針地址)。這樣可以方便地對內(nèi)存的擴展部分進行讀寫。下面以MCS-96的匯編語言為例來說明程序中是如何操作的。比如需要從IOPORT0口連續(xù)采集數(shù)據(jù),然后存放到RAM中指定的數(shù)據(jù)塊等待處理,則可以寫出如下程序:
LD 40H,地址值;地址值為即將寫入的目的地址,16位按字編址。
ST 40H,Address_R_WP;設置寫位置指針
REPEAT:
LDB 40H,IOPORT0
LDB 41H,IOPORTO;40H和41H為內(nèi)部寄存器,因為按字存儲所以連續(xù)讀兩次
ST 40H,Address_R_W ;寫入指定位置條件判斷退出循環(huán)
JMP REPEAT
從上面這個簡單的例子可以看出,這種存儲器組織方法大大簡化了編程的的復雜性,并且可以采用對位置指針賦初值的方法來實現(xiàn)對擴展存儲器中任何一個位置的讀寫操作。
3 地址分配
有了上面的存儲器擴展方法,再結(jié)合系統(tǒng)的技術(shù)參數(shù)和單片機的特點,就可以做出一套合理的內(nèi)存地址分配方案。下面給出單片機的地址劃分情況:
0000H~01FFH 系統(tǒng)寄存器區(qū),保留0200H~1EFFH用戶區(qū),直接映射到Flash ROM中的
0200H~1EFFH 可以用來存放數(shù)據(jù)、程序等,該區(qū)域可以由單片機直接進行尋址。
1FOOH~1FFFH 用戶區(qū),實際使用中把Address—1lR、Address_F_WP等地址以及一些特殊設備如A/D轉(zhuǎn)換器、LCD顯示屏等的訪問地址設置在這個區(qū)域。
2000H~207FH 該區(qū)域是中斷向量區(qū)、芯片配置字節(jié)區(qū)、保留字區(qū)等,直接映射到Flash ROM中的2000H-207FH。
2080H~8FFFH 用戶區(qū),單片機啟動也是從 2080H 處開始執(zhí)行程序的,因此把這個地址范圍直接映射到 Flash ROM 的2080H~8FFFH,該區(qū)域設置系統(tǒng)的引導、初始化等程序。
9000H~FFFFH 用戶區(qū),將這一段映射到 RAM 的9000H~FFFFH,作為系統(tǒng)程序的運行區(qū)域。
上面的分配方案可以通過對地址總線進行譯碼生成相應的片選信號/CSl和/CS2來實現(xiàn)。這樣分配后,F(xiàn)lash ROM 和 RAM 的使用情況如圖4所示。
圖4中白色區(qū)域是單片機通過總線直接尋址的區(qū)域,可以由單片機直接進行訪問?;疑珔^(qū)域為內(nèi)存的擴展區(qū)域,不能被單片機直接訪問,但可以通過前面介紹的方法由EPLD生成地址進行讀寫操作。下面簡要介紹一下各個區(qū)域在實際中的用途:Flash ROM中的0000H~1FFH和1F00H~1FFFH因為容量很小,沒有被利用。系統(tǒng)啟動后從Flash ROM的2080H處開始執(zhí)行程序,將2000H~8FFFH的內(nèi)容復制到RAM中的9000H~FFFFH,然后跳轉(zhuǎn)到RAM中執(zhí)行系統(tǒng)程序。由于Hash ROM的速度慢,需要在讀寫過程中插入一定量的等待周期,因此將程序復制到RAM中執(zhí)行可以提高系統(tǒng)的性能;同時系統(tǒng)在對Flash ROM進行寫入操作后,編程階段的10ms內(nèi)不能對其進行讀取,因此RAM在這個時候也提供了程序運行的位置。這樣分配后,程序的長度被限制在28K字節(jié),實際中這個數(shù)量完全可以滿足系統(tǒng)的需求。Hash ROM中的9000~FFFFH共28K字節(jié),用來保存4段系統(tǒng)運行配置程序,每段長度可達7K字節(jié);10000H-
1FFFFH共64K字節(jié),用來作為采集數(shù)據(jù)的保存區(qū)域。RAM中的0000H~8FFFH共36K字節(jié),用來作為數(shù)據(jù)的緩存區(qū)域。從上面的分析可以看出,最終設計的各項指標都已經(jīng)超過實際的需求,能很好地解決實際應用問題。
4 合理利用日EADY信號
最后介紹一下單片機就緒信號READY在這個系統(tǒng)中的關(guān)鍵作用。從前面的設計中可以看出系統(tǒng)存在著高速RAM和慢速Hash ROM存儲器,開始時,Hash ROM選用了AT29C1024-70JCt31,它是該型號中速度最快的,有效數(shù)據(jù)建立時間僅為70ns。單片機不插入等待周期的讀寫時序,如圖5所示。
從ALE下降沿地址有效到/RD上升沿的時間是80ns,Hash的響應時間為70ns,再加上EPLD的延時就造成了單片機從Hash ROM讀取數(shù)據(jù)的不穩(wěn)定,表現(xiàn)在無法對Flash ROM進行在線寫入、經(jīng)常發(fā)生錯誤的執(zhí)行結(jié)果、死機等。為此必須加入等待周期,延長讀、寫時間才能滿足Hash ROM的要求。在這里只需插入一個等待周期(100ns)便可以滿足要求,因此設置芯片配置字節(jié)CCR.5=0,CCR.4;0[1]。這樣,當READY信號為低電平時便自動插入且僅插入一個等待周期。一個簡單的做法就是把Flash ROM的片選信號/CS2連接到READY,這樣,當選中Flash ROM芯片時READY信號就跟隨/CS2同時變?yōu)榈碗娖?。按照這樣的設想可在EPLD內(nèi)部重新設置READY信號,描述如下:
ready=!(((a[15..0]>=H"0200")&(a [15..0]<:=H"1EFF"))
#((a[15..0]>=H"2000")&(a[15..0]<=H"8FFF"))#(a[15..0]= =Address_F_R)
#(a[15..0]= =Address_F_W)&! ALE)
可是實際故障依舊,通過測試得到的時序信號如圖6所示。
READY信號的產(chǎn)生落后ALE下降沿5ns,造成READY信號產(chǎn)生無效,解決這個問題的唯一方法是提前生成READY信號。實際中有效地址是在ALE下降沿鎖存后產(chǎn)生的,這也是READY信號產(chǎn)生表達式中最后一項的來源,但是考慮到地址的產(chǎn)生應該發(fā)生在ALE下降沿之前,以保證鎖存到正確的地址。因此大膽設想讓READY信號的產(chǎn)生不再受ALE的控制,只要總線上產(chǎn)生地址就可以作出判斷,從而提前生成READY信號。但這樣的做法破壞了同步時序,而且異步生成READY信號容易產(chǎn)生冒險現(xiàn)象。通過分析,可以發(fā)現(xiàn)異步生成
READY信號并不會帶來任何不穩(wěn)定因素,因此修改READY信號如下:
ready=!(((a[15..0]>=H"0200")&(a[15..0]<=H"1EFF"))
#((a[15..0]>=H"2000")&(a[15..0]<=H"8FFF"))
#(a[15..0)= =Address_F_R)
#(a[15..0]= =Address_F_W)
即去掉了對地址有效信號ALE的判斷。修改后系統(tǒng)工作穩(wěn)定、正常。修改后對Hash ROM的讀寫時序如圖7所示,而對RAM讀寫的時序依舊是圖6,目的達到。考慮到插入一個等待周期后大大增加了讀寫時間,因此將AT29C1024-70JC換成廉價的AT29C1024-12JC(有效數(shù)據(jù)建立時間為120ns)[3],系統(tǒng)依然能夠穩(wěn)定工作。通過使用,證明這種存儲器設計方案是可行的。
前面詳細地介紹了一種實用的存儲器擴展方法,該方法是基于PLD器件實現(xiàn)的,有效地解決了嵌入式系統(tǒng),尤其是數(shù)據(jù)采集、存儲系統(tǒng)中內(nèi)存擴展的問題。該方法能夠簡化程序設計,并且不需要隨CPU型號的變化而修改設計,具有很好的可移植性。同時還給出了一種較為復雜的單片機外部存儲器的組織方案,包括了Flash ROM和RAM構(gòu)成的存儲系統(tǒng)。最后提出了將READY信號由同步產(chǎn)生改為異步產(chǎn)生的方式,解決了CPU在高速RAM與低速Flash ROM之間切換產(chǎn)生的問題,最終設計成了一套較為完善的CPU外部存儲器系統(tǒng)。
- 模塊設計(9883)
典型的嵌入式系統(tǒng)設計
3060
嵌入式系統(tǒng)
嵌入式系統(tǒng)模塊化設計有什么方法?
嵌入式系統(tǒng)EMC的產(chǎn)生原理是什么?
嵌入式系統(tǒng)交叉調(diào)試原理和方法
嵌入式系統(tǒng)和嵌入式電腦有什么區(qū)別?
嵌入式系統(tǒng)如何降低功耗
嵌入式系統(tǒng)是什么?嵌入式計算機系統(tǒng)有哪些特點?
嵌入式系統(tǒng)是由哪些部分組成的?實時嵌入式系統(tǒng)特征有哪些
嵌入式系統(tǒng)有什么安全技巧?
嵌入式系統(tǒng)特點詳解 嵌入式系統(tǒng)的六大特點
嵌入式系統(tǒng)特點詳解 嵌入式系統(tǒng)的六大特點
嵌入式系統(tǒng)特點詳解 嵌入式系統(tǒng)的六大特點
嵌入式系統(tǒng)電子的實時性是什么?
嵌入式系統(tǒng)的4個特點
嵌入式系統(tǒng)的發(fā)展歷史
嵌入式系統(tǒng)的發(fā)展特點是什么?
嵌入式系統(tǒng)的實時性問題有哪些?
嵌入式系統(tǒng)的應用是什么
嵌入式系統(tǒng)的概念
嵌入式系統(tǒng)的硬件平臺組成
嵌入式系統(tǒng)組件的設計原則是什么
嵌入式系統(tǒng)難學嗎
嵌入式FIFO怎么配置和使用?
嵌入式GUI系統(tǒng)的特點是什么?
嵌入式Linux系統(tǒng)的設計與應用
嵌入式Wi-Fi模塊選型要素有哪些?
嵌入式基礎教程之嵌入式系統(tǒng)組成
嵌入式實時系統(tǒng)設計模式是什么?
嵌入式實時操作系統(tǒng)如何簡化應用軟件的設計
嵌入式操作系統(tǒng)怎么選擇?
嵌入式最小系統(tǒng)的啟動架構(gòu)是什么?
嵌入式邊界掃描系統(tǒng)是什么?怎樣去實現(xiàn)它?
ARM嵌入式最小系統(tǒng)的啟動架構(gòu)是什么?
Linux嵌入式系統(tǒng)與硬件平臺的關(guān)系是什么
Linux作為嵌入式操作系統(tǒng)的優(yōu)勢是什么?如何建立嵌入式Linux?
什么是嵌入式系統(tǒng)
什么是嵌入式系統(tǒng) 嵌入式系統(tǒng)定義
什么是嵌入式系統(tǒng)低功耗設計?
什么是嵌入式系統(tǒng)?嵌入式系統(tǒng)的特點
什么是嵌入式系統(tǒng)?深嵌入式系統(tǒng)又是什么
什么是嵌入式操作系統(tǒng)?嵌入式操作系統(tǒng)有何功能
什么是嵌入式組態(tài)軟件系統(tǒng)?
基于嵌入式系統(tǒng)硬件平臺的軟件PLC實現(xiàn)設計
基于嵌入式WEB的網(wǎng)絡視頻監(jiān)控系統(tǒng)該如何去設計?
基于FPGA的嵌入式系統(tǒng)應用
基于SPB怎么實現(xiàn)嵌入式音頻處理系統(tǒng)設計?
如何系統(tǒng)的學習嵌入式?
如何提升嵌入式系統(tǒng)的VxWorks安全性?
如何構(gòu)建嵌入式Linux系統(tǒng)?
如何設計嵌入式系統(tǒng)中電源管理電路?
如何設計嵌入式系統(tǒng)掉電保護方案?
如何設計嵌入式FIFO數(shù)據(jù)傳輸系統(tǒng)?
怎樣去設計嵌入式演示系統(tǒng)?
怎樣去設計汽車嵌入式SoC系統(tǒng)?
有關(guān)嵌入式系統(tǒng)的基本知識匯總
汽車嵌入式系統(tǒng)的發(fā)展如何?
請問如何使用UML來設計嵌入式系統(tǒng)?
請問怎樣去設計嵌入式系統(tǒng)啟動程序?
通用嵌入式操作系統(tǒng)有什么區(qū)別?
采用PLD和嵌入式存儲器實現(xiàn)W-CDMA調(diào)制解調(diào)器的設計
基于LPC2214的嵌入式系統(tǒng)USB接口模塊設計
61基于嵌入式系統(tǒng)的藍牙模塊設計
126ARM嵌入式常用模塊與綜合系統(tǒng)設計實例精講_張綺文
0嵌入式系統(tǒng)介紹
3018
嵌入式系統(tǒng)原理、設計與應用
3嵌入式操作系統(tǒng)是什么_嵌入式操作系統(tǒng)有哪些
21308基于SoPC的嵌入式硬件平臺系統(tǒng)設計詳解
2452
嵌入式系統(tǒng)教程之嵌入式系統(tǒng)的IO模塊詳細資料說明
8嵌入式系統(tǒng)與嵌入式PLC
24嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試
10嵌入式系統(tǒng)定義
12嵌入式系統(tǒng)概述
5嵌入式系統(tǒng)導論
2什么是嵌入式系統(tǒng)
9嵌入式系統(tǒng)
1什么是嵌入式系統(tǒng)
3嵌入式linux_嵌入式系統(tǒng)基礎知識(一): 系統(tǒng)結(jié)構(gòu)和嵌入式Linux
16嵌入式系統(tǒng)log模塊設計
13嵌入式系統(tǒng)設計的問答
6嵌入式系統(tǒng)
13嵌入式系統(tǒng)設計(一)
36什么是嵌入式系統(tǒng)?嵌入式系統(tǒng)的具體應用
3996PLD在嵌入式系統(tǒng)中的應用實例
1451
電子發(fā)燒友App


評論