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