【正文】
動(dòng)翻頁(yè),這就需要重新寫(xiě)入指令和地址,此時(shí)有狀態(tài)機(jī)控制狀態(tài)轉(zhuǎn)移,使數(shù)據(jù)移位寄存器暫時(shí)暫停工作,由另外的移位寄存器依次進(jìn)行檢查 BUSY、寫(xiě)如指令、寫(xiě)入地址的操作,等到可以再次寫(xiě)入數(shù)據(jù)的時(shí)候,數(shù)據(jù)移位寄存器才恢復(fù)工作,從而實(shí)現(xiàn)自動(dòng)翻頁(yè)的功能。SPI IP 接口設(shè)計(jì)24 數(shù)據(jù)狀態(tài)信息選擇邏輯R e a d / F a s t R e a dR e a d S t a t u s R e g i s t e r數(shù)據(jù)狀態(tài)信息選擇邏輯并串轉(zhuǎn)換移位寄存器數(shù)據(jù)儲(chǔ)存器I D 寄存器圖 數(shù)據(jù)狀態(tài)信息選擇邏輯示意圖根據(jù)當(dāng)前 SPI Flash Controller 所發(fā)送的指令可以判斷從 Flash 器件接收回來(lái)的是數(shù)據(jù)信息還是狀態(tài)信息,然后通過(guò)數(shù)據(jù)狀態(tài)信息選擇邏輯決定信息的不同分流方向如果是數(shù)據(jù),則放入數(shù)據(jù)緩存器(SPI_FIFO),如果是狀態(tài)信息,則放入Flash 狀態(tài)寄存器(STATUS_ID) ,如圖 所示。用于數(shù)據(jù)存儲(chǔ)的 FIFO 在這里作單獨(dú)介紹:F I F O..W PR P圖 數(shù)據(jù)緩存器示意圖本設(shè)計(jì)采用深度 8 寬度 32 的 FIFO 作為數(shù)據(jù)緩沖存儲(chǔ)器。如果是寫(xiě) Flash 命令,它接受上層配置的數(shù)據(jù), 然后通過(guò) SPI 總線(xiàn)發(fā)送至 Flash。如果是讀 Flash 命令,F(xiàn)IFO 接受從 Flash 中讀出的數(shù)據(jù),然后通過(guò) HE Register Bus 發(fā)往上層。此 FIFO 采用讀寫(xiě)雙指針模式,讀指針和寫(xiě)指針均為 4bit。指針最高位作為標(biāo)志位來(lái)區(qū)分 FIFO 的空滿(mǎn)狀態(tài)。當(dāng)讀指針、寫(xiě)指針完全相等的時(shí)候,F(xiàn)IFO 為空。當(dāng)讀指針和寫(xiě)指針的低 3 位相等,而最高位相反時(shí),F(xiàn)IFO 為滿(mǎn)。 分頻模塊根據(jù)設(shè)計(jì)要求,SPI Flash Controller 要支持三種可配置的 SPI 模式傳輸速度,第四章 SPI Flash Controller 設(shè)計(jì)與實(shí)現(xiàn) 25分別為 1/4 system clock,1/8 system clock,1/16 system Register File 中控制寄存器的第 4 位可以決定不同的 SPI 傳輸速度:SPI_CON[3:2]=2’h00 1/4 system clockSPI_CON[3:2]=2’h01 1/8 system clockSPI_CON[3。2]=2’h10 1/16 system clockSPI_CON[3:2]=2’h11 1/16 system clock 片選邏輯模塊上層配置指令、地址、數(shù)據(jù)之后,控制器接收到 Start 信號(hào),首先會(huì)將指令放入移位寄存器當(dāng)中,當(dāng)移位寄存器中需傳輸?shù)闹噶顪?zhǔn)備好之后,會(huì)將 Flash 片選信號(hào) SPI_CS_B 拉低(有效) ,待整個(gè)指令傳輸完成之后,再將片選信號(hào)SPI_CS_B 信號(hào)拉高。 中斷信號(hào)產(chǎn)生模塊 SPI Flash Controller 支持三種中斷機(jī)制。即,數(shù)據(jù)緩存 FIFO 空中斷、數(shù)據(jù)緩存 FIFO 滿(mǎn)中斷和傳輸完成中斷。當(dāng)上述三種中斷發(fā)生時(shí),會(huì)首先將 Register File中的中斷狀態(tài)寄存器(INT_FLAG)的相應(yīng)中斷狀態(tài)位置 1(有效) 。中斷生成模塊中斷狀態(tài)寄存器中斷使能信號(hào)S P I _ I N T圖 中斷信號(hào)產(chǎn)生器當(dāng)傳輸完成中斷發(fā)生時(shí),如果傳輸完成中斷屏蔽使能信號(hào) SPI_CON[8]為 0 (enable),中斷信號(hào) SPI_INT 有效,否則無(wú)效。SPI IP 接口設(shè)計(jì)26第五章 SPI Flash Controller 測(cè)試與驗(yàn)證 27第五章 SPI Flash Controller 測(cè)試與驗(yàn)證 測(cè)試環(huán)境整個(gè) SPI Flash Controller 的測(cè)試環(huán)境分為 7 個(gè)部分:測(cè)試情況,偽 CPU,設(shè)計(jì)方案,SPI 閃存,存儲(chǔ)器(期望值) ,存儲(chǔ)器(測(cè)試輸出數(shù)據(jù))和監(jiān)視器。測(cè)試環(huán)境框圖:測(cè)試情況存儲(chǔ)器( 測(cè)試輸出數(shù)據(jù) )設(shè)計(jì)方案監(jiān)視器 結(jié)果S P I 閃存行為模擬程序存儲(chǔ)器 ( 期望值 )偽 C P U圖 測(cè)試環(huán)境框圖? 在測(cè)試情況中,共有 19 個(gè) pattern 為測(cè)試不同功能點(diǎn)提供全面測(cè)試的原始激勵(lì)。? 在偽 CPU 中,定義了寄存器的讀寫(xiě)任務(wù),便于測(cè)試更有效的進(jìn)行。? 設(shè)計(jì)方案為 SPI Flash Controller 設(shè)計(jì)本身。? SPI 閃存 為模擬 Flash 全部行為的一個(gè)模型程序。? 存儲(chǔ)器(期望值)用來(lái)存儲(chǔ)與讀出數(shù)據(jù)比對(duì)的原始數(shù)據(jù)。? 存儲(chǔ)器(測(cè)試輸出數(shù)據(jù))用來(lái)存儲(chǔ)從 Flash 中讀出的數(shù)據(jù)。? 監(jiān)視器用于實(shí)現(xiàn)原始數(shù)據(jù)與測(cè)試輸出數(shù)據(jù)的自動(dòng)比對(duì)功能,以判斷設(shè)計(jì)的正確性。SPI IP 接口設(shè)計(jì)28 測(cè)試文件架構(gòu)S P I F l a s h C o n t r o l l e rs r cm a c r os i mo u t p u tw a v e f o r mm o d e ll o gg o l d e nt s kp a t t e r ns i m . vs i m f i l e s . fm a k e f i l ec o v _ w o r k文件文件夾注釋管理文件測(cè)試功能點(diǎn)仿真記錄文件行為模擬程序功能測(cè)試覆蓋率分析文件被編譯文件列表仿真波形期望值測(cè)試中設(shè)計(jì)的輸出頂層仿真模塊空?qǐng)D 測(cè)試文件架構(gòu)圖一個(gè)好的文件架構(gòu)能夠方便我們的文件管理,在整個(gè)測(cè)試中由于要用到的以及產(chǎn)生的文件較多,我們必須有一個(gè)規(guī)范的文件存放位置和管理架構(gòu),這樣更有利于我們的測(cè)試和改正錯(cuò)誤,具體架構(gòu)如圖 所示。 測(cè)試功能點(diǎn)表 仿真測(cè)試功能點(diǎn)功能 子功能 控制信號(hào) 功能描述開(kāi)始硬件復(fù)位硬件復(fù)位 RST_B進(jìn)程中硬件復(fù)位開(kāi)始軟件復(fù)位復(fù)位軟件復(fù)位 SW_RST進(jìn)程中軟件復(fù)位寄存器讀寫(xiě) 寄存器的正常讀寫(xiě)R_RGST_WE,R_RGST_RE,R_RGST_SPI_SEL,R_RGST_BUS對(duì)每個(gè)寄存器進(jìn)行寫(xiě)操作,然后讀取每個(gè)寄存器的值第五章 SPI Flash Controller 測(cè)試與驗(yàn)證 29續(xù)表功能 子功能 控制信號(hào) 功能描述寫(xiě)保護(hù) SPI_WP_B保護(hù) Flash 狀態(tài)寄存器內(nèi)容不被改變Write enableWrite enable 必須在每一個(gè)寫(xiě)操作前寫(xiě)入 FlashWrite disableADR_EN,DATA_RW,BYTE_CNT,WE_EN,STA_ID_FAST 將狀態(tài)寄存器 WEL 位置 0寫(xiě)狀態(tài)寄存器 寫(xiě)狀態(tài)寄存器寫(xiě)操作數(shù)據(jù)寫(xiě)入ADR_EN,DATA_RW,BYTE_CNT,WE_EN,STA_ID_FAST Write data into Flash memory讀狀態(tài)寄存器將 Flash 狀態(tài)寄存器的值讀入 SPI讀數(shù)據(jù)將 Falsh Memory 中的數(shù)據(jù)讀如 SPI_FIFO快速讀數(shù)據(jù)為了數(shù)據(jù)準(zhǔn)確,寫(xiě)入地址后需要等待 8 個(gè)周期才能采集數(shù)據(jù)讀操作讀廠(chǎng)商信息ADR_EN,DATA_RW,BYTE_CNT,WE_EN,STA_ID_FAST將 Falsh 廠(chǎng)商信息讀入 SPI STATUS_ID 寄存器片擦除 將整個(gè)存儲(chǔ)空間寫(xiě)為全 1Sector 擦除將寫(xiě)入地址的對(duì)應(yīng) Sector 寫(xiě)為全 1擦除Block 擦除ADR_EN,DATA_RW,BYTE_CNT,WE_EN,STA_ID_FAST 將寫(xiě)入地址的對(duì)應(yīng) Block 寫(xiě)為全 1中斷 傳輸完成中斷 BYTE_CNT,WE_ENSPI 操作執(zhí)行完之后,發(fā)出有效的中斷信號(hào)寫(xiě)入數(shù)據(jù) SPI_TX_REQ, SPI_TX_CLRFIFO 為空,將數(shù)據(jù)寫(xiě)入FIFO,寫(xiě)滿(mǎn)后將 TX_REQ清除DMA 模式DMA 模式讀出數(shù)據(jù) SPI_RX_REQ, SPI_RX_CLRFIFO 為滿(mǎn),從 FIFO 中將數(shù)據(jù)讀出,讀空后將 RX_REQ清除SPI IP 接口設(shè)計(jì)30續(xù)表功能 子功能 控制信號(hào) 功能描述讀寫(xiě) STA_ID_FAST 正常的讀寫(xiě)空狀態(tài)時(shí)的TX_REQCPU_DMA檢查能否在 FIFO 為空時(shí)正常準(zhǔn)確的發(fā)出TX_REQ 信號(hào)FIFO滿(mǎn)狀態(tài)使得RX_REQCPU_DMA檢查能否在 FIFO 為滿(mǎn)時(shí)正常準(zhǔn)確的發(fā)出RX_REQ 信號(hào)讀操作讀操作,配置信息及指令隨機(jī)錯(cuò)誤非正常操作寫(xiě)操作ADR_EN,DATA_RW,BYTE_CNT,WE_EN,STA_ID_FAST 寫(xiě)操作,配置正確,指令錯(cuò)誤 測(cè)試流程整個(gè) SPI Flash Controller 支持對(duì) Flash 的一些基本的讀寫(xiě)操作,如果需要驗(yàn)證讀寫(xiě)操作的正確性,必須讀寫(xiě)操作一起執(zhí)行,才能得到測(cè)試輸出數(shù)據(jù),以便和原始數(shù)據(jù)做比對(duì)。在測(cè)試寫(xiě)操作的正確性前,必須證明讀操作的正確性。首先,修改測(cè)試用的SPI 后端 Flash 的行為模擬程序的 Memory 默認(rèn)值為不同的值(這里我設(shè)定成與其地址相同) ,然后初始化整個(gè) SPI Flash,這時(shí) SPI Flash 中的初始數(shù)據(jù)可知,通過(guò) Register Bus 給 SPI Flash 控制器配置讀操作所需指令、地址,然后發(fā)送讀指令,讀出數(shù)據(jù)與 SPI Flash 中的初始化數(shù)值做對(duì)比,如果相同則證明讀操作正確。讀操作測(cè)試正確后就可以開(kāi)始寫(xiě)操作的正確性。在讀操作正確的前提下,再來(lái)證明寫(xiě)操作的正確性。同樣通過(guò) Register Bus給 SPI Flash 控制器配置寫(xiě)操作指令、地址和激勵(lì)數(shù)據(jù),然后發(fā)送寫(xiě)指令,寫(xiě)入Flash 中地址所指的相應(yīng)區(qū)域,再通過(guò) Register Bus 配置讀指令、和同樣的地址,然后讀出地址所指的相應(yīng)區(qū)域,讀出數(shù)據(jù)如果與先前寫(xiě)入數(shù)據(jù)相同,則證明寫(xiě)操作正確。 第五章 SPI Flash Controller 測(cè)試與驗(yàn)證 31擦除操作在讀寫(xiě)操作正確的前提下,再進(jìn)行測(cè)試,先通過(guò)寫(xiě)操作給 Flash 中的特定區(qū)域?qū)懭胍恍?shù)據(jù),然后通過(guò) Register Bus 配置擦除指令,控制器再發(fā)送擦除指令,對(duì) Flash 中的特定區(qū)域進(jìn)行擦除(寫(xiě)“1” ) ,然后再通過(guò)讀指令讀出相應(yīng)區(qū)域,以讀出數(shù)據(jù)是否為全“1” ,判斷擦除指令是否正確。下面以擦除指令為例說(shuō)明具體的測(cè)試流程:通過(guò)所有數(shù)據(jù)為 1 ?Y e sN oN o傳輸完成 ?Y e s開(kāi)始結(jié)束向 F l a s h 某地址寫(xiě)入部分?jǐn)?shù)據(jù)失敗向 F l a s h 寫(xiě)擦除指令 , 擦除掉剛剛寫(xiě)入的數(shù)據(jù)Y e s讀取擦除位置的數(shù)據(jù)B U S Y 位為 0 ?N o圖 擦除指令測(cè)試流程 FPGA 驗(yàn)證 C_CODE 的仿真 當(dāng)設(shè)計(jì)的功能仿真測(cè)試全部通過(guò)以后,就可以開(kāi)始驅(qū)動(dòng)的編寫(xiě)和仿真測(cè)試。首先把設(shè)計(jì)代碼接到平臺(tái)的代碼之中,然后把編寫(xiě)的 C 驅(qū)動(dòng)通過(guò) IDE 軟件編譯成仿真需要的 hex 文件,然后像之前的仿真測(cè)試一樣對(duì)設(shè)計(jì)進(jìn)行全面測(cè)試。此次仿真的主要目的在于測(cè)試設(shè)計(jì)與平臺(tái)的連接是否正確,并且檢驗(yàn)驅(qū)動(dòng)程序書(shū)寫(xiě)是否正確、合理、全面。SPI IP 接口設(shè)計(jì)32 FPGA 硬件測(cè)試所有仿真結(jié)束并通過(guò)以后,利用 IDE 把設(shè)計(jì)編譯成 srec 文件,然后利用 ISE生成 FPGA 平臺(tái)下載所需的 MCS 文件。生成的 MCS 文件即可以通過(guò)計(jì)算機(jī)并口下載到 FPGA 平臺(tái)中。將下載好的 FPGA 平臺(tái)進(jìn)行硬件測(cè)試,查看功能是否達(dá)到要求。若未達(dá)到要求,則分析原因,找出錯(cuò)誤,進(jìn)行修改,最終達(dá)到最終 SPEC 所描述的功能硬件驗(yàn)證原理圖:S P I 總線(xiàn)橋需要測(cè)試的設(shè)計(jì)方案外設(shè) F l a s hR G S T中斷F P G A 平 臺(tái)P C外部接口S P I 接口圖 FPGA 驗(yàn)證原理圖注:實(shí)際的 FPGA 測(cè)試中,使用的是 XC3S5000 平臺(tái)的 UART IP 接口驗(yàn)證時(shí)我們通過(guò) UART 接口讓 FPGA 與 PC 機(jī)相連,PC 機(jī)上的測(cè)試程序就可以通過(guò)各個(gè) function 測(cè)試設(shè)計(jì)的各個(gè)功能,在測(cè)試機(jī)上通過(guò) IDE 軟件獲取不同寄存器的值,與期望值作對(duì)比,以此驗(yàn)證設(shè)計(jì)的正確性。 驗(yàn)證結(jié)果在整個(gè)仿真和測(cè)試的過(guò)程中還是遇到了不少的問(wèn)題,比如仿真軟件、測(cè)試軟件環(huán)境不熟悉,自己的設(shè)計(jì)代碼有邏輯、時(shí)序缺陷等。但通過(guò)耐心的檢查和仔細(xì)修改,最后通過(guò)了所有的測(cè)試,很好的完成如下功能:? Register bus 總線(xiàn)接口功能測(cè)試通過(guò)? SPI 總線(xiàn)接口測(cè)試通過(guò)功能測(cè)試通過(guò)? SPI 模式傳輸功能測(cè)試通過(guò)? 深度 8 寬度 32 的 FIFO 功能測(cè)試通過(guò)? 以下操作指令:Write Enable/Disable, Read/Write Status Register, Read Data, 第五章 SPI Flash Controller 測(cè)試與驗(yàn)證 33Fast Read, Page Program, Block/Sector/Chip Erase 功能測(cè)試通過(guò).? 傳輸開(kāi)始可控制功能測(cè)試通過(guò)? 可配置的傳輸字節(jié)數(shù)(maximum 32, little endian)功能測(cè)試通過(guò)? 數(shù)據(jù)緩沖器空/滿(mǎn)中斷機(jī)制功能測(cè)試通過(guò)? 傳輸完成中斷機(jī)制功能測(cè)試通過(guò)? 中斷狀態(tài)查詢(xún)功能測(cè)試通過(guò)? 中斷狀態(tài)寫(xiě)“1”清除功能測(cè)試通過(guò)? 可屏蔽中斷信號(hào)功能測(cè)試