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