<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于PLD的嵌入式系統外存模塊設計

基于PLD的嵌入式系統外存模塊設計

作者: 時(shí)間:2011-04-29 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:以MCS-96系列單片機為例,介紹了一種采用可編程邏輯器件()的存儲器方案,該包含了Flash閃存和RAM。提出了一種方便的存儲器擴展方法,該方法有效地解決了尤其是數據采集、存儲等中存在的存儲空間不足問(wèn)題。該方案具有通用性強、讀寫(xiě)控制簡(jiǎn)單等特點(diǎn),具有很強的實(shí)用性。

本文引用地址:http://dyxdggzs.com/article/150820.htm

中,由于成本和體積等因素的限制,往往會(huì )使CPU(包括DSP、單片機等)存在地址空間不足的問(wèn)題。很多文獻(如參考文獻[1]都有相關(guān)的存儲器擴展方法的介紹, 目前已有的方法通常是借助于CPU的I/0接口產(chǎn)生片選或者高位地址信號,利用這些信號將內存分頁(yè),但當頁(yè)間跳轉時(shí)將給程序帶來(lái)不便。對于沒(méi)有內部存儲器并且采用統一編址的CPU,如80C196KC20[1],這種頁(yè)間切換將造成CPU無(wú)法繼續執行當前程序而產(chǎn)生錯誤(見(jiàn)圖1)。在CPU執行頁(yè)面切換操作后,本應該繼續執行頁(yè)面1的指令,可是卻錯誤地執行了頁(yè)面2中的相應指令,這種結果不是所需要的。因此尋找一個(gè)有效的存儲器擴展方法是實(shí)際應用中亟待解決的問(wèn)題。

1 存儲器擴展方法解決方案

在對MCS-96系列單片機的使用中發(fā)現,64K字節的存儲空間用來(lái)存放程序能滿(mǎn)足絕大多數的使用需求(通常用戶(hù)的應用程序不到10K字節),但如果使用其進(jìn)行數據存儲控制,則會(huì )帶來(lái)存儲空間上的嚴重不足。通過(guò)對實(shí)際應用的統計分析發(fā)現,在很多情況下,數據的

存取僅限于順序的連續操作。利用這個(gè)特點(diǎn),可以對數據存儲空間進(jìn)行簡(jiǎn)化設計,具體的說(shuō)就是通過(guò)對同一個(gè)地址連續讀或者連續寫(xiě)來(lái)進(jìn)行批量數據的存取,從而節省地址空間。在16位CPU中,可以將任何一段64K字(2的16次方)的存儲空間映射到兩個(gè)地址(一個(gè)作為讀取的位置,一個(gè)作為寫(xiě)入的位置),采用這樣的映射方法可以將內存最大擴展到2G字(2的31次方),但這樣的設計同時(shí)也帶來(lái)了諸多邏輯控制上的困難。隨著(zhù)可編程邏輯器件()包括FPGA、EE4[4]、CPLD等的迅速發(fā)展,數字邏輯電路的設計得到了大大簡(jiǎn)化,從而使這種存儲器擴展想法可以得到實(shí)現。

2 存儲器擴展方法的具體實(shí)現

下面以筆者設計的系統為例來(lái)詳細說(shuō)明這種存儲器擴展方法的實(shí)現。該系統是一個(gè)多功能數據采集設備,能夠以最高40k次/s的速率進(jìn)行12位A/D轉換,并且可以將采集到的數據保存至Flash ROM中,以防止掉電丟失。技術(shù)參數要求如下:①最多可以保存32K字節的采樣數據;②可以同時(shí)存儲4段系統工作配置程序,每段4K字節,共計16K字節;③由于Flash ROM自身的特點(diǎn),在寫(xiě)人數據后的編程階段不能進(jìn)行讀寫(xiě)操作,因此為了保證系統采樣和單片機運行的正常進(jìn)行,需要額外增加32K字節的RAM作為數據緩存;④系統程序、中斷服務(wù)程序等共占用56K字節(Flash ROM和RAM各保留28K字節),總計需要存儲空間136K字節。這個(gè)需求已經(jīng)超過(guò)96系列單片機的64K字節尋址范圍,為此設計了一個(gè)存儲器,其結構如圖2所示。

圖2

Flash ROM采用ATMEL公司的AT29C1024,容量為128K字節,數據線(xiàn)寬度為16位;RAM存儲器由兩片CY7C199組成,數據線(xiàn)寬度為16位,容量為64K字節。80C196單片機的ALE為地址鎖存信號,/WE為寫(xiě)有效信號,/RD為讀有效信號,READY為準備就緒信號。MCS-96系列單片機支持8位和16位兩種工作模式,為了提高系統的性能,選擇16位工作模式。96系列單片機地址是按照字節的方式來(lái)計算的,因此在16位工作模式下的A0=0沒(méi)有實(shí)際意義。在通常的讀寫(xiě)情況下,取經(jīng)過(guò)鎖存后的AD1~AD15地址作為A1~A15而A16=0。 clock信號要保證在寫(xiě)Address_F_RP地址修改讀取位置時(shí),或讀Address_F_R地址取數據時(shí)都能產(chǎn)生上升沿信號??偩€(xiàn)a0-a15和D0~D15分別是由AD0-AD15分離出來(lái)的地址和數據總線(xiàn)。多路選擇器則根據地址譯碼產(chǎn)生的S0-S3選擇輸出地址,輸出地址直接連接到RAM和Flash ROM的地址線(xiàn)上。如果訪(fǎng)問(wèn)除Address_F_RP和Address_F_RP以外的地址,則地址輸出總線(xiàn)A115..1)=a[15..1]、A16=0,即單片機直接訪(fǎng)問(wèn)存儲器;如果讀取Address_F_R,則片選/CS2有效并且A[16..1)Q(15..0]作為輸出地址。這樣就可以自動(dòng)地在不同存儲區域進(jìn)行切換,從而大大地增加了內存的擴充能力,并且簡(jiǎn)化了程序設計。運用同樣的方法還可以定義FlashROM中的數據塊寫(xiě)入地址Address_F_W和寫(xiě)位置指針地址Address_F_WP,RAM中也有類(lèi)似的方法定義Address_R_(RAM數據塊讀地址)、Address_R_RP(RAM數據塊的讀位置指針地址)、Address_R_W(RAM數據塊寫(xiě)地址)和Address_R_WP(RAM數據塊的寫(xiě)位置指針地址)。這樣可以方便地對內存的擴展部分進(jìn)行讀寫(xiě)。下面以MCS-96的匯編語(yǔ)言為例來(lái)說(shuō)明程序中是如何操作的。比如需要從IOPORT0口連續采集數據,然后存放到RAM中指定的數據塊等待處理,則可以寫(xiě)出如下程序: 從上面這個(gè)簡(jiǎn)單的例子可以看出,這種存儲器組織方法大大簡(jiǎn)化了編程的的復雜性,并且可以采用對位置指針賦初值的方法來(lái)實(shí)現對擴展存儲器中任何一個(gè)位置的讀寫(xiě)操作。 上面的分配方案可以通過(guò)對地址總線(xiàn)進(jìn)行譯碼生成相應的片選信號/CSl和/CS2來(lái)實(shí)現。這樣分配后,Flash ROM 和 RAM 的使用情況如圖4所示。 可是實(shí)際故障依舊,通過(guò)測試得到的時(shí)序信號如圖6所示。 前面詳細地介紹了一種實(shí)用的存儲器擴展方法,該方法是PLD器件實(shí)現的,有效地解決了系統,尤其是數據采集、存儲系統中內存擴展的問(wèn)題。該方法能夠簡(jiǎn)化程序設計,并且不需要隨CPU型號的變化而修改設計,具有很好的可移植性。同時(shí)還給出了一種較為復雜的單片機外部存儲器的組織方案,包括了Flash ROM和RAM構成的存儲系統。最后提出了將READY信號由同步產(chǎn)生改為異步產(chǎn)生的方式,解決了CPU在高速RAM與低速Flash ROM之間切換產(chǎn)生的問(wèn)題,最終設計成了一套較為完善的CPU外部存儲器系統。

