本文提出一個基于FPGA的SPI Flash讀寫硬件實現方案,該方案利用硬件對SPI Flash進行控制,能夠非常方便地完成Flash的讀寫、擦除、刷新及預充電等操作,同時編寫的SPI Flash控制器IP核能夠進行移植和復用,作為SOC芯片的功能模塊。SPI Flash控制器采用VHDL語言進行編寫,在Modelsim 6.5g上通過功能仿真,并且在XUPV5-LX110TFPGA開發(fā)板上通過硬件測試,實現結果表明方案的可行性。
1.引言
Flash是一種具有電可擦除的可編程ROM,按接口可以分為兩大類:并行Flash和串行 Flash.并行Flash存儲量大,速度快;而串行Flash存儲量相對較小,但體積小,連線簡單,可減小電路面積,節(jié)約成本。SPI Flash是內嵌SPI總線接口的串行Flash,它比起傳統的并行總線接口Flash,節(jié)省了很多的I/O口資源,從而為系統功能的擴展提供了更多的可能。
隨著SPI Flash越來越多地應用到各種領域,其傳統讀寫方式中讀寫速度不夠快、占用CPU資源以及操作不夠簡便靈活的缺點表現得更為突出,如何解決以上問題成為大家關注的焦點。利用硬件對SPI Flash進行控制,能夠非常方便地完成Flash的讀寫、擦除、刷新及預充電等操作,且不占用CPU資源,同時編寫的SPI Flash控制器IP核能夠進行移植和復用,作為SOC芯片的功能模塊。因此提出了一種基于FPGA的SPI Flash控制器的設計方案,并用VHDL實現。編寫的SPI Flash控制器IP核在Modelsim 6.5g上進行了功能仿真,在FPGA開發(fā)板上進行了測試驗證,可作為功能模塊應用于SOC芯片設計。
2.SPI Flash控制器設計
2.1 SPI Flash芯片選擇
本方案SPI Flash芯片采用GigaDevice公司的GD25Q系列,GD25Q系列SPI Flash包括4Mbit的GD25Q40,2M bit的GD25Q20,1M bit的GD25Q10以及521K bit的GD25Q512,這里將采用512K bit的GD25Q512.圖1為GD25Q系列SPIFlash(SOP8封裝)引腳排列圖。其中VCC和VSS分別為電源和地,其他6個引腳均可直接與F P G A的I / O引腳相連;寫保護引腳W P #和HOLD#掛起引腳用于數據保護和空閑模式的低功耗運行,若不使用可將其置為高電平;CS#為片選信號,低電平時表示器件被選中,反之工作在待機狀態(tài);SO為串行數據輸出,數據在時鐘的下降沿輸出到Flash器件;SI為串行數據輸入,包括傳輸指令、地址和輸入數據,輸入信號在時鐘的上升沿鎖存到 Flash器件中。SCLK為串行時鐘,由FPGA提供。
2.2 SPI Flash指令操作
GDQ25系列SPI Flash指令較多,所有指令都是8位,操作時先將片選信號CS#拉低選中器件,然后輸入8位操作指令字節(jié),串行數據在片選信號CS#拉低后的第一個時鐘的上升沿被采樣,SPI Flash啟動內部控制邏輯,自動完成相應操作。有些操作在輸入指令后需要輸入地址字節(jié)和偽字節(jié),最后操作完成后再將片選信號拉高。
2.3 SPI Flash控制器設計原理
SPI Flash控制器必須能夠產生SPI Flash芯片執(zhí)行各操作(如寫使能、刷新、預充電、讀芯片ID、讀取狀態(tài)寄存器、寫狀態(tài)寄存器、扇區(qū)擦除、塊擦除、整體擦除、讀取數據、快速讀取數據、頁面編程)時所需指令時序,用戶只需要輸入對應操作的8位指令值及對應的操作地址值,SPI接口與SPI Flash的數據傳輸將由SPI Flash控制器內部狀態(tài)機控制執(zhí)行。
3.SPI Flash控制器實現
3.1 SPI Flash測試系統
本文設計的SPI Flash測試系統由用戶端、FPGA和SPI Flash構成,系統框圖如圖2所示,其中FPGA選用Xilinx公司Virtex5系列芯片(Virtex-5 XC5VLX110T),SPI Flash芯片采用GigaDevice公司的GD25Q系列512K bit容量的GD25Q512.
SPI Flash控制器由VHDL編寫,主要為SPIFlash芯片提供串行時鐘,將從用戶端輸入的數據(包括指令字節(jié)、地址字節(jié)和數據字節(jié))寄存起來并在串行時鐘的控制下通過spi_dout信號線逐位輸出到SPI Flash芯片中,同樣將從SPI Flash芯片中讀出的串行數據轉換成并行數據送給用戶端。此外,SPI Flash控制器還必須在用戶通過sel、addr以及wr組合發(fā)出的操作命令下產生一系列的控制信號,并在這些控制信號的作用下根據狀態(tài)機的轉換方向進行動作并且輸出相應的結果。
3.2 SPI Flash控制器控制狀態(tài)機
由于SPI Flash操作命令較多,并且很多操作命令之間存在相同的操作步驟,所以利用狀態(tài)機進行控制能夠準確有條理地完成對SPI Flash的操作。分析GDQ25系列SPI Flashdatasheet,可將SPI Flash控制器的工作狀態(tài)劃分為空閑狀態(tài)(IDLE)、傳輸指令狀態(tài)(TxCMD)、傳輸高字節(jié)地址狀態(tài)(TxADD_H)、傳輸中間字節(jié)地址狀態(tài)(TxADD_M)、傳輸低字節(jié)地址狀態(tài)(TxADD_L)、傳輸偽字節(jié)狀態(tài)(TxDummy)、傳輸數據狀態(tài)(TxDATA)和接收數據狀態(tài)(RxDATA)。除此以外,由于所有接收到的指令值都寄存在指令寄存器內,當一條指令執(zhí)行完畢時需要將指令寄存器清空,以便接收下一條用戶指令,所以設定一個清除指令狀態(tài)(CLR_CMD)作為每一操作完成后的收尾狀態(tài)。當狀態(tài)機進入CLR_CMD狀態(tài)后,表示當前操作已經完成,正將指令寄存器指令值清空;當狀態(tài)機進入IDLE狀態(tài)時,用戶可輸入下一操作指令,對SPI Flash進行下一操作??紤]到SPI Flash的響應時間,在以上工作狀態(tài)中間插入了一些等待狀態(tài)(WAIT)。
4.SPI Flash控制器驗證
SPI Flash控制器IP核在Modelsim 6.5g上能夠通過功能仿真,下面分析一下SPI Flash頁面編程操作及數據讀取操作的功能仿真。
4.1 頁面編程操作
頁面編程操作仿真波形如圖3所示,圖中截取輸入00H和01H數據的波形,最多可連續(xù)輸入一頁 256字節(jié)數據。當用戶輸入頁面編程指令02H,狀態(tài)機進入txcmd狀態(tài),頁編程指令02H通過spi_dout傳輸給SPI Flash.當tx_bit_cnt計數到8時,指令傳輸完畢,狀態(tài)機在等待后進入txadd_h狀態(tài),同時tx_bit_cnt被清零,需寫入數據的對應存儲空間的起始地址高字節(jié)值89H被傳輸。當tx_bit_cnt計數到8時,高字節(jié)地址值89H被傳輸完畢,狀態(tài)機在等待后進入txadd_m狀態(tài),同時tx_bit_cnt被清零,同上,地址中間字節(jié)67H和45H被傳輸。當add_h、add_m和add_l寄存器的值依次傳輸完畢,狀態(tài)機進入 wait6狀態(tài),等待用戶輸入需寫入SPI Flash的數據。當用戶設定{sel,addr,wr}為10001b,狀態(tài)機進入txdata狀態(tài),同時tx_new_data被置高,表示要傳輸新寫入的數據。在txdata狀態(tài)下,控制器將傳輸寫入的第1字節(jié)數據00H,當tx_bit_cnt計數到8時,第1字節(jié)數據00H被傳輸完畢,tx_new_data被拉低,tx_empty被拉高,表示當前沒有可傳輸的數據,狀態(tài)機進入wait6狀態(tài),等待新數據寫入。直到用戶再次設定 {sel,addr,wr}為10001b,狀態(tài)機再次進入txdata狀態(tài),同時tx_new_data被置高,表示寫入的第2字節(jié)數據01H將要傳輸。當tx_bit_cnt計數到8,第2字節(jié)數據傳輸完畢,tx_new_data被拉低,tx_empty被拉高,狀態(tài)機進入wait6狀態(tài)。由于 GDQ25系列SPI Flash頁面編程一次最多可寫入256字節(jié)數據,所以用戶在寫入數據時,應注意最多寫入256次數據,否則超過的數據將覆蓋開始的數據。當狀態(tài)機處于 wait6狀態(tài)而用戶想結束頁面編程時,可向控制器輸入NOP指令強制結束當前頁面編程操作。狀態(tài)機在接收到NOP指令后將進入clr_cmd狀態(tài)和 idle空閑態(tài),等待下一條指令的到來。當頁面編程操作還沒結束時,busy將一直被置高。
4.2 數據讀取操作
讀數據指令仿真波形如圖4所示。當用戶輸入讀數據指令03H,狀態(tài)機進入txcmd狀態(tài),讀數據指令通過spi_dout傳輸給SPI Flash。
當tx_bit_cnt計數到8時,指令傳輸完畢,狀態(tài)機等待后進入txadd_h狀態(tài),傳輸要讀出數據所在存儲空間起始地址的高字節(jié),同時tx_bit_cnt清零,以為下一個傳輸作準備。地址高字節(jié)寄存器add_h數值56H通過spi_dout 傳輸給SPI Flash,當tx_bit_cnt計數到8時,狀態(tài)機進入txadd_m狀態(tài),傳輸地址中間字節(jié),同理,控制器在狀態(tài)txadd_m和狀態(tài) txadd_l狀態(tài)下完成傳輸地址中間字節(jié)34H和地址低字節(jié)12H.當24位地址傳輸完畢,狀態(tài)機在等待后進入rxdata狀態(tài),接收從spi_din 輸入的第一字節(jié)數據01H.當rx_bit_cnt計數到8時,控制器完成第1字節(jié)數據的接收,rx_data顯示為01H,狀態(tài)機狀態(tài)轉換為wait8 狀態(tài),等待用戶設定{sel,addr,wr}以接收第2字節(jié)。當用戶設定{sel,addr,wr}為10000b時,狀態(tài)機再次進入rxdata狀態(tài),接收從spi_din輸入的第2字節(jié)數據02H,同時rx_ready被拉低,rx_empty被拉高,rd_data被拉高,表示將要讀出新輸入的數據。當rx_bit_cnt計數到8時,第2字節(jié)數據接收完畢,rx_ready被拉高,rx_empty為低,rd_data顯示新接收的字節(jié)數據 02H,狀態(tài)機經等待后重新進入wait8狀態(tài),等待用戶再次設定{sel,addr,wr}值,接收第3字節(jié)數據值,同理,可讀出SPI Flash內部所有數據。
當狀態(tài)機處于wait8狀態(tài)而用戶想退出讀數據操作時,可向控制器輸入NOP指令強制結束當前讀數據操作。狀態(tài)機在接收到NOP指令后將進入clr_cmd狀態(tài)和idle空閑態(tài),等待下一條指令的到來。當讀數據操作還沒結束時,busy將一直置高。
5.結語
目前SPI Flash控制器IP核已經在XUPV5-LX110T FPGA開發(fā)板上通過硬件測試,并且將作為功能模塊應用于SOC芯片設計。實踐證明,基于FPGA的SPI Flash控制器能夠簡化SPI Flash讀寫操作流程,從而提高SPI Flash的讀寫速度,而操作時不占用CPU資源的特點,將使SPIFlash的讀寫更有優(yōu)勢。
評論
查看更多