1 E2PROM介紹及其應(yīng)用現(xiàn)狀 E2PROM(Electically Erasable Programmable Read-Only Memory),即電可擦除只讀存儲(chǔ)器。它是一種非易欠性存儲(chǔ)器,掉電后數(shù)據(jù)依然存在(一般可保存長(zhǎng)達(dá)100年),讀寫(xiě)耗電極低,擦寫(xiě)時(shí)只需相應(yīng)的電信號(hào)即可,控制方式簡(jiǎn)單,體積小巧。價(jià)格便宜,被廣泛應(yīng)用于對(duì)數(shù)據(jù)存儲(chǔ)安全性及可靠性要求較高的場(chǎng)合,如各類IC卡、智能家電、工業(yè)儀器儀表等。 但E2PROM使用壽命有限,一般為可擦寫(xiě)100萬(wàn)次,即某一位由1寫(xiě)為0或由0寫(xiě)為1的次數(shù)為100萬(wàn)次。一般的系統(tǒng)往往只對(duì)若干同定單元進(jìn)行頻繁的讀寫(xiě),很容易造成這些單元的損壞。而常用的E2PROM存儲(chǔ)系統(tǒng),只要某一個(gè)存儲(chǔ)單元損壞,即使其他絕大部分單元都是完好的,也只能將整個(gè)E2PROM芯片報(bào)廢。這既是對(duì)資源的浪費(fèi),也是系統(tǒng)正常運(yùn)行的潛在風(fēng)險(xiǎn)。 為了延長(zhǎng)E2PROM芯片的壽命,提高存儲(chǔ)系統(tǒng)的可靠性,本文提出一種較可靠的E2PROM控制器沒(méi)計(jì)方法,并在FPGA中用VHDL進(jìn)行了實(shí)現(xiàn)。 2 本文E2PROM控制器的工作原理 在很多領(lǐng)域的存儲(chǔ)系統(tǒng)中,可靠性對(duì)系統(tǒng)安全至關(guān)重要。為了避免系統(tǒng)出錯(cuò),并延長(zhǎng)系統(tǒng)的壽命,本文在適當(dāng)犧牲存儲(chǔ)效率的前提下,著重考慮提高存儲(chǔ)系統(tǒng)的可靠性。 E2PROM存儲(chǔ)器存儲(chǔ)單元的損壞主要是由頻繁的寫(xiě)操作造成的。若要解決問(wèn)題,首先耍避免對(duì)同一單元進(jìn)行頻繁的擦寫(xiě),降低存儲(chǔ)單元損壞的可能;其次當(dāng)某些單元損壞時(shí),讀寫(xiě)控制器應(yīng)該能夠跳過(guò)這些損壞的單元,保證系統(tǒng)能繼續(xù)正常工作。本文設(shè)計(jì)的E2PROM控制器具有這兩個(gè)方面的功能。 本文的設(shè)計(jì)思想是,將整個(gè)EzpROM地址空間劃分為地址分配表區(qū)、備用區(qū)和數(shù)據(jù)區(qū),如圖1所示。 ![]() 圖1 E2PROM地址空間劃分 在地址分配表區(qū)中只存儲(chǔ)所有數(shù)據(jù)區(qū)或備用區(qū)存儲(chǔ)單元的地址,初始時(shí)與數(shù)據(jù)區(qū)的每個(gè)存儲(chǔ)單元一一對(duì)應(yīng);當(dāng)某個(gè)數(shù)據(jù)所在的單元損壞時(shí)(由于頻繁讀寫(xiě)的是數(shù)據(jù)所在的單元,所以首先考慮這種情況),則改用備用區(qū)某單元(通過(guò)改寫(xiě)對(duì)應(yīng)的數(shù)據(jù)分配表單元存儲(chǔ)的地址,使其指向改用的備用區(qū)某單元來(lái)實(shí)現(xiàn)),以后每次讀寫(xiě)都指向新的存儲(chǔ)單元,這樣就跳過(guò)了損壞的單元;若要避免對(duì)相同單元頻繁擦寫(xiě),則每過(guò)一段合適的時(shí)間對(duì)整個(gè)數(shù)據(jù)分配表進(jìn)行更新,或?qū)φ麄(gè)E2PROM空間重新劃分;判斷某存儲(chǔ)單元是否損壞的方法是,對(duì)該單元進(jìn)行寫(xiě)操作之后立刻回讀,若讀寫(xiě)內(nèi)容一致則該單元正常,否則已損壞;備用區(qū)的首地址存儲(chǔ)該區(qū)域未使用部分的開(kāi)始地址,以方便數(shù)據(jù)單元損壞時(shí)使用該單元,每當(dāng)有數(shù)據(jù)單元損壞后使用了該單元,備用區(qū)首地址則指向下一單元。 這樣,E2PROM中保存數(shù)據(jù)區(qū)域的損壞單元都能被跳過(guò),只有保存地址的地址分配表和備用區(qū)首地址單元的損壞對(duì)系統(tǒng)的正常運(yùn)行有致命的影響。而備用區(qū)首地址單元的寫(xiě)頻率是最高的,保存數(shù)據(jù)的單元每出現(xiàn)一個(gè)損壞單元就要對(duì)其改寫(xiě)一次。因此,理論上當(dāng)有100萬(wàn)個(gè)單元(1MB)因?qū)懖僮鲹p壞時(shí),備用區(qū)首地址單元的壽命也即耗盡。但目前較常用的E2PROM芯片的容量最大也就若干MB,如果出現(xiàn)近100萬(wàn)個(gè)損壞單元,芯片早已應(yīng)該報(bào)廢。所以,理論上該方法已足夠可靠。 3 系統(tǒng)總體設(shè)計(jì) 本文E2PROM存儲(chǔ)芯片選用ATMEL公司的AT24C01,F(xiàn)PGA芯片采用Altera公司的CycIone II系列。 系統(tǒng)的總體框圖如圖1所示。系統(tǒng)主要分為FPGA部分和E2PROM部分。FPGA接受外界控制信號(hào)、數(shù)據(jù)及時(shí)鐘等信號(hào),并對(duì)E2PROM進(jìn)行控制。E2PROM根據(jù)FPGA的控制信號(hào)進(jìn)行相應(yīng)的讀寫(xiě)操作。 AT24C01內(nèi)部數(shù)據(jù)單元組織方式為128x8位。將其分為三部分:前48x8位作為地址分配表區(qū),地址范圍0000000~0101111;中間32x8位作為備用區(qū),地址范圍為0110000~1001111;后48x8位為數(shù)據(jù)區(qū)。地址范圍為1010000~1111111。地址空間劃分說(shuō)明如圖2所示。 本文的E2PROM控制器在FPGA中用VHDL語(yǔ)言進(jìn)行設(shè)計(jì)。用有限狀態(tài)機(jī)技術(shù)實(shí)現(xiàn)。 ![]() 圖2系統(tǒng)總體結(jié)構(gòu) 4 AT24C01 E2PROM讀寫(xiě)控制原理 4.1 I2C總線工作原理 AT24C01采用簡(jiǎn)單的雙向兩線串行總線PC總線標(biāo)準(zhǔn)。I2c總線由數(shù)據(jù)線SDA和時(shí)鐘線SCL構(gòu)成,可發(fā)送和接收數(shù)據(jù)。其數(shù)據(jù)傳輸過(guò)程中共有四種基本類型信號(hào): (1)開(kāi)始信號(hào),當(dāng)SCL為高電平時(shí)SDA由高電平向低電平跳變,表明傳送數(shù)據(jù)開(kāi)始; (2)結(jié)束信號(hào),當(dāng)SCL為高電平時(shí)SDA由低電平向高電平跳變,表明傳送數(shù)據(jù)結(jié)束; (3)數(shù)據(jù)信號(hào)。即SDA線上傳輸?shù)臄?shù)據(jù),當(dāng)SCL為高電平時(shí)有效,不允許改變,當(dāng)SCL為低電平無(wú)效。允許改變; (4)應(yīng)答信號(hào),接收端正確接收到8位數(shù)據(jù)后,向發(fā)送端發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。 4.2兩線E2PROM字節(jié)讀寫(xiě)工作原理 兩線E2PROM的寫(xiě)操作方式分為字節(jié)寫(xiě)和按頁(yè)寫(xiě)。讀操作方式分為字節(jié)讀和順序讀。本文僅使用以最基本的讀寫(xiě)方式——字節(jié)寫(xiě)和字節(jié)讀方式為例說(shuō)明設(shè)計(jì)過(guò)程,其它讀寫(xiě)方式的設(shè)計(jì)過(guò)程與此相似。 (1)E2PROM的字節(jié)寫(xiě)操作。在控制器對(duì)E2PROM發(fā)送啟動(dòng)信號(hào)之后,緊接著發(fā)送一個(gè)8位的寫(xiě)控制字。控制字的組成包括4位12C特征碼(E2PROM一般為“1010”)、3位芯片地址碼(單片E2PROM為“000”)以及1位讀寫(xiě)狀態(tài)位(讀操作為‘1’,寫(xiě)操作為‘0’)。 E2PROM正確接收到寫(xiě)控制字后,發(fā)送l位低電平的應(yīng)答信號(hào)。控制器緊接著發(fā)送E2PROM存儲(chǔ)單元地址和要寫(xiě)入的數(shù)據(jù)。E2PROM每次止確地接收到一個(gè)字節(jié)的數(shù)據(jù)都要發(fā)送一個(gè)應(yīng)答信號(hào)返回給控制器。隨后控制器發(fā)送停止信號(hào),對(duì)E2PROM寫(xiě)一個(gè)字節(jié)的操作完成。 (2)E2PROM的字節(jié)讀操作。E2PROM的讀操作包括寫(xiě)地址和讀數(shù)據(jù)兩個(gè)階段。控制器首先發(fā)送一個(gè)啟動(dòng)信號(hào)和8位的寫(xiě)控制字節(jié)(讀些狀態(tài)位R/W=‘0’),E2PROM正確接收到控制字后發(fā)送1位低電平的應(yīng)答信號(hào),之后控制器發(fā)送8位的E2PROM地址。通過(guò)寫(xiě)操作設(shè)置E2PROM存儲(chǔ)單元地址。接著控制器再發(fā)送一個(gè)啟動(dòng)信號(hào)和讀控制字節(jié)(此時(shí)R/W=‘1’),啟動(dòng)讀操作,E2PROM收到信息后發(fā)送1位的低電平應(yīng)答信號(hào),然后將指定單元的數(shù)據(jù)發(fā)送到SDA線上,控制器正確收到數(shù)據(jù)后返回一個(gè)低電平的應(yīng)答信號(hào)給E2PROM,隨后發(fā)送停止信號(hào),字節(jié)讀操作結(jié)束。 5 可靠性E2PROM控制器設(shè)計(jì) 本文用VHDL語(yǔ)言,以有限狀態(tài)機(jī)的方式在實(shí)現(xiàn)FPGA對(duì)E2PROM的控制。對(duì)于一般的讀寫(xiě)過(guò)程,只需要7個(gè)基本狀態(tài)便可實(shí)現(xiàn),即:空閑,開(kāi)始。寫(xiě)控制字,寫(xiě)地址,寫(xiě)數(shù)據(jù),讀數(shù)據(jù),停止。 但由于本文的讀寫(xiě)過(guò)程較為復(fù)雜,雖然基本的狀態(tài)仍為這7個(gè),但如果僅用這7種狀態(tài),會(huì)使得程序流程異常繁雜。考慮到每次讀寫(xiě)中都首先要從地址分配表中讀出數(shù)據(jù)地址,然后才在數(shù)據(jù)地址讀寫(xiě)數(shù)據(jù),這兩個(gè)階段雖然過(guò)程相近,但狀態(tài)轉(zhuǎn)換條件不同,將它們分離開(kāi)來(lái)能使?fàn)顟B(tài)轉(zhuǎn)換和程序流程更清晰。所以本系統(tǒng)對(duì)這兩個(gè)階段的狀態(tài)分開(kāi)實(shí)現(xiàn),用14個(gè)狀態(tài)實(shí)現(xiàn)整個(gè)讀寫(xiě)過(guò)程,即:S0空閑,S1開(kāi)始,S2控制字(寫(xiě)操作)。s3寫(xiě)地址,s4開(kāi)始,S5控制字(讀操作),S6讀數(shù)據(jù)(從地址分配表中讀取數(shù)據(jù)地址),S7結(jié)束(查表結(jié)束,此后為數(shù)據(jù)讀寫(xiě)過(guò)程),S8開(kāi)始,S9寫(xiě)控制字,S10寫(xiě)地址,Sll寫(xiě)數(shù)據(jù),S12讀數(shù)據(jù),S13停止。其中Sl到S7為查地址分配表的過(guò)程.S8到S13為進(jìn)行數(shù)據(jù)讀寫(xiě)的過(guò)程。整個(gè)過(guò)程的狀態(tài)轉(zhuǎn)換過(guò)程如圖3所示。 本文設(shè)計(jì)的E2PROM采用的方法需要首先對(duì)E2PROM芯片進(jìn)行格式化,即對(duì)整個(gè)E2PROM存儲(chǔ)空間進(jìn)行劃分,建立地址分配表。這個(gè)過(guò)程為基本寫(xiě)操作的循環(huán),可以嵌入系統(tǒng)讀寫(xiě)過(guò)程中。 因此,整個(gè)系統(tǒng)共有3個(gè)主要進(jìn)程:時(shí)鐘產(chǎn)生進(jìn)程,狀態(tài)轉(zhuǎn)換進(jìn)程和狀態(tài)控制進(jìn)程。 1、時(shí)鐘產(chǎn)生進(jìn)程,負(fù)責(zé)產(chǎn)生滿足系統(tǒng)所需的各種時(shí)鐘,主要是E2PROM的SCL,并且為了方便方便按照時(shí)鐘要求讀寫(xiě)數(shù)據(jù),將SCL周期內(nèi)劃分為4個(gè)子周期。工作在1.8V、2.5V和2.7v時(shí),E2PROM的工作頻率為100KHz。本文采用100M的外 部晶振產(chǎn)生外部時(shí)鐘clk,則需進(jìn)行1000分頻來(lái)產(chǎn)生E2PROM所需的SCL時(shí)鐘信號(hào)。該進(jìn)程如下: CLK_GEN:PROCESS(clk) BEGIN IF clk’EVENT AND clk=’1’THEN IF ncount=499 THEN ncount<=0;sclsig<=NOT sclsig; ELSE ncount<=ncount+l; END IF: END IF; sel<=selsig; END PROCESS; 2、狀態(tài)轉(zhuǎn)換進(jìn)程,負(fù)責(zé)在適當(dāng)?shù)臅r(shí)機(jī)將狀態(tài)機(jī)轉(zhuǎn)入下一狀態(tài),代碼如下: STATE_TRANS:PROCESS(sclsig) BEGIN IF sclsig’EVENT AND sclsig=’0’THEN curstate<=nextstate; END IF; END PROCESS 3、狀態(tài)控制進(jìn)程,負(fù)責(zé)在格式化及讀寫(xiě)過(guò)程中各種信號(hào)的設(shè)置,這是整個(gè)系統(tǒng)最復(fù)雜也是最核心的部分,其本質(zhì)就是系統(tǒng)狀態(tài)轉(zhuǎn)換圖的VHDL代碼實(shí)現(xiàn)。但其過(guò)程相當(dāng)繁瑣,在這里只能將這個(gè)進(jìn)程代碼的主要部分展示出來(lái),然后對(duì)各狀態(tài)的具體操作進(jìn)行適當(dāng)?shù)恼f(shuō)明。 本進(jìn)程的主要代碼如下: STATE_CTR:PROCESS(clk) BEGIN IF clk’EVENT AND clk=’1’THEN CASE curstate IS WHEN S0=> IF rwf/="00" THEN nextstate<=S1; END IF; ...... WHEN S13=> IF sclsig=O AND ncount=499 THEN sda<=’0’: ELSIF sclsig=1 AND nclk=124 THEN sda<=’1’;nextstate<=sO; END IF; END CASE; END IF; END PROCESS; ![]() 圖3系統(tǒng)狀態(tài)轉(zhuǎn)換圖 對(duì)各狀態(tài)的說(shuō)明如下: S0:空閑狀態(tài),檢測(cè)rwf信號(hào)輸入。如果為格式化命令(“l(fā)l”)則轉(zhuǎn)入S8,如果為讀操作或?qū)懖僮髅?分別為“0l”和“10”)則轉(zhuǎn)入S1。 S1:產(chǎn)生開(kāi)始信號(hào)。完成后轉(zhuǎn)入入S2。 S2:向SDA線輸出寫(xiě)操作控制字。完成后轉(zhuǎn)入S3。 S3:寫(xiě)地址(由外部輸入)。即所需操作的數(shù)據(jù)單元對(duì)應(yīng)在地址分配表中的地址。完成后轉(zhuǎn)入S4。 S4:產(chǎn)生開(kāi)始信號(hào)。完成后轉(zhuǎn)入S5。 S5:向SDA線讀操作控制字。完成后轉(zhuǎn)入S6。 S6:讀取數(shù)據(jù),此處為所需數(shù)據(jù)所在的地址。完成后轉(zhuǎn)入s7。 S7:產(chǎn)生結(jié)束信號(hào)。完成后轉(zhuǎn)入S8。至此查表過(guò)程結(jié)束,此后為實(shí)際讀寫(xiě)過(guò)程。 s8:產(chǎn)生開(kāi)始信號(hào)。完成后轉(zhuǎn)入S9。 S9:輸出控制字。如果在讀操作過(guò)程中且為第二次進(jìn)入該狀態(tài),則向SDA線輸出讀操作控制字,完成后轉(zhuǎn)入S12;否則輸出寫(xiě)操作控制字,完成后轉(zhuǎn)入S1O。 S1O:寫(xiě)地址(即S6狀態(tài)中讀取的數(shù)據(jù))。完成后,如果為讀操作則轉(zhuǎn)入S11,否則轉(zhuǎn)入S8。 S11:寫(xiě)數(shù)據(jù),向SDA線寫(xiě)外部提供的數(shù)據(jù)。完成后轉(zhuǎn)入S13。 S12:讀數(shù)據(jù),完成后轉(zhuǎn)入S13。 S13:產(chǎn)生結(jié)束信號(hào)。如果處于讀操作結(jié)束狀態(tài),則轉(zhuǎn)入SO;如果處于寫(xiě)操作結(jié)束狀態(tài)并且沒(méi)有對(duì)數(shù)據(jù)回讀以檢查所寫(xiě)單元是否正常。則轉(zhuǎn)入S6進(jìn)行回讀;如果處于寫(xiě)操作回讀結(jié)束狀態(tài),無(wú)誤則轉(zhuǎn)入S0,有誤則轉(zhuǎn)入S1讀備用區(qū)首地址;如果是對(duì)備用區(qū)寫(xiě)操作回讀有誤,則地址加l后進(jìn)入S6寫(xiě)下一地址,直至能正確寫(xiě)入,之后將地址加1寫(xiě)入備用區(qū)首地址.然后轉(zhuǎn)入S0;如果處于格式化過(guò)程中,則地址加1后轉(zhuǎn)入S8,直到格式化結(jié)束轉(zhuǎn)入S0。 6 仿真結(jié)果和結(jié)論 ![]() 圖4寫(xiě)操作功能仿真的部分波形 ![]() 圖5讀操作功能仿真的部分波形 在Quartos II軟件中對(duì)本文設(shè)計(jì)的E2PROM控制器進(jìn)行了功能仿真。寫(xiě)操作和讀操作功能仿真的部分波形如圖4和圖5所示。根據(jù)仿真波形可知,其結(jié)果與預(yù)期基本一致。在工程中的成功應(yīng)用也證明了本設(shè)計(jì)的正確性。 本文作者創(chuàng)新點(diǎn):對(duì)E2PROM存儲(chǔ)空間進(jìn)行適當(dāng)?shù)膭澐郑灶愃浦羔樀姆绞竭M(jìn)行讀寫(xiě)操作,減少了系統(tǒng)對(duì)特定存儲(chǔ)單元的依賴,提高了系統(tǒng)的可靠性。 作者:接輝,顧文燦 來(lái)源:《微計(jì)算機(jī)信息》(嵌入式與SOC)2009年第7-2期 |