基于FPGA的SD NAND圖片顯示實現
2024-11-05 17:40:03閱讀量:123
1、目標
使用 SD NAND數據讀寫控制器讀取事先存儲在 SD NAND的圖片數據,將讀取的圖片數據通過SDRAM 數據讀寫控制器暫存在 SDRAM 芯片中,通過 VGA 顯示器將暫存在 SDRAM 的圖片顯示出來。 SD 卡內存儲兩張圖片,其交替顯示在 VGA 顯示器上,分辨率為 640*480。
SD NAND在SD2.0版本協(xié)議下,SPI模式的理論最大傳輸速率為50Mbps,加上命令號以及等待返回響應信號的時間,實際上的傳輸速率還會下降。對于采用分辨率為640*480@60Hz 的顯示器來說,一幅圖像的數據量達到640*480*16bit = 4915200bit = 4800Kbit(1Kbit=1024bit), 每秒鐘刷新60次,那么每秒鐘需要傳輸的數據量達到4800Kbit*60 = 288000Kbit =281.25Mbit (1Mbit=1024Kbit)。由此可以看出,SD卡的讀寫速度完全跟不上VGA的數據發(fā)送速度,因此必須先緩存一幅圖像到內部或外部存儲器,再通過VGA接口顯示。FPGA的片內存儲資源較少,對于緩存如此大量的數據,只能使用SDRAM或DDR3緩存數據。
2、圖片的預處理
首先選取要顯示的圖片兩張,使用 Window 系統(tǒng)自帶的畫圖工具對圖片進行處理,將圖片處理為分辨率 640*480。
VGA的顯示格式為16位RGB565格式,為了使SD NAND讀出的數據可以直接在VGA上顯示,需要將圖片通過 “ IMG2LCD ” 上位機軟件轉成16位的RGB565格式的bin文件,再將bin文件導入SD NAND中。
使用 “ IMG2LCD ” 上位機軟件打開兩張圖片,按如下設置相關參數,然后點擊保存,就生成了兩個圖片的二進制文件(像素值)。
3、SD NAND的預處理
SD NAND在經過多次存放數據與刪除數據之后,存入的文件有可能不是按照連續(xù)的扇區(qū)地址存儲的,為了避免圖片顯示錯誤,我們將bin文件導入SD NAND之前,需要對SD NAND進行一個格式化處理。
首先得找個讀卡器,再把所用到的SD NAND開發(fā)板插到讀卡器上邊,通過USB接口與PC建立鏈接。
本次實驗我依然選用的是深圳雷龍公司的一款SD NAND產品----CSNP32GCR01-AOW。 可以看到這款SD NAND開發(fā)板設計得很巧妙,把對外接口設計成了通用的micro接口,兼容性非常強,不管是插讀卡器還是直接插FPGA開發(fā)板,都是即插即用,十分方便。
接著說回來對SD NAND的初始化處理。插上讀卡器后,選擇對應的磁盤,點擊“格式化”,并點擊“開始”
格式化完成后,將前面生成的兩張圖片對應的bin文件存入對應的SD NAND磁盤中:
SD NAND內部的存儲資源是以扇區(qū)的形式進行劃分的,為了將圖片的bin數據從SD NAND中讀取出來,我們需要找到圖片存儲對應的扇區(qū)地址。扇區(qū)地址可以用“WinHex 軟件”來查看。
以管理員身份運行軟件 WinHex 軟件,點擊“工具 ”,然后點擊“打開磁盤”:
雙擊打開對應的SD NAND,記錄下兩個 bin文件的第一扇區(qū)地址:
此時查詢到的扇區(qū)地址就是bin文件存放的起始扇區(qū)地址,我們只需要按照這個起始扇區(qū)地址,按順序讀出SD NAND中的數據即可,直到讀完一張圖片中的所有數據。SD NAND中一個扇區(qū)存放512個字節(jié),也就是256個16位數據,對于分辨率為640*480的圖片來說,共需要讀出1200(640*480/256)個扇區(qū)數據。
4、FPGA實現
先說下總體思路:
· SD NAND中存有兩幅圖片,一副為雷龍公司的官網截圖,另一幅則是本博客的頭像
· FPGA從SD NAND中讀取這兩幅圖片的像素信息,并緩存到SDRAM中
· 將SDRAM中的數據(兩幅圖片的像素信息)通過VGA接口顯示在顯示器上
根據這個思路,可以對應的畫對應的系統(tǒng)框圖:
FPGA頂層模塊例化了以下五個模塊:PLL時鐘模塊、SD NAND讀取圖片控制模塊、SD NAND控制器模塊、SDRAM控制器模塊和VGA驅動模塊。
4.1、詳細設計
(1) 頂層模塊
頂層模塊:頂層模塊主要完成對其余各模塊的例化,實現各模塊之間的數據交互。需要注意的是,系統(tǒng)初始化完成是在SD NAND以及SDRAM都初始化完成后才開始拉高的,該信號控制著SD NAND讀取圖片控制模塊的復位信號,因此SD NAND讀取圖片控制模塊是在系統(tǒng)初始化完成后才工作的,防止因SD NAND或者SDRAM初始化未完成導致數據錯誤。
(2) PLL時鐘模塊
PLL時鐘模塊:PLL時鐘模塊通過調用鎖相環(huán)(PLL)IP核實現,總共輸出五個時鐘,頻率分別為100Mhz、100Mhz(相位偏移-180度)、50Mhz、50Mhz(相位偏移180度)和25Mhz。 兩個100Mhz的時鐘用于為SDRAM控制器模塊提供驅動時鐘;兩個50Mhz的時鐘用于為SD NAND控制器模塊提供驅動時鐘;25Mhz用于為VGA驅動模塊提供驅動時鐘。
(3) SD NAND讀取圖片控制模塊
SD NAND讀取圖片控制模塊:SD NAND讀取圖片控制模塊通過控制SD NAND控制器的讀接口,從SD NAND中讀取圖像數據,并在讀完一張圖片后延時一段時間,再去讀取另一張圖片數據,實現兩張圖片的循環(huán)切換讀取。
(4)SD NAND控制器模塊
SD NAND控制器模塊:SD NAND控制器模塊負責驅動SD NAND,該模塊將SD NAND的讀寫操作封裝成方便用戶使用的接口。關于SD NAND讀寫控制器模塊在上一篇文章中已經詳細說明了,可參考: 基于FPGA的SD卡的數據讀寫實現(SD NAND FLASH)
(5)SDRAM讀寫控制模塊
SDRAM讀寫控制模塊:SDRAM讀寫控制器模塊負責驅動SDRAM存儲器,緩存圖像數據。該模塊將SDRAM復雜的讀寫操作封裝成類似FIFO的用戶接口, 非常方便用戶的使用。關于此部分,有詳盡的系列文章供參考:相信我,SDRAM真的不難----匯總篇
(6)VGA驅動模塊
VGA驅動模塊根據VGA時序參數輸出行、場同步信號;同時它還要輸出數據請求信號用于讀取SDRAM中的圖片數據,并將圖片通過VGA接口在顯示器上顯示。關于此部分,有詳盡的文章供參考:如何用VGA接口乳法?
4.2、仿真
一般的測試中,我們都需要先進行仿真來觀察時序等測試行為。此次實驗由于找不到好的SD NAND的Verilog模型,所以仿真測試略。
4.3、實驗結果
編譯工程,把程序下載到FPGA開發(fā)板,通過VGA接口連接VGA線到顯示器,如下:
接著觀察顯示器是否會交替顯示我們事先保存的兩幅圖片。實驗現象果然與預期一致:
好啦,本次實驗就做完啦。如果屏幕前的你也有存儲產品方面的需求的話,你都可以試試雷龍公司的SD NAND產品哦。
這是一家專業(yè)做存儲產品的公司,NAND Flash是其主要產品。 該公司專注NAND Flash設計研發(fā)13年,在這一塊可以說是相當專業(yè)。如果你對NAND Flash仍有疑惑的問題,或者你想在你的設計中使用NAND Flash產品,都可以直接聯系我們

L7805CV-DG/線性穩(wěn)壓器(LDO) | 0.5401 | |
AMS1117-3.3/線性穩(wěn)壓器(LDO) | 0.1237 | |
BAT54C,215/肖特基二極管 | 0.0335 | |
LM358DR2G/運算放大器 | 0.345 | |
CJ431/電壓基準芯片 | 0.1157 | |
LM393DR2G/比較器 | 0.3153 | |
ADUM4160BRWZ-RL/隔離式USB芯片 | 34.83 | |
REF3012AIDBZR/電壓基準芯片 | 0.9357 | |
SS8050/三極管(BJT) | 0.035 | |
8S005/錫膏/錫漿 | 17.67 |