《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動態(tài) > 基于PLD的嵌入式系統(tǒng)外存模塊設計

基于PLD的嵌入式系統(tǒng)外存模塊設計

2008-08-28
作者:高明星 于大洋 楊 健 彭

??? 摘 要: 以MCS-96 系列單片機" title="系列單片機">系列單片機為例,,介紹了一種采用可編程邏輯器件(PLD)的存儲器模塊的設計方案,該模塊包含了Flash閃存和RAM,。提出了一種方便的存儲器擴展方法,,該方法有效地解決了嵌入式系統(tǒng)尤其是數(shù)據(jù)采集,、存儲等系統(tǒng)中存在的存儲空間不足問題。該方案具有通用性強,、讀寫控制簡單等特點,,具有很強的實用性。
??? 關鍵詞: PLD? 存儲器? RAM? 單片機 閃存

?

??? 在嵌入式系統(tǒng)中,由于設計成本和體積等因素的限制,,往往會使CPU(包括DSP、單片機等)存在地址空間不足的問題,。很多文獻(如參考文獻[1])都有相關的存儲器擴展方法的介紹,,目前已有的方法通常是借助于CPU的I/O接口產(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中的相應指令,,這種結果不是所需要的。因此尋找一個有效的存儲器擴展方法是實際應用中亟待解決的問題,。

?


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,、EPLD[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ù)要求如下:①最多可以保存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é)尋址范圍,,為此設計了一個存儲器模塊,其結構如圖2所示,。

?


??? Flash ROM采用ATMEL公司的AT29C1024,,容量為128K字節(jié),數(shù)據(jù)線寬度為16位,;RAM存儲器由兩片CY7C199組成,,數(shù)據(jù)線寬度為16位,容量為64K字節(jié),。80C196單片機的ALE為地址鎖存" title="鎖存">鎖存信號,,/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ù)塊" title="數(shù)據(jù)塊">數(shù)據(jù)塊的讀地址Address_F_R和讀位置指針地址Address_F_RP,。首先向Address_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語言中聲明為lpm_counter[5],。其中,CNT_EN為計數(shù)使能控制,,當CNT_EN為高電平時,每當CLOCK上升沿" title="上升沿">上升沿到來時計數(shù)器便會自動加一,,從而實現(xiàn)了地址自動增加的功能,;CLOCK為同步時鐘輸入端,上升沿有效,;SLOAD為計數(shù)器同步設置初值信號,,當該信號為高電平時,在CLOCK上升沿的作用下,,計數(shù)器的輸出Q[15..0]=D[15..0],,從而實現(xiàn)初始化讀取位置的功能。計數(shù)器用AHDL語言描述如下:
??? counter?:?lpm_counter with (lpm_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_R和Address_F_RP以外的地址,則地址輸出總線A[15..1]=a[15..1],、A16=0,,即單片機直接訪問存儲器;如果讀取Address_F_R,,則片選 /CS2有效并且A[16..1]=Q[15..0]作為輸出地址,。這樣就可以自動地在不同存儲區(qū)域進行切換,從而大大地增加了內(nèi)存的擴充能力,,并且簡化了程序設計,。運用同樣的方法還可以定義Flash ROM中的數(shù)據(jù)塊寫入地址Address_F_W和寫位置指針地址Address_F_WP,RAM中也有類似的方法定義Address_R_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,IOPORT0??? ?,;40H和41H為內(nèi)部寄存器,,因為按字存儲所以連續(xù)讀兩次
??? ST?40H,Address_R_W? ,;寫入指定位置條件判斷退出循環(huán)
??? JMP?REPEAT
??? 從上面這個簡單的例子可以看出,,這種存儲器組織方法大大簡化了編程的復雜性,并且可以采用對位置指針賦初值的方法來實現(xiàn)對擴展存儲器中任何一個位置的讀寫操作,。
3 地址分配
?? ?有了上面的" title="面的">面的存儲器擴展方法,,再結合系統(tǒng)的技術參數(shù)和單片機的特點,就可以做出一套合理的內(nèi)存地址分配方案,。下面給出單片機的地址劃分情況:
??? 0000H~01FFH 系統(tǒng)寄存器區(qū),,保留
??? 0200H~1EFFH 用戶區(qū),直接映射到Flash ROM中的0200H~1EFFH,,可以用來存放數(shù)據(jù),、程序等,,該區(qū)域可以由單片機直接進行尋址。
??? 1F00H~1FFFH 用戶區(qū),,實際使用中把Address_R_R,、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ū)域,。
??? 上面的分配方案可以通過對地址總線進行譯碼生成相應的片選信號 /CS1和 /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)程序。由于Flash ROM的速度慢,,需要在讀寫過程中插入一定量的等待周期,,因此將程序復制到RAM中執(zhí)行可以提高系統(tǒng)的性能;同時系統(tǒng)在對Flash ROM進行寫入操作后,,編程階段的10ms內(nèi)不能對其進行讀取,,因此RAM在這個時候也提供了程序運行的位置。這樣分配后,,程序的長度被限制在28K字節(jié),,實際中這個數(shù)量完全可以滿足系統(tǒng)的需求,。Flash 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 合理利用READY信號
??? 最后介紹一下單片機就緒信號READY在這個系統(tǒng)中的關鍵作用,。從前面的設計中可以看出系統(tǒng)存在著高速RAM和慢速Flash ROM存儲器,,開始時,F(xiàn)lash ROM選用了AT29C1024-70JC[3],,它是該型號中速度最快的,,有效數(shù)據(jù)建立時間僅為70ns。單片機不插入等待周期的讀寫時序,,如圖5所示,。

?


??? 從ALE下降沿地址有效到/RD上升沿的時間是80ns,F(xiàn)lash的響應時間為70ns,,再加上EPLD的延時就造成了單片機從Flash ROM讀取數(shù)據(jù)的不穩(wěn)定,,表現(xiàn)在無法對Flash ROM進行在線寫入、經(jīng)常發(fā)生錯誤的執(zhí)行結果,、死機等,。為此必須加入等待周期,延長讀,、寫時間才能滿足Flash 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)定,、正常,。修改后對Flash 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構成的存儲系統(tǒng),。最后提出了將READY信號由同步產(chǎn)生改為異步產(chǎn)生的方式,,解決了CPU在高速RAM與低速Flash ROM之間切換產(chǎn)生的問題,最終設計成了一套較為完善的CPU外部存儲器系統(tǒng),。
參考文獻
1 徐愛卿.Intel 16位單片機(修訂版).北京:北京航空航天大學出版社,, 2002(第二版)
2 80C196KB User’s Guide.http://www.intel.com
3 Atmel AT29C1024 Datasheet.http://www.atmel.com
4 FLEX 10K EPLD Datasheet.http://www.altera.com

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點,。轉(zhuǎn)載的所有的文章,、圖片、音/視頻文件等資料的版權歸版權所有權人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權者,。如涉及作品內(nèi)容、版權和其它問題,,請及時通過電子郵件或電話通知我們,,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失,。聯(lián)系電話:010-82306118,;郵箱:[email protected]