現(xiàn)場(chǎng)可編程門(mén)陣列FPGA 常常進(jìn)行大數(shù)據(jù)量的處理,數(shù)據(jù)的存儲(chǔ)便成了問(wèn)題,利用SPI Flash 大容量、讀寫(xiě)速度快、成本低廉以及數(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ò)展到所有類(lèi)似系統(tǒng)中[2] 。
1 系統(tǒng)總體方案設(shè)計(jì)
FPGA 芯片采用的Spartan-6 系列的xc6slx9 芯片,封裝采用tqg-144,該系列FPGA 能提供高達(dá)400MHz 的工作時(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)的寫(xiě)保護(hù)機(jī)制,讀取數(shù)據(jù)的最大時(shí)鐘速率為50 MHz。工作的電壓范圍為2.7 V ~3.6 V,具有整體擦除和扇區(qū)擦除、靈活的頁(yè)編程指令和寫(xiě)保護(hù)功能,數(shù)據(jù)保存至少20 y(year),每個(gè)扇區(qū)可承受100 000 次擦寫(xiě)循環(huán)。SPI Flash 具有掉電保存能力,在系統(tǒng)上電時(shí),F(xiàn)PGA 首先從配置芯片SPIFlash 中讀取編程數(shù)據(jù),并對(duì)FPGA 進(jìn)行加載。SPIFlash 的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 中,F(xiàn)PGA 為電路核心,一方面接收來(lái)自PC串口的數(shù)據(jù),并將數(shù)據(jù)寫(xiě)入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)試,也可將。 mc文件程序直接下載到SPI Flash 中進(jìn)行功能驗(yàn)證。
2 FPGA 內(nèi)部模塊設(shè)計(jì)
FPGA 的頂層文件包括七個(gè)模塊,如圖2 所示。
圖2 中,復(fù)位信號(hào)主要是同步外部的復(fù)位信號(hào);DCM 模塊主要是倍頻和管理時(shí)鐘;串口接收模塊把從串口得到的數(shù)據(jù)緩存到FIFO;Flash 控制模塊主要是控制對(duì)外部SPI Flash 的讀寫(xiě),把從串口得到的數(shù)據(jù)存入到SPI Flash,并不斷把SPI Flash 中的數(shù)據(jù)送到串口發(fā)送模塊;CoreRAM 是Xilinx 專(zhuān)用的一個(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 模塊, Flash 模塊將數(shù)據(jù)不斷提取到CoreRAM 中,CoreRAM 中的數(shù)據(jù)經(jīng)過(guò)Flash 模塊寫(xiě)入到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)。
2. 1 串口接收和發(fā)送部分
串口發(fā)送和接收部分相似,串口接收部分是將來(lái)自PC 的串口數(shù)據(jù)發(fā)送到Flash 控制器中,而串口發(fā)送部分是將從Flash 中讀到的數(shù)據(jù)發(fā)送給PC 機(jī),是串口接收的逆向過(guò)程,下面以串口發(fā)送部分為例進(jìn)行分析。串口接收模塊的框圖如圖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 所示。
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ù)和寫(xiě)數(shù)據(jù)工作在不同的頻率上,讀數(shù)據(jù)的操作工作在較高的頻率上,寫(xiě)數(shù)據(jù)的操作工作在較低的頻率上。本FIFO 也把內(nèi)部的其他模塊和跟數(shù)據(jù)的獲得模塊分離,如果要把串口獲得數(shù)據(jù)模塊改為其他方式就可以直接修改這部分即可。
2. 1. 3 寫(xiě)緩沖FIFO
寫(xiě)緩沖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ō)明寫(xiě)緩存FIFO 已經(jīng)有足夠的數(shù)據(jù)用來(lái)寫(xiě),這時(shí)候把FIFO 中的數(shù)據(jù)寫(xiě)到FLASH 中,當(dāng)w_fifo_aempty 信號(hào)為低電平說(shuō)明數(shù)據(jù)即將被讀空,這時(shí)候通過(guò)置w_fifo_re 使能停止向FLASH 寫(xiě)數(shù)據(jù)。每一次這樣的一個(gè)過(guò)程至少寫(xiě)入了突發(fā)數(shù)據(jù)傳輸?shù)臄?shù)據(jù)個(gè)數(shù)。
寫(xiě)緩沖FIFO 的寫(xiě)是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 的寫(xiě)使能置為低電平一個(gè)周期即可以把數(shù)據(jù)寫(xiě)入到FIFO 中。
2. 2 Flash 控制模塊
Flash 正常工作時(shí)必須嚴(yán)格按照Flash 的時(shí)序控制信號(hào),F(xiàn)lash 主控制模塊在兩個(gè)有限狀態(tài)機(jī)的控制下來(lái)進(jìn)行,寫(xiě)Flash 狀態(tài)機(jī)和讀Flash 狀態(tài)機(jī)。
由于Flash 的寫(xiě)操作只能將數(shù)據(jù)1 改寫(xiě)成為0,擦除操作才能將數(shù)據(jù)0 改寫(xiě)為1。所以FPGA 剛上電時(shí),程序首先對(duì)Flash 進(jìn)行擦除操作,將指定區(qū)域全寫(xiě)為1。當(dāng)需要執(zhí)行寫(xiě)Flash 的操作時(shí),應(yīng)該首先把數(shù)據(jù)寫(xiě)到FPGA 內(nèi)部的BlockRAM 中,然后按照Flash Datasheet 中的頁(yè)面編程時(shí)序向Flash 中寫(xiě)入數(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 中,首先拉低/ 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] 。
按照寫(xiě)Flash 的時(shí)序設(shè)計(jì)狀態(tài)機(jī),當(dāng)寫(xiě)使能有效時(shí),狀態(tài)機(jī)由閑置狀態(tài)(idle)進(jìn)入傳輸寫(xiě)使能指令狀態(tài)(tx_cmd),經(jīng)過(guò)寫(xiě)使能指令等待狀態(tài)(wait1)進(jìn)入到傳輸擦除指令狀態(tài)(tx_erase),然后經(jīng)過(guò)傳輸擦除指令等待狀態(tài)(wait2) 后,擦除命令執(zhí)行完畢。接著執(zhí)行寫(xiě)Flash 的操作,首先還是進(jìn)入傳輸寫(xiě)使能指令狀態(tài)(tx_cmd)和寫(xiě)使能等待狀態(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)。寫(xiě)Flash 狀態(tài)機(jī)如圖6 所示。
當(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í)序比較簡(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ù)刂罚╰xadd)狀態(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 所示。
2. 3 BlockRAM 模塊
由于本設(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è)端口都有讀/ 寫(xiě)接口。IP 允許使用者在FPGA 內(nèi)部快速建立優(yōu)化的存儲(chǔ)器資源,本系統(tǒng)采用單端口設(shè)計(jì),在BlockRAM 屬性選擇中將端口A 的寬度選為8,將深度選為256,配置選項(xiàng)選為Read And Write(讀和寫(xiě)),寫(xiě)模式選為Write After Read。當(dāng)向BlockRAM 中寫(xiě)數(shù)據(jù)時(shí),將WEA 和ENA 置位,并輸入地址和數(shù)據(jù)即可;當(dāng)需要從BlockRAM 中讀數(shù)據(jù)時(shí),由于采用了Read And Write 模式,所以只要將地址輸入給BlockRAM,就會(huì)順利的將指定地址的數(shù)據(jù)讀出[6] 。
2. 4 SPI 接口模塊
在此模塊中將設(shè)計(jì)分為三大塊:并行數(shù)據(jù)串行移位,分頻,串行數(shù)據(jù)并行移位。SPI Flash 的工作時(shí)鐘是由外部控制器提供的,本設(shè)計(jì)中主時(shí)鐘為48MHz,取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ù)的寫(xiě)入。
同樣,當(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ù)的讀出。
3 系統(tǒng)仿真結(jié)果與分析
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ì)寫(xiě)Flash 和讀Flash 給出仿真波形圖并進(jìn)行分析。
3. 1 寫(xiě)Flash 仿真與分析
寫(xiě)Flash 仿真波形如圖9 所示。
由圖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é)的寫(xiě)入程中保持高電平狀態(tài),在s_df 的控制下開(kāi)始傳輸數(shù)據(jù),經(jīng)過(guò)8 個(gè)clk 周期SPI Flash 控制器通過(guò)一個(gè)移位寄存器將從s_do 獲取的用戶端數(shù)據(jù)逐位輸出給SPI Flash。
3. 2 讀Flash 仿真與分析
讀Flash 仿真波形如圖10 所示。
由圖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 輸出給用戶。
4 結(jié)語(yǔ)
本文以實(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 芯片,因此具有很高的可兼容性。
評(píng)論