下面以讀Flash ROM為例介紹地址擴展方法。對于可以直接尋址的地址,EPLD作為鎖存器,將AD0~AD15分時(shí)的地址數據總線(xiàn)分開(kāi),生成獨立的地址和數據總線(xiàn)。在這里定義了兩個(gè)特殊的地址:Flash ROM數據塊的讀地址Address_F_R和讀位置指針地址Address_F_RP。首先向Ad-dress_F_RP寫(xiě)入一個(gè)16位的二進(jìn)制數,該數代表了將要讀取的數據塊的首地址,16位表示范圍是0~65535,因此可以指定的首地址范圍是64K字即128K字節;然后連續地從Address_F_R進(jìn)行讀取操作,每讀一次,位置指針會(huì )自動(dòng)加1而不需要重新設置。如果需要讀取新的位置,只需要向Address_F_RP地址寫(xiě)入新的位置數據即可。該功能在EPLD器件內部的實(shí)現方法見(jiàn)圖3。計數器可同步設置初值、同步計數,在A(yíng)HDL語(yǔ)言中聲明為1pm_counter[5]。其中,CNT_EN為計數使能控制,當CNT_EN為高電平時(shí),每當CLOCK上升沿到來(lái)時(shí)計數器便會(huì )自動(dòng)加一,從而實(shí)現了地址自動(dòng)增加的功能;CLOCK為同步時(shí)鐘輸入端,上升沿有效;SLOAD為計數器同步設置初值信號,當該信號為高電平時(shí),在CLOCK上升沿的作用下,計數器的輸出Q[15..0]=D[15..0],從而實(shí)現初始化讀取位置的功能。計數器用AHDL語(yǔ)言描述如下:

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];

LD 40H,地址值;地址值為即將寫(xiě)入的目的地址,16位按字編址。

ST 40H,Address_R_WP;設置寫(xiě)位置指針

REPEAT:

LDB 40H,IOPORT0

LDB 41H,IOPORTO;40H和41H為內部寄存器,因為按字存儲所以連續讀兩次

ST 40H,Address_R_W ;寫(xiě)入指定位置條件判斷退出循環(huán)

JMP REPEAT

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: 模塊 設計 系統 嵌入式 PLD 基于

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>