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