51單片機(jī)存儲(chǔ)器擴(kuò)展問(wèn)題
一.51的存儲(chǔ)器從功能上來(lái)說(shuō)可以分為程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器,至于到底能擴(kuò)展多少存儲(chǔ)空間,要看你擴(kuò)展的是哪一類存儲(chǔ)器。
訪問(wèn)存儲(chǔ)空間時(shí),需要用到兩個(gè)指針變量,為DPTR和PC。其中pc為程序計(jì)數(shù)器,指向下一條需要執(zhí)行的指令的地址,DPTR為數(shù)據(jù)指針寄存器,這兩個(gè)變量的長(zhǎng)度都為16位,這是51單片機(jī)內(nèi)部結(jié)構(gòu)決定的,無(wú)法改變。所以這兩個(gè)指針的尋址能力都為64K。這樣看來(lái),兩類存儲(chǔ)器的擴(kuò)展能力都為64K 。但是,如果你實(shí)際擴(kuò)展過(guò)存儲(chǔ)器,你就可以發(fā)現(xiàn)程序存儲(chǔ)器的擴(kuò)展能力并沒(méi)有64K!!!
這是為什么呢?
這得從51單片機(jī)的存儲(chǔ)空間的編址說(shuō)起。這里僅作簡(jiǎn)單說(shuō)明,具體可以看教科書(shū)。簡(jiǎn)單地說(shuō),內(nèi)部程序存儲(chǔ)器和外部程序存儲(chǔ)器是一起編址的,它們分別占用64K地址的一部分,所以外部擴(kuò)展時(shí)要減去內(nèi)部的地址空間,當(dāng)然小于64K啦。而數(shù)據(jù)存儲(chǔ)器是內(nèi)外部分別編址,內(nèi)外部數(shù)據(jù)存儲(chǔ)器用不同的指令進(jìn)行訪問(wèn),所以不用擔(dān)心單片機(jī)會(huì)混淆內(nèi)外部數(shù)據(jù)存儲(chǔ)器,所以外部數(shù)據(jù)存儲(chǔ)器擴(kuò)展能力有64K
擴(kuò)展閱讀:?jiǎn)纹瑱C(jī)存儲(chǔ)器的配置
二.MCS-51單片機(jī)擴(kuò)展系統(tǒng)中,片外程序存儲(chǔ)器和片外數(shù)據(jù)存儲(chǔ)器共處同一個(gè)地址空間,為什么不會(huì)發(fā)生總線沖突?
硬件上,控制信號(hào)不一樣:片外程序存儲(chǔ)器工作,要PSEN信號(hào)有效;片外數(shù)據(jù)存儲(chǔ)器工作,要RD或WR信號(hào)有效;
軟件上,尋址不一樣,片外程序存儲(chǔ)器工作,要用MOVC,
片外數(shù)據(jù)存儲(chǔ)器工作,要用MOVX;
雖然說(shuō)他們的地址都是0000H~FFFFH,不會(huì)發(fā)生沖突的
因?yàn)榭刂菩盘?hào)線的不同:
外擴(kuò)的RAM芯片既能讀出又能寫(xiě)入,所以通常都有讀寫(xiě)控制引腳,記為OE和WE。外擴(kuò)RAM的讀、寫(xiě)控制引腳分別與MCS-51的RD和WR引腳相連。
外擴(kuò)的EPROM在正常使用中只能讀出,不能寫(xiě)入,故EPROM芯片沒(méi)有寫(xiě)入控制引腳,只有讀出引腳,記為OE,該引腳與MCS-51單片機(jī)的PSEN相連
三.單片機(jī)中外接程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器公用16位地址線和8根數(shù)據(jù)線為什么不會(huì)起沖突
建議你閱讀一下單片機(jī)關(guān)于選通地址、傳遞數(shù)據(jù)方面的敘述。
下面我簡(jiǎn)略的說(shuō)一下大概過(guò)程,希望對(duì)你有所幫助。
第一,單片機(jī)采用三總線結(jié)構(gòu)傳遞數(shù)據(jù)。地址總線、數(shù)據(jù)總線、控制總線。傳遞數(shù)據(jù)的過(guò)程是先尋址,再傳遞數(shù)據(jù)。即先送一個(gè)地址信息(由微處理器向總線寫(xiě)一個(gè)地址信息),由寄存器(也可能是程序存儲(chǔ)器,也可能是數(shù)據(jù)存儲(chǔ)器)根據(jù)這個(gè)地址,把微處理器要讀取的數(shù)據(jù)寫(xiě)到總線上,微處理器再讀取這個(gè)數(shù)據(jù)。整個(gè)過(guò)程由控制總線控制。所以每次讀的數(shù)據(jù)是針對(duì)那個(gè)地址對(duì)應(yīng)的寄存器操作的,不會(huì)發(fā)生混亂。寫(xiě)數(shù)據(jù)時(shí)一樣,先尋址,再寫(xiě)數(shù)據(jù),數(shù)據(jù)就寫(xiě)入剛才尋址時(shí)的地址對(duì)應(yīng)的那個(gè)寄存器里去了。
第二、程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器有不同的選通信號(hào),在一個(gè)指令周期里,是不同的時(shí)間選通的,所以不會(huì)混亂。
第三。選通的引腳不同。拿片外數(shù)據(jù)存儲(chǔ)器來(lái)說(shuō),是P3的第6和第7引腳做選通信號(hào),程序存儲(chǔ)器是PSEN做選通信號(hào),他們接在各自器件的選通引腳上,所以不會(huì)混亂。
第四,指令不同。拿匯編指令來(lái)說(shuō)。MOV是程序存儲(chǔ)器傳遞數(shù)據(jù)用,MOVX是數(shù)據(jù)存儲(chǔ)器傳遞數(shù)據(jù)用(對(duì)片外而言)。
總之,記住三總線傳遞的方式,先尋址,再傳數(shù),由控制總線控制,這個(gè)模式,你就容易理解這個(gè)了。
單片機(jī)的p2和p0分別傳遞地址的高八位和低八位。同時(shí)p0還傳遞數(shù)據(jù)。在時(shí)序信號(hào)的ALE高電平期間,鎖定地址信息。/PSEN是選通程序存儲(chǔ)器的。在/PSEN低電平期間是向程序存儲(chǔ)器傳遞程序代碼,/WR和/RD是選通數(shù)據(jù)存儲(chǔ)器的,即在/WR和/RD(p3的六腳和七腳)低電平期間把數(shù)據(jù)傳遞給數(shù)據(jù)寄存器。而/PSEN和/WR及/RD是在不同時(shí)間變?yōu)榈碗娖降,沒(méi)有重疊的部分。也就是說(shuō),當(dāng)/WR及/RD變成低電平時(shí),/PSEN已經(jīng)恢復(fù)高電平了,由P0口傳出的數(shù)據(jù)信息當(dāng)然只會(huì)傳到數(shù)據(jù)存儲(chǔ)器里,因?yàn)槌绦虼鎯?chǔ)器已經(jīng)不再處于選通狀態(tài)了!!從表面看,都是從p0口傳出的,但因?yàn)檫x通器件的時(shí)間不同而不會(huì)發(fā)生混亂。當(dāng)然我說(shuō)的是片外程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器的的情況,其實(shí)對(duì)片內(nèi)也一樣,還是三總線的這種控制方式,使它們?cè)诓煌臅r(shí)間被選通,而不至于發(fā)生沖突。
看看單片機(jī)的一個(gè)電路圖。你會(huì)發(fā)現(xiàn)p0既跟74LS373連,又跟8155或8255或鍵盤(pán)或數(shù)模轉(zhuǎn)換器等等連。而8155或8255或鍵盤(pán)或數(shù)模轉(zhuǎn)換器等等對(duì)單片機(jī)而言是當(dāng)做數(shù)據(jù)存儲(chǔ)器處理的。74LS373連的多半是程序存儲(chǔ)器。那么p0送出的信號(hào)不是兩者都接受了嗎?注意看ALE接74LS373的G接口,鎖存地址用,PSEN有時(shí)用有時(shí)不用。WR和RD接數(shù)據(jù)存儲(chǔ)器的選通接口。因?yàn)閃R和RD跟ALE的信號(hào)在時(shí)間上沒(méi)有重疊部分,所以p0的信號(hào)不會(huì)被程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器同時(shí)收到。這是一個(gè)舉例說(shuō)明,具體情況要具體分析。
四,51單片機(jī),存儲(chǔ)器分為數(shù)據(jù)存儲(chǔ)器和程序儲(chǔ)存器,其地址空間、存取指令、和控制信號(hào)各有一套,
51是馮-諾依曼結(jié)構(gòu)
哈弗結(jié)構(gòu)說(shuō)的是將程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器地址編碼分開(kāi),因而有兩種程序指令總線和數(shù)據(jù)指令總線。請(qǐng)注意這里說(shuō)的是:地址編碼分開(kāi)。取指令和取數(shù)據(jù)可以同時(shí)進(jìn)行。
因?yàn)轳T-諾依曼結(jié)構(gòu)的數(shù)據(jù)線和指令線是分時(shí)復(fù)用的,在同一根線上,有時(shí)傳送的是數(shù)據(jù)有時(shí)是指令,所以它取指令和取數(shù)據(jù)不能同時(shí)進(jìn)行。你看mov,movx,movc,的功能,它告訴cpu什么時(shí)候取數(shù)據(jù)什么時(shí)候取指令。注意:數(shù)據(jù)和指令的區(qū)別!
又一種說(shuō)法 哈佛結(jié)構(gòu)和馮.諾依曼結(jié)構(gòu)都是一種存儲(chǔ)器結(jié)構(gòu)。哈佛結(jié)構(gòu)是將指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器分開(kāi)的一種存儲(chǔ)器結(jié)構(gòu);而馮.諾依曼結(jié)構(gòu)將指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器合在一起的存儲(chǔ)器結(jié)構(gòu)。
哈佛結(jié)構(gòu)是為了高速數(shù)據(jù)處理而采用的,因?yàn)榭梢酝瑫r(shí)讀取指令和數(shù)據(jù)(分開(kāi)存儲(chǔ)的)。大大提高了數(shù)據(jù)吞吐率。缺點(diǎn)是結(jié)構(gòu)復(fù)雜。
通用微機(jī)指令和數(shù)據(jù)是混合存儲(chǔ)的,結(jié)構(gòu)上簡(jiǎn)單,成本低。假設(shè)是哈佛結(jié)構(gòu):你就得在電腦安裝兩塊硬盤(pán),一塊裝程序,一塊裝數(shù)據(jù),內(nèi)存裝兩根,一根儲(chǔ)存指令,一根存儲(chǔ)數(shù)據(jù)……
是什么結(jié)構(gòu)要看總線結(jié)構(gòu)的。51單片機(jī)雖然數(shù)據(jù)指令存儲(chǔ)區(qū)是分開(kāi)的,但總線是分時(shí)復(fù)用得,所以頂多算改進(jìn)型的哈佛結(jié)構(gòu),呵呵。ARM9雖然是哈佛德,但是之前的版本也還是馮諾結(jié)構(gòu)。早期的X86能迅速占有市場(chǎng),一條很重要的原因,正是靠了馮 諾依曼這種實(shí)現(xiàn)簡(jiǎn)單,成本低的總線結(jié)構(gòu)。樓上的兄弟有一點(diǎn)說(shuō)的不確切,現(xiàn)在的處理器雖然外部總線上看是諾依曼結(jié)構(gòu)的,但是由于內(nèi)部CACHE的存在,因此實(shí)際上內(nèi)部來(lái)看已經(jīng)算是改進(jìn)型哈佛結(jié)構(gòu)的了。
這個(gè)問(wèn)題穎特新上討論翻了無(wú)數(shù)個(gè)帖子,沒(méi)有什么定論,見(jiàn)仁見(jiàn)智。
至于優(yōu)缺點(diǎn),呵呵,樓上的兄弟說(shuō)的就比較的明白了。哈佛結(jié)構(gòu)就是復(fù)雜,對(duì)外圍設(shè)備的連接與處理要求高,十分不適合外圍存儲(chǔ)器的擴(kuò)展。所以早期通用CPU難以采用這種結(jié)構(gòu)。而單片機(jī),由于內(nèi)部集成了所需的存儲(chǔ)器,所以采用哈佛結(jié)構(gòu)也未嘗不可。現(xiàn)在的處理器,依托CACHE的存在,已經(jīng)很好的將二者統(tǒng)一起來(lái)了。
很多入門(mén)的書(shū)上基本上都說(shuō):由運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備、輸出設(shè)備組成的系統(tǒng)
都叫馮氏結(jié)構(gòu)。
也有的說(shuō):“程序存儲(chǔ)器的數(shù)據(jù)線地址線”與“數(shù)據(jù)存儲(chǔ)器的數(shù)據(jù)線地址線”共用的話,就
是馮氏結(jié)構(gòu),所以51是該結(jié)構(gòu)。(我認(rèn)為說(shuō)得太絕對(duì)了)
我認(rèn)為馮氏結(jié)構(gòu)與哈佛結(jié)構(gòu)的區(qū)別應(yīng)該在存儲(chǔ)器的空間分別上,哈佛結(jié)構(gòu)的數(shù)據(jù)區(qū)和代碼區(qū)是分開(kāi)的,它們即使地址相同,但空間也是不同的,主要表現(xiàn)在數(shù)據(jù)不能夠當(dāng)作代碼來(lái)運(yùn)行。
口線復(fù)用,就將它認(rèn)為成馮氏結(jié)構(gòu),我認(rèn)為這樣不足取,應(yīng)該是按照空間是否完全重合來(lái)辨別。比如PC機(jī)的代碼空間和數(shù)據(jù)空間是同一空間,所以是馮氏結(jié)構(gòu);51由于IO口不夠,但代碼空間和數(shù)據(jù)空間是分開(kāi)的,所以還是哈佛結(jié)構(gòu)。
另外,還有的把CISC RISC 和 地址是否復(fù)用,是哪種結(jié)構(gòu) 這3這都混到一起。我認(rèn)為這三者都沒(méi)有必然的關(guān)系。只不過(guò) RISC因?yàn)榫?jiǎn)了指令集,沒(méi)有了執(zhí)行復(fù)雜功能的指令,為了提高性能,常采用哈佛結(jié)構(gòu),并且不復(fù)用地址線。
【更多資源】
編輯:admin 最后修改時(shí)間:2018-05-21