NEXYS A7開發板(Xilinx Aritx-7)使用Microblaze操作讀寫FLASH

簡介

本文總結本人最近的一項工作:NEXYS A7開發板通過Xilinx FPGA自帶的Microblaze CPU核來完成讀寫FLASH操作。

首先吐槽一下,Microblaze核的資料太有限,雖然這個核其實性能還可以,但無奈是用的人太少了。CPU這種東西,就是用的人多了,軟件資源才能豐富。

NEXYS A7是以 Xilinx Artix-7 系列FPGA爲核心的一個開發板,Xilinx的開發工具提供一種軟核Microblaze作爲嵌入式CPU來使用,本文的目的就是優化Microblaze核讀寫FLASH的速率,原則上所有Xilinx系列FPGA都可以採用本文的方式來優化。

FLAHS說明

型號:S25FL128SAGNFI00

這個是Spansion公司的flash芯片,現Spansion已經被Cypress公司收購,相應的datasheet可以在網上搜索到。

讀寫指令

flash支持的讀寫指令如下表所示

僅介紹兩個高速讀指令:QOR、QIOR

 

QOR讀:

從波形圖上可以看到,SPI接口通過IO0信號線發出intruction+addr之後,經過8個dummy cycle後,以4線的方式返回當前地址的數據。並持續返回之後地址的數據,一直到讀完整個地址!

也就是說,如果發一個從0地址開始的讀命令,flash將自動返回整個地址空間的數據,且不會有額外的延時開銷。此時是最理想的情況,將會達到理論最大速率。

 

QIOR讀:

從波形圖上可以看出,它比QOR讀指令發addr的效率更高,QOR讀需要24個時鐘來發送24bit的addr,而QIOR讀則通過4線來發送addr,因此僅需要6個時鐘。

這種特性,對於高密度的訪問非連續地址的應用場景非常合適,比如flash支持的XIP模式,即直接在flash上運行程序,那就需要flash讀數據的延遲儘可能的小,此時QIOR讀就顯得非常有必要了。

 

頁-page、扇區-sector、塊-block

以上述組織形式的flash爲例,

每頁(page)爲256字節(Byte)。一般以頁爲單位去寫flash(又稱“編程”),即每次要寫256字節的數據。

扇區(sector)是flash做擦除的最小單位,即每次最少擦除一個扇區,也可以擦除4個扇區等。

典型的扇區(sector)大小爲64KB,其包含64K/256=256個頁(page)

有的flash在尾部/頭部存在一組4KB大小的扇區,其包含4KB/256=16個頁(page)

上述例子的flash,有254個64K字節大小的扇區 和 32個4K字節的扇區,總地址0x0000_0000 ~ 0x00FF_FFFF,共16M-Byte,即128M-bit

塊(block)則是一組扇區(sector)的組合,沒有固定大小,如4個扇區、8個扇區、16個扇區、半個芯片的扇區 等等。

 

實測性能:

 系統工作時鐘爲100Mhz,例化SPI模塊來讀寫flash,timer模塊來計時,uart模塊來打印log

測試讀10個page,即2560字節的數據量

採用QOR讀指令(0x6B),用時2.593ms,數據速率0.987MBps

採用QIOR讀指令(0xEB),用時2.581ms,數據速率 0.991MBps

測試讀200個page,即256*200=51200=50K字節的數據量

採用QOR讀指令(0x6B),用時41.462ms,數據速率1.206MBps

採用QIOR讀指令(0xEB),用時41.450ms,數據速率1.206MBps

通過上述結果可以看出,每次讀取的數據量越大,實際數據率會越高。

上述程序如果在片外ram上運行的話,數據速率會大大下降,實測最大數據率小於0.6MBps,可以軟件的延遲開銷佔據了主要因素。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章