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