1 引言
閃速存儲器(FLASH Memory)以其集成度高、成本低、使用方便等許多優點,廣泛應用于通訊設備、辦公設備、家用電器、醫療設備等領域。利用其保存信息的非易失性和在線更新數據參數的特性,可將其作為具有一定靈活性的只讀存儲器(ROM)使用。
現在的數字電路應用系統設計中,經常遇到大容量的數據存儲問題。Flash由于容量大、存儲速度快、體積小、功耗低等諸多優點,而成為應用系統中數據存儲器件的首選。由于在研制實時信號處理系統時,需要一塊大容量的Flash來存儲坐標變換的數據作查找表,因此面臨一個如何對Flash進行編程,將數據寫入Flash的問題。由于我們選用的Flash芯片為SST39SF010/020,是最新生產的型號,需要自己開發編程器來滿足設計需要,達到既經濟又實用的目的。這一型號的Flash采用的是標準的5V電壓供電,器件在命令控制下自己產生內部的擦除電壓Vpp,從而完成數據的寫入和芯片的擦除等各種功能。而FPGA這種大規模的可編程器件十分適合邏輯電路的設計,能方便地控制和產生 Flash編程操作中的各種控制命令,實現編程器的功能。
2 Flash的性能參數和操作時序
以最新的Flash芯片型號SST39SF010/020為例,容量為1/2Mbit(×8)。 它的主要性能有:
● 單一的5.0V電壓讀寫操作;
● 高可靠性,超過100年的數據保持能力;
● 快速擦除和字節編程功能
——扇區擦除時間典型值只需7ms;
——片擦除時間典型值只需15ms;
——字節編程需時間典型值只需20微秒;
——片重寫時間需3ms(SST39SF010)
● 片內部產生Vpp編程電壓,實現自動讀寫時序;
● I/O兼容TTL;
各引腳功能:
Ams~A0:地址輸入 ——提供存儲器地址;
DQ7~DQ0:數據輸入/輸出 ——在讀時序時輸出數據,在寫時序時接收輸入的數據;
CE#:片選使能——當CE#為低電平有效;
OE#:輸出使能——選通輸出緩存器;
WE#:寫使能——控制寫時序;
VDD:接5V電源;
VSS:接地。
在對Flash進行編程操作前,必須保證存儲單元為空。如果不為空,就必須先對Flash芯片進行擦除操作。由于Flash采用了模塊分區的陣列結構,使得各個存儲模塊既可以整個芯片一齊被擦除,還可以使各個存儲模塊被獨立的分別擦除。只需在地址和數據端寫入不同的操作命令即可實現不同的擦除操作。
SST39SF010的編程操作分三步驟:第一步是連續載入三字節命令的軟件數據保護操作,第二步是寫入字節地址和字節數據,在編程操作過程中,地址是在CE#或WE#的下降沿時有效,而數據則是在CE#或WE#的上升沿時有效;第三步是芯片內部的編程操作,該操作在CE#或WE#的第四個上升沿有效,隨后該內部編程操作在30微秒內即可完成。
FLASH的編程操作是自動字節操作,編程時要特別注意編程時間參數和使用的命令集。編程和擦除時鐘周期的定時參數如表所示。3 FPGA實現Flash編程器的設計
Flash編程器的關鍵是要保證Flash地址和數據信號在時序上的嚴格要求,由SST39SF010的編程和擦除周期時序參數得知,它的地址或數據信號的建立和保持時間的最小時鐘周期僅為30ns。為此,我們采用了40MHz的晶振作為FPGA的驅動時鐘,它的最小時鐘周期為25ns,完全可滿足最小的時間周期要求。
采用FPGA來實現Flash編程器,主要是如何對Flash進行寫操作,利用VHDL語言編寫的寫操作進程表示如下:
實現一個控制功能,可以用有限狀態機實現,也可以用CPU實現,二者相比,前者性能遠高于后者。因為,在Von Neumann結構的CPU中,需要許多操作(例如取數和執行)和部件(例如數據通路和ALU寄存器)。而狀態機中,狀態存儲在多個觸發器中,表示行為的代碼存儲在門級網絡中。對于通常的一條選擇判斷語句,如果用CPU實現,一般需要10~20條機器指令,其執行時間與CPU的速度有關。如果由門和觸發器實現,則執行時間為一個時鐘周期。因此用VHDL實現的狀態機的控制性能要優于CPU實現的方案。
如上述程序,在編程器的寫操作進程中,我們使用Moore型狀態機,它最大的特點是輸出僅是狀態向量的函數,即Moore狀態機的輸出僅和當前狀態(現態)有關。在寄存器轉移級的有限狀態機中包括狀態進程和組合進程兩部分。
狀態進程:狀態進程對狀態機的時鐘信號敏感,當時鐘發生有效跳變時,狀態機的狀態發生變化,由次態變為現態。本例中,將寫操作分成900個狀態,狀態0初始化各輸出信號,狀態1~5執行第一個控制命令,狀態7—10執行如第二個控制命令,狀態12~15執行第三個控制命令,狀態17~ 20給出要寫入的地址和數據,狀態21~900保持控制信號,是芯片內部編程時間。 組合進程:組合進程就根據當前狀態(現態)給輸出信號賦值,并決定下一狀態(次態)。在本例中,狀態機根據不同的狀態對CE#、OE#、 WE、地址、數據等Flash控制信號進行賦值,從而實現對Flash的控制功能。
但是每執行一次寫操作,只能寫入一個地址單元里的8bit數據,如果按照這個方法,完成整個Flash芯片1Mbit數據的寫入就需要重復執行寫操作 128K次,這樣既麻煩又浪費時間。我們選用的Xilinx公司SpartanⅡ系列FPGA,提供片上雙端口同步讀/寫RAM塊,每塊RAM容量為4096bit。塊RAM的每個端口可獨立配置為讀/寫端口、讀端口或寫端口,同時還能配置為任何想要的數據帶寬。因此塊RAM可使FPGA設計者的設計更加簡單,可以把塊RAM配置成ROM、RAM、FIFO等多種元件,具有使用方便、性能優越等特點,是一種十分高效的內部存儲器解決方案。因此我們采用FPGA的塊RAM作為內部數據緩沖器,以提高 Flash寫操作的速度和效率。
在本例中,使用內部塊RAM產生一個32Kbit 的ROM 元件,程序當中直接引用和映射該元件,將要寫入Flash的數據先寫入該ROM元件中,然后在每次寫操作中將ROM中的數據按地址順序逐一寫入Flash中的一個連續32Kbit的扇區當中,這樣編程器的一次寫操作就可以寫入32Kbit數據,因為32K×32=1Mbit,則依次改變Flash的高5位地址,重復32次上述的寫操作,這樣1Mbit的數據就寫入了整片Flash中,大大提高了編程器寫操作的效率。至于ROM元件中的數據,則以ASCⅡ碼的形式存在以.
CoeGenerator是一個元件生成軟件,它給用戶提供了一個通用化的設計界面,提供RAM、ROM、乘法器、各種標準接口等許多設計中常用的元件模型,這樣設計者不必自己動手編寫,而采用CoeGenerator即可生成自己需要的各種元件。這些元件都是經過了最優化設計,占用資源最少,性能最優,還大大節省了設計時間,方便了設計者。產生的ROM元件將存儲在設計工程之中,需要在程序中加入引用語句,才可以使用。 VHDL程序中使用CoreGenerator產生的元件需要加入兩段語句,一是在實體部分對要引用的ROM元件進行說明,二是在結構體中對ROM元件例化,映射例化元件的輸入/輸出信號。 由于FPGA具有在線可再編程性能,因此當系統中FLASH 直接由FPGA存取時,我們可以用FPGA實現對Flash的編程,在編程操作之后,對FPGA 進行再配置,實現其它
系統功能,達到一個FPGA器件實現多種應用的目的。
4 結束語
使用VHDL語言,由FPGA來實現Flash編程器的功能,不僅節約了專用編程器的采購開支,更重要的是可以靈活、快速地實現專用Flash編程器的功能。隨著微電子技術的發展,可編程器件的容量已經達到千萬門級,越來越多的過去必須由專用芯片或器件才能完成的工作現在都可以通過設計軟件,由FPGA來實現了。硬件的軟件化已經成為電子行業中不可阻擋的趨勢。