關(guān)珊珊,周潔敏
(南京航空航天大學(xué)民航學(xué)院,南京210016)
現(xiàn)場(chǎng)可編程門陣列FPGA 常常進(jìn)行大數(shù)據(jù)量的處理,數(shù)據(jù)的存儲(chǔ)便成了問(wèn)題,利用SPI Flash 大容量、讀寫速度快、成本低廉以及數(shù)據(jù)在斷電后不丟失的特點(diǎn),可以將配置數(shù)據(jù)存儲(chǔ)于SPI Flash 中[1]。它比起傳統(tǒng)的并行總線接口Flash 來(lái)說(shuō)節(jié)省了很多的I/O 口資源,從而為系統(tǒng)功能的擴(kuò)展提供了更多的可能。為此提出了一種基于FPGA 的SPI Flash 控制器的設(shè)計(jì)方法,并用Verilog HDL 實(shí)現(xiàn),在Isim 中得出仿真和驗(yàn)證結(jié)果,最終應(yīng)用在自行設(shè)計(jì)的VGA顯示控制電路中得到成功應(yīng)用,而且可以擴(kuò)展到所有類似系統(tǒng)中[2]。
FPGA 芯片采用的Spartan-6 系列的xc6slx9 芯片,封裝采用tqg-144,該系列FPGA 能提供高達(dá)400 MHz 的工作時(shí)鐘,高達(dá)5 720 個(gè)高效的雙寄存器6 輸入查找表(LUT)和一系列豐富的內(nèi)置系統(tǒng)級(jí)模塊,采用成熟的45 nm 低功耗銅制程技術(shù)制造,實(shí)現(xiàn)了性價(jià)比與功耗的完美平衡。該芯片有9152 個(gè)邏輯單元(Logic Element),32 個(gè)18 kbyte 的Block RAM 模塊,16 個(gè)18×18 bit 嵌入式乘法器,2 個(gè)鎖相環(huán)(PLL)和4個(gè)時(shí)鐘管理模塊(DCM)。在這款144 針tqg 封裝的FPGA 中,用戶可用I/O 為102 個(gè)[3],可以滿足本系統(tǒng)的需求。
Flash 芯片采用的配置芯片是Winbond 公司的W25Q80BV 系列8 M bit 容量的SPI Flash,該芯片共由16 部分組成,每一部分有256 頁(yè),每頁(yè)有256 個(gè)字節(jié)。該系列芯片具有先進(jìn)的寫保護(hù)機(jī)制,讀取數(shù)據(jù)的最大時(shí)鐘速率為50 MHz。工作的電壓范圍為2.7 V ~3.6 V,具有整體擦除和扇區(qū)擦除、靈活的頁(yè)編程指令和寫保護(hù)功能,數(shù)據(jù)保存至少20 y(year),每個(gè)扇區(qū)可承受100 000 次擦寫循環(huán)。SPI Flash 具有掉電保存能力,在系統(tǒng)上電時(shí),F(xiàn)PGA 首先從配置芯片SPI Flash 中讀取編程數(shù)據(jù),并對(duì)FPGA 進(jìn)行加載。SPI Flash 的HOLD#和WP#管腳要接上拉電阻,因?yàn)镕PGA 上電時(shí)管腳為高阻態(tài),如無(wú)此上拉電阻,F(xiàn)LASH 的HOLD#和WP#輸入為浮置狀態(tài),沒(méi)有確定的電平,進(jìn)而導(dǎo)致數(shù)據(jù)總線電平也不確定,這是不允許的。
本系統(tǒng)由串口、FPGA 和SPI Flash 構(gòu)成,系統(tǒng)整體框圖如圖1 所示。
圖1 系統(tǒng)框圖
圖1中,F(xiàn)PGA 為電路核心,一方面接收來(lái)自PC 串口的數(shù)據(jù),并將數(shù)據(jù)寫入Flash 中;一方面從Flash 中讀出數(shù)據(jù);另一方面產(chǎn)生系統(tǒng)所需的各種控制信號(hào)。作為現(xiàn)場(chǎng)可編程器件,F(xiàn)PGA 能方便地?zé)氤绦騺?lái)改變它的功能,所以在設(shè)計(jì)調(diào)試時(shí),可將.bit 文件燒入FPGA 進(jìn)行在線調(diào)試,也可將.mcs 文件程序直接下載到SPI Flash 中進(jìn)行功能驗(yàn)證。
FPGA 的頂層文件包括七個(gè)模塊,如圖2 所示。
圖2 FPGA 內(nèi)部構(gòu)成框圖
圖2 中,復(fù)位信號(hào)主要是同步外部的復(fù)位信號(hào);DCM 模塊主要是倍頻和管理時(shí)鐘;串口接收模塊把從串口得到的數(shù)據(jù)緩存到FIFO;Flash 控制模塊主要是控制對(duì)外部SPI Flash 的讀寫,把從串口得到的數(shù)據(jù)存入到SPI Flash,并不斷把SPI Flash 中的數(shù)據(jù)送到串口發(fā)送模塊;CoreRAM 是Xilinx 專用的一個(gè)IP 核,本設(shè)計(jì)中用于FPGA 內(nèi)部數(shù)據(jù)的緩存;SPI 接口模塊為SPI Flash 提供串行時(shí)鐘,并實(shí)現(xiàn)數(shù)據(jù)的串并轉(zhuǎn)換。當(dāng)上層用戶發(fā)送指令要將FPGA 的配置數(shù)據(jù)存入SPI Flash 時(shí),配置數(shù)據(jù)從串口接收模塊輸出給Flash 模塊,F(xiàn)lash 模塊將數(shù)據(jù)不斷提取到CoreRAM 中,CoreRAM 中的數(shù)據(jù)經(jīng)過(guò)Flash 模塊寫入到SPI Flash 中。當(dāng)系統(tǒng)重新上電要對(duì)FPGA 進(jìn)行配置時(shí),將SPI Flash 中的數(shù)據(jù)讀入到Flash 模塊中,再將Flash 模塊中數(shù)據(jù)緩存在CoreRAM 中,最后將CoreRAM 中的數(shù)據(jù)提取給上層相應(yīng)的模塊,完成對(duì)FPGA 的配置。
從以上分析可以知道,F(xiàn)PGA 內(nèi)部的數(shù)據(jù)流向非常的明朗,模塊之間的關(guān)系也很確切,所以這個(gè)框圖的劃分具有一定的科學(xué)性。如果總體的框圖沒(méi)有劃分好,調(diào)試成功的可能性也是非常小的。另外,在升級(jí)的時(shí)候如果要改變數(shù)據(jù)的獲得方式,只要用新的程序替換串口接收模塊即可;如果要改變數(shù)據(jù)的顯示方式,只要用新的程序替換串口發(fā)送模塊即可。下面分別介紹各功能模塊的實(shí)現(xiàn)。
串口發(fā)送和接收部分相似,串口接收部分是將來(lái)自PC 的串口數(shù)據(jù)發(fā)送到Flash 控制器中,而串口發(fā)送部分是將從Flash 中讀到的數(shù)據(jù)發(fā)送給PC 機(jī),是串口接收的逆向過(guò)程,下面以串口發(fā)送部分為例進(jìn)行分析。串口接收模塊的框圖如圖3 所示。
圖3 串口接收部分框圖
圖3 中包含3 個(gè)子模塊,串口接收模塊接收來(lái)自PC 串口的數(shù)據(jù),為了使速度盡可能的快,設(shè)計(jì)用的波特率為115 200 bit/s;緩存接口主要是把串口接收到的數(shù)據(jù)緩存到FIFO;FIFO 是例化的一個(gè)模塊,用作數(shù)據(jù)緩存。
2.1.1 串口接收
串口接收程序按照UART 的傳輸原理進(jìn)行程序設(shè)計(jì),本設(shè)計(jì)省略了奇偶校驗(yàn)部分,是按照10 bit 的串口傳輸方式設(shè)計(jì)的。串口程序的核心是一個(gè)接收狀態(tài)機(jī),另外還包括接收同步、采樣時(shí)能生成和標(biāo)志位控制模塊。工作原理是來(lái)自串口的信號(hào)經(jīng)兩級(jí)寄存器同步后不斷被采樣,采樣后的信號(hào)到接收狀態(tài)機(jī)控制獲得串口數(shù)據(jù),如果接收完數(shù)據(jù),把接收到數(shù)據(jù)的標(biāo)志位置高告訴相關(guān)模塊已經(jīng)接收到新數(shù)據(jù),標(biāo)志位在標(biāo)志清零輸入置高后被清零,這時(shí)候標(biāo)志位再次置高說(shuō)明接收到下一個(gè)的數(shù)據(jù)。標(biāo)志位清零的控制要注意清零位的置高周期數(shù),最好為一個(gè)周期,不能無(wú)限制地永遠(yuǎn)置高。串口接收模塊的核心狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換圖如圖4 所示。
圖4 串口接收狀態(tài)轉(zhuǎn)移圖
idle:閑置狀態(tài)每個(gè)時(shí)鐘周期都采樣接收同步信號(hào)的值,一旦該信號(hào)的值為0 則轉(zhuǎn)入到下一個(gè)狀態(tài)。
first:準(zhǔn)備接收狀態(tài)采樣串口接收的起始位,在波特率的16 倍時(shí)鐘下采樣,如果6、7、8 次采樣中有兩次為低電平說(shuō)明是起始位,轉(zhuǎn)入到下一個(gè)狀態(tài)(rxd),否則認(rèn)為該信號(hào)是干擾信號(hào)而轉(zhuǎn)入閑置狀態(tài)(idle)。
rxd:接收狀態(tài)把數(shù)據(jù)接收到并存入暫存寄存器,并產(chǎn)生標(biāo)志位的原始信號(hào),接收結(jié)束是根據(jù)暫存寄存器的最低位來(lái)判斷結(jié)束的,同時(shí)在結(jié)束的時(shí)候判斷結(jié)束位是否為0,如果不為0,則拋棄接收到的數(shù)據(jù)后轉(zhuǎn)入到閑置狀態(tài)。
2.1.2 緩存接口
緩存接收模塊是一個(gè)相對(duì)簡(jiǎn)單的模塊,它主要是把串口接收模塊接收到的數(shù)據(jù)存入到FIFO,由于串口接收的是8 bit 的數(shù)據(jù),F(xiàn)IFO 的寬度是16 bit,因此每次接收2 bit 數(shù)據(jù)再存入FIFO。緩存接口模塊包含一個(gè)控制狀態(tài)機(jī),工作原理是一旦檢測(cè)到串口接收模塊的標(biāo)志位為高時(shí)就接收1 字節(jié)的數(shù)據(jù),并轉(zhuǎn)到接收下1 字節(jié)狀態(tài),這個(gè)狀態(tài)接收到第二個(gè)數(shù)據(jù),并把整個(gè)16 bit 的數(shù)據(jù)存入到FIFO,每次接收1 字節(jié)數(shù)據(jù)后都把清零標(biāo)志位置高清除串口接收模塊的標(biāo)志位。
FIFO 是在開(kāi)發(fā)軟件中例化的一個(gè)模塊,為保持較高的速度,剛好用了一個(gè)M4K 塊,數(shù)據(jù)的寬度為16 bit,數(shù)據(jù)的存儲(chǔ)深度是256 個(gè)。本FIFO 讀數(shù)據(jù)和寫數(shù)據(jù)工作在不同的頻率上,讀數(shù)據(jù)的操作工作在較高的頻率上,寫數(shù)據(jù)的操作工作在較低的頻率上。本FIFO 也把內(nèi)部的其他模塊和跟數(shù)據(jù)的獲得模塊分離,如果要把串口獲得數(shù)據(jù)模塊改為其他方式就可以直接修改這部分即可。
2.1.3 寫緩沖FIFO
寫緩沖FIFO 指的是串口數(shù)據(jù)的暫存FIFO,在FLASH 主控制模塊中將用到的信號(hào)是這個(gè)FIFO 的“近空”信號(hào)(w_fifo_aempty)。在每行顯示開(kāi)始的時(shí)候都要檢測(cè)這個(gè)信號(hào),如果w_fifo_aempty 信號(hào)為高電平,說(shuō)明寫緩存FIFO 已經(jīng)有足夠的數(shù)據(jù)用來(lái)寫,這時(shí)候把FIFO 中的數(shù)據(jù)寫到FLASH 中,當(dāng)w_fifo_aempty 信號(hào)為低電平說(shuō)明數(shù)據(jù)即將被讀空,這時(shí)候通過(guò)置w_fifo_re 使能停止向FLASH 寫數(shù)據(jù)。每一次這樣的一個(gè)過(guò)程至少寫入了突發(fā)數(shù)據(jù)傳輸?shù)臄?shù)據(jù)個(gè)數(shù)。
寫緩沖FIFO 的寫是uart_inf 這個(gè)模塊來(lái)控制的,只有在uart_rxd 接受完兩個(gè)字節(jié)的數(shù)據(jù)后把這個(gè)數(shù)據(jù)合成一個(gè)16 bit 的數(shù)據(jù)存入到FIFO,準(zhǔn)備好數(shù)據(jù)的同時(shí)把FIFO 的寫使能置為低電平一個(gè)周期即可以把數(shù)據(jù)寫入到FIFO 中。
Flash 正常工作時(shí)必須嚴(yán)格按照Flash 的時(shí)序控制信號(hào),F(xiàn)lash 主控制模塊在兩個(gè)有限狀態(tài)機(jī)的控制下來(lái)進(jìn)行,寫Flash 狀態(tài)機(jī)和讀Flash 狀態(tài)機(jī)。
由于Flash 的寫操作只能將數(shù)據(jù)1 改寫成為0,擦除操作才能將數(shù)據(jù)0 改寫為1。所以FPGA 剛上電時(shí),程序首先對(duì)Flash 進(jìn)行擦除操作,將指定區(qū)域全寫為1。當(dāng)需要執(zhí)行寫Flash 的操作時(shí),應(yīng)該首先把數(shù)據(jù)寫到FPGA 內(nèi)部的BlockRAM 中,然后按照Flash Datasheet 中的頁(yè)面編程時(shí)序向Flash 中寫入數(shù)據(jù)。Xilinx 公司為用戶提供了功能豐富的IP 核,設(shè)計(jì)中需要的BlockRAM 模塊可直接在ISE 中調(diào)用IP 核,F(xiàn)lash 主控制模塊可以控制存取BlockRAM 的地址和時(shí)間,并且按照Flash 的頁(yè)編程時(shí)序,將并行數(shù)據(jù)通過(guò)SPI 接口模塊轉(zhuǎn)換為串行數(shù)據(jù)后送入到Flash 中。W25Q80BV 的頁(yè)面編程指令的時(shí)序圖如圖5 所示。
圖5 W25Q80BV 頁(yè)面編程指令時(shí)序圖
圖5 中,首先拉低/CS(片選信號(hào)),第1 個(gè)時(shí)鐘上升沿將頁(yè)面編程指令02H 送入Flash 內(nèi),然后輸入3 個(gè)字節(jié)的首地址,緊接著輸入編程數(shù)據(jù)。頁(yè)面編程一次最多可以輸入256 個(gè)字節(jié)的數(shù)據(jù),若超出256 個(gè)字節(jié),則僅保留最后輸入的256 個(gè)字節(jié)的數(shù)據(jù)。如果輸入低8 bit 不全為零的地址,從輸入的地址進(jìn)行編程,一直編程到該頁(yè)的最后,接著從該頁(yè)的起始地址進(jìn)行編程。同樣,輸入完數(shù)據(jù)后片選信號(hào)也必須拉高,否則頁(yè)面編程指令不被執(zhí)行[4]。
按照寫Flash 的時(shí)序設(shè)計(jì)狀態(tài)機(jī),當(dāng)寫使能有效時(shí),狀態(tài)機(jī)由閑置狀態(tài)(idle)進(jìn)入傳輸寫使能指令狀態(tài)(tx_cmd),經(jīng)過(guò)寫使能指令等待狀態(tài)(wait1)進(jìn)入到傳輸擦除指令狀態(tài)(tx_erase),然后經(jīng)過(guò)傳輸擦除指令等待狀態(tài)(wait2)后,擦除命令執(zhí)行完畢。接著執(zhí)行寫Flash 的操作,首先還是進(jìn)入傳輸寫使能指令狀態(tài)(tx_cmd)和寫使能等待狀態(tài),然后進(jìn)入傳輸頁(yè)面編程指令狀態(tài)(tx_pro),經(jīng)過(guò)三個(gè)字節(jié)的傳輸?shù)刂窢顟B(tài)(txadd)進(jìn)入到傳輸數(shù)據(jù)狀態(tài)(txdata),輸入完256 個(gè)字節(jié)的數(shù)據(jù)后,進(jìn)入到清除指令(clr_cmd)狀態(tài),最后恢復(fù)到閑置(idle)狀態(tài)。寫Flash 狀態(tài)機(jī)如圖6 所示。
圖6 寫Flash 狀態(tài)機(jī)
當(dāng)需要執(zhí)行讀Flash 的操作時(shí),應(yīng)該首先按照Flash 的讀數(shù)據(jù)指令時(shí)序?qū)⒋袛?shù)據(jù)轉(zhuǎn)化為并行數(shù)據(jù)讀入FPGA 的BlockRAM 中,然后從BlockRAM 中將數(shù)據(jù)讀入到上層用戶。W25Q80BV 的讀數(shù)據(jù)指令的時(shí)序圖如圖7 所示。
圖7 W25Q80BV 的讀數(shù)據(jù)指令時(shí)序圖
由圖7 可以看出,W25Q80BV 的讀數(shù)據(jù)指令時(shí)序比較簡(jiǎn)單,在/CS(片選信號(hào))信號(hào)拉低以后的時(shí)鐘第一個(gè)上升沿,按照高位在前低位在后的順序?qū)⒆x數(shù)據(jù)指令03H 送到Flash 中,接著將所需讀取內(nèi)容的3 個(gè)字節(jié)的首地址送入Flash,在輸入完畢后的第一個(gè)時(shí)鐘下降沿,該首地址所指向的8 bit 數(shù)據(jù)便會(huì)按照從高位到低位的順序輸出。輸出完畢后,地址會(huì)自動(dòng)遞增,然后指向下一個(gè)地址。接著輸出下一個(gè)地址所指向的數(shù)據(jù),并且當(dāng)?shù)刂返竭_(dá)最高位后將會(huì)自動(dòng)轉(zhuǎn)回到首地址000000h,按照上述操作循環(huán)執(zhí)行,就可讀出Flash 中所有的內(nèi)容,一直到拉高/CS 片選信號(hào)為止[5]。
按照讀Flash 的時(shí)序設(shè)計(jì)狀態(tài)機(jī),F(xiàn)lash 中的數(shù)據(jù)只要按照讀時(shí)序要求就可以順利讀入FPGA 中進(jìn)行運(yùn)算。狀態(tài)機(jī)由閑置狀態(tài)(idle)進(jìn)入傳輸讀數(shù)據(jù)指令狀態(tài)(tx_cmd),讀數(shù)據(jù)指令同樣需要3 個(gè)字節(jié)的地址數(shù)據(jù)來(lái)指定讀取據(jù)存儲(chǔ)空間的起始地址,當(dāng)芯片被選中時(shí),就可以一直不斷地從SPI Flash 中讀取數(shù)據(jù)。接著SPI Flash 控制器經(jīng)過(guò)傳輸?shù)刂?txadd)狀態(tài)進(jìn)入到讀數(shù)據(jù)(rxdata)狀態(tài),如果還有未傳輸完的數(shù)據(jù)(即byte_count 未計(jì)數(shù)到256),SPI Flash 控制器則繼續(xù)留在讀數(shù)據(jù)狀態(tài),直到所需讀取的數(shù)據(jù)都傳輸完后,再進(jìn)入到清除指令(clr_cmd)狀態(tài),最后恢復(fù)到閑置(idle)狀態(tài)。讀Flash 狀態(tài)機(jī)如圖8 所示。
圖8 讀Flash 狀態(tài)轉(zhuǎn)移圖
由于本設(shè)計(jì)選用的Flash 容量較大,一般FPGA 沒(méi)有這么大的存儲(chǔ)空間,所以FPGA 中需要調(diào)用數(shù)據(jù)緩沖存儲(chǔ)器BlockRAM。它是由Xilinx 提供的IPCore,設(shè)計(jì)比較方便,而且靈活、高效、不容易出錯(cuò)。BlockRAM有兩個(gè)完全獨(dú)立的端口科技進(jìn)入共享的存儲(chǔ)空間,兩個(gè)端口都有讀/寫接口。IP 允許使用者在FPGA 內(nèi)部快速建立優(yōu)化的存儲(chǔ)器資源,本系統(tǒng)采用單端口設(shè)計(jì),在BlockRAM 屬性選擇中將端口A 的寬度選為8,將深度選為256,配置選項(xiàng)選為Read And Write(讀和寫),寫模式選為Write After Read。當(dāng)向BlockRAM 中寫數(shù)據(jù)時(shí),將WEA 和ENA 置位,并輸入地址和數(shù)據(jù)即可;當(dāng)需要從BlockRAM 中讀數(shù)據(jù)時(shí),由于采用了Read And Write 模式,所以只要將地址輸入給BlockRAM,就會(huì)順利的將指定地址的數(shù)據(jù)讀出[6]。
在此模塊中將設(shè)計(jì)分為三大塊:并行數(shù)據(jù)串行移位,分頻,串行數(shù)據(jù)并行移位。SPI Flash 的工作時(shí)鐘是由外部控制器提供的,本設(shè)計(jì)中主時(shí)鐘為48 MHz,取4 點(diǎn)進(jìn)行采樣,每到一個(gè)采集點(diǎn),時(shí)鐘翻轉(zhuǎn)一次,完成分頻,分頻得到的時(shí)鐘1 MHz 作為SPI Flash 的時(shí)鐘輸入。
由從Flash 控制器中得到的數(shù)據(jù)為并行數(shù)據(jù),但SPI Flash 為串行接口,所以SPI 接口模塊主要功能是將FPGA 發(fā)送的并行數(shù)據(jù)轉(zhuǎn)化為串行數(shù)據(jù)輸出給SPI Flash,系統(tǒng)由閑置狀態(tài)進(jìn)入并行數(shù)據(jù)串行移位狀態(tài),啟動(dòng)延時(shí)模塊,s_do 的值要保持48×8 個(gè)系統(tǒng)周期才能使得mosi 在一個(gè)SPI 周期輸出1 bit 數(shù)據(jù),同時(shí)移位寄存器左移1 bit,將最高位賦給mosi 輸出,如此反復(fù)直到輸出8 bit 數(shù)據(jù),為滿足SPI Flash 的響應(yīng)時(shí)間,系統(tǒng)增加傳輸?shù)却隣顟B(tài),經(jīng)過(guò)傳輸?shù)却隣顟B(tài)又回到閑置狀態(tài),完成了一個(gè)字節(jié)數(shù)據(jù)的寫入。
同樣,當(dāng)需要讀SPI Flash 中的數(shù)據(jù)時(shí),將SPI Flash 中的串行數(shù)據(jù)轉(zhuǎn)化為并行數(shù)據(jù)送入FPGA 中,系統(tǒng)由閑置狀態(tài)進(jìn)入串行數(shù)據(jù)并行移位狀態(tài),在此狀態(tài)啟動(dòng)延時(shí)模塊,SPI Flash 輸出1 bit 數(shù)據(jù)需要48個(gè)系統(tǒng)周期,輸出8 bit 數(shù)據(jù)就要48×8 個(gè)系統(tǒng)周期,即s_di 要保持48×8 個(gè)系統(tǒng)周期,首先將miso 的值賦給s_di[0],將s_di 左移一位,當(dāng)延時(shí)48 個(gè)周期后,反復(fù)上述操作,直到將8 bit miso 數(shù)據(jù)都輸出給s_di,經(jīng)過(guò)傳輸?shù)却隣顟B(tài)回到閑置狀態(tài),完成了一個(gè)字節(jié)數(shù)據(jù)的讀出。
SPI Flash 控制器在Xilinx ISE12.2 編程環(huán)境下實(shí)現(xiàn),結(jié)合自帶的仿真軟件Isim 進(jìn)行仿真。板上調(diào)試時(shí)鐘選為48 MHz,經(jīng)測(cè)試數(shù)據(jù)傳輸準(zhǔn)確無(wú)誤。由于篇幅有限,本文僅對(duì)寫Flash 和讀Flash 給出仿真波形圖并進(jìn)行分析。
寫Flash 仿真波形如圖9 所示。
圖9 寫Flash 仿真波形
由圖9 可以看出,當(dāng)SPI Flash 控制器進(jìn)入到傳輸數(shù)據(jù)(tx_data)狀態(tài),這時(shí)s_wr 變高(s_wr 在傳輸指令及數(shù)據(jù)地址時(shí)也保持為高電平狀態(tài)),并在整個(gè)字節(jié)的寫入程中保持高電平狀態(tài),在s_df 的控制下開(kāi)始傳輸數(shù)據(jù),經(jīng)過(guò)8 個(gè)clk 周期SPI Flash 控制器通過(guò)一個(gè)移位寄存器將從s_do 獲取的用戶端數(shù)據(jù)逐位輸出給SPI Flash。
讀Flash 仿真波形如圖10 所示。
圖10 讀Flash 仿真波形
由圖10 可以看出,當(dāng)SPI Flash 控制器進(jìn)入到讀數(shù)據(jù)(rxdata)狀態(tài)時(shí),spi_rd 變高,并在整個(gè)字節(jié)的讀數(shù)據(jù)過(guò)程中保持高電平狀態(tài),經(jīng)過(guò)8 個(gè)clk 周期SPI Flash 控制器通過(guò)一個(gè)移位寄存器將從SPI Flash 中讀取得的1 字節(jié)數(shù)據(jù)寄存起來(lái),最后在通過(guò)s_di 輸出給用戶。
本文以實(shí)際應(yīng)用為出發(fā)點(diǎn),實(shí)現(xiàn)了一個(gè)基于FPGA 的SPI Flash 控制器,并重點(diǎn)分析了其工作狀態(tài)轉(zhuǎn)換過(guò)程。該控制器能夠很好地實(shí)現(xiàn)對(duì)FPGA 芯片進(jìn)行在線配置,具有廣泛的應(yīng)用價(jià)值。該方法具有較高的可移植性,以及簡(jiǎn)單方便的用戶接口,并且控制器經(jīng)過(guò)簡(jiǎn)單的修改就可以用于控制其它型號(hào)的SPI Flash 芯片,因此具有很高的可兼容性。
[1] 鄭川.Step By Step 現(xiàn)場(chǎng)可編程門陣列設(shè)計(jì)入門與進(jìn)階[M].西安:西安電子科技大學(xué)出版社,2008:104-122.
[2] 王小峰,周吉鵬. 一種FPGA 在線配置FLASH 的方法[J]. 電子器件,2006,29(3):902-904.
[3] 張力為,鐘慧敏.實(shí)現(xiàn)基于FPGA 的SPI Flash 控制器設(shè)計(jì)[J].微計(jì)算機(jī)信息,2010,26(6-2):124-126.
[4] 韋燕.基于FPGA 的SPI 接口時(shí)序模擬[J]. 科技信息,2010,21:79-80.
[5] Winbond,Inc.8M-BIT SERIAL FLASH MEMORY WITH DUAL AND QUAD SPI. http://www. Winbond. com/NR/rdonlyres/4D2BF674-7427-4FC8-AEF-1A534DF74F16/0/W25Q80BV.pdf.2009.
[6] Xilinx,Inc.Spartan-6 FPGA Datasheet:DC and Switching Characteristics. http://china. xilinx. com/support/documentation/data_sheets/ds162.pdf.2011.