本原創教程由芯驛電子科技(上海)有限公司(ALINX)創作,版權歸本公司所有,如需轉載,需授權并注明出處(http://www.alinx.com)。
1. 實驗簡介
在前面的實驗中我們練習了SD卡讀寫,HDMI視頻顯示等例程,本實驗將SD卡里的BMP圖片讀出,寫入到外部存儲器,再通過HDMI、LCD等顯示。
本實驗如果通過液晶屏顯示,需要有液晶屏模塊。
2. 實驗原理
在前面的實驗中我們在HDMI、LCD上顯示的是彩條,是FPGA內部產生的數據,本實驗將彩條替換為SD內的BMP圖片數據,但是SD卡讀取速度遠遠不能滿足顯示速度的要求,只能先寫入外部高速RAM,再讀出后給視頻時序模塊顯示。
BMP圖片格式
本實驗直接在SD卡中搜索BMP文件,假設每個文件都是從SD的某個扇區第一個字節開始,根據BMP文件頭的特征找到BMP。
BMP(全稱Bitmap)是Windows操作系統中的標準圖像文件格式,可以分成兩類:設備相關位圖(DDB)和設備無關位圖(DIB),使用非常廣。它采用位映射存儲格式,除了圖像深度可選以外,不采用其他任何壓縮,因此,BMP文件所占用的空間很大。BMP文件的圖像深度可選1bit、4bit、8bit及24bit。BMP文件存儲數據時,圖像的掃描方式是按從左到右、從下到上的順序。由于BMP文件格式是Windows環境中交換與圖有關的數據的一種標準,因此在Windows環境中運行的圖形圖像軟件都支持BMP圖像格式。
對于程序設計來說最重要的是找到BMP文件頭,BMP圖像文件頭格式如下:
1)1-2:(這里的數字代表的是字節,下同)圖像文件頭。0x4d42=’BM’,表示是Windows支持的BMP格式。(注意:查ascii表B 0x42,M 0x4d,bfType 為兩個字節,B為low字節,M為high字節所以bfType=0x4D42,而不是0x424D,請注意)
2)3-6:整個文件大小。4690 0000,為00009046h=36934。
3)7-8:保留,必須設置為0。
4)9-10:保留,必須設置為0。
5)11-14:從文件開始到位圖數據之間的偏移量(14+40+4*(2^biBitCount))(在有顏色板的情況下)。4600 0000,為00000046h=70,上面的文件頭就是35字=70字節。
位圖信息頭
6)15-18:位圖圖信息頭長度。
7) 19-22:位圖寬度,以像素為單位。8000 0000,為00000080h=128。
8)23-26:位圖高度,以像素為單位。9000 0000,為00000090h=144。
9)27-28:位圖的位面數,該值總是1。0100,為0001h=1。
10)29-30:每個像素的位數。有1(單色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增強型真彩色)。1000為0010h=16。
11)31-34:壓縮說明:有0(不壓縮),1(RLE 8,8位RLE壓縮),2(RLE 4,4位RLE壓縮,3(Bitfields,位域存放)。
12)35-38:用字節數表示的位圖數據的大小,該數必須是4的倍數,數值上等于:一行所占的字節數×位圖高度。0090 0000為00009000h=80×90×2h=36864。假設位圖是24位,寬為41,高為30,則數值= (biWidth*biBitCount+31)/32*4*biHeight,即=(41*24+31)/32*4*30=3720
13)39-42:用象素/米表示的水平分辨率。A00F 0000為0000 0FA0h=4000。
14)43-46:用象素/米表示的垂直分辨率。A00F 0000為0000 0FA0h=4000。
15)47-50:位圖使用的顏色索引數。設為0的話,則說明使用所有調色板項。
16)51-54:對圖象顯示有重要影響的顏色索引的數目。如果是0,表示都重要。
本實驗使用不壓縮,24(16M色,真彩色)的BMP圖片,文件頭大小是54個字節,前兩個字節為“BM”,緊接著4個字節是文件大小,19-22字節為圖片寬度,這些信息是程序設計中要使用的重要信息。
3. 程序設計
由于SD卡讀寫實驗,HDMI、LCD顯示實驗種我們已經練習過SD卡和視頻相關知識,這里不再講解。
本實驗的重點模塊是BMP圖片讀取模塊bmp_read,bmp_read模塊完成SD卡中讀取一個扇區的數據,然后和BMP的文件頭對比,如果前2個字節等于“BM”,然后再找到19-22字節,對比圖片的寬度和輸入要求的寬度是否一致,如果一致就認為找到一張BMP圖片,讀取出來,去掉前面54字節的文件頭,寫入外部存儲器。
bmp_read狀態機如下所示,有搜索命令以后,進入搜索狀態“S_FIND”,開始不斷地讀取SD卡,找到符合要求的BMP圖片,找到以后進入“S_READ_WAIT”,判斷FIFO空間大小,如果FIFO空間足夠大,進入“S_READ”狀態。
bmp_read模塊狀態機
信號名稱 | 方向 | 說明 |
clk | in | 時鐘輸入 |
rst | in | 異步復位輸入,高復位 |
ready | out | 空閑狀態指示 |
find | in | 搜索播放請求 |
sd_init_done | in | sd卡初始化完成 |
state_code | out | 狀態碼0,表示sd還在初始化1,sd卡初始化完成,等待按鍵按下2,正在搜索BMP文件3,找到BMP文件,正在讀取 |
bmp_width | in | 搜索BMP圖片的寬度 |
write_req | out | 寫外部存儲器請求 |
write_req_ack | in | 寫外部存儲器請求應答 |
sd_sec_read | out | sd卡讀請求 |
sd_sec_read_addr | out | sd卡讀請求扇區地址 |
sd_sec_read_data | in | sd卡讀到的數據 |
sd_sec_read_data_valid | in | sd卡讀數據有效 |
sd_sec_read_end | in | sd卡讀請求完成 |
bmp_data_wr_en | out | bmp文件寫使能 |
bmp_data | out | bmp文件的音頻數據 |
bmp_read模塊端口
video_timing_data模塊完成視頻時序到FIFO讀取的信號的轉換,主要原理就是把視頻時序中的“DE”做為FIFO的讀信號,但是讀出的數據會有延時,所以做了相應的對齊處理。
4. 實驗現象
1)格式化sd卡(fat32格式),sd卡必須是2.0以上的版本(容量大于4G)
2)把BMP格式文件放到sd卡中,需要注意,BMP圖片數據存儲是倒序,所以先用圖片處理工具上下顛倒一下。根據顯示輸出不同的分辨率,放置不同分辨率的圖片,HDMI輸出采用1024x768分辨率,7寸液晶屏模塊AN070分辨率是800x480,4.3寸液晶屏模塊AN430分辨率是480x272。
3)將準備好的sd卡注入開發板的sd卡槽(sd卡不能帶電插拔),上電,下載實驗程序,等待LED1變亮時,按下KEY2,這個時候LED2會變亮,表示正在搜索BMP文件,如果找到BMP圖片LED1、LED2會顯示會同時亮,這時候顯示器(或者液晶屏模塊,根據實驗工程選擇,連接方法在《HDMI測試實驗教程》中已講述)就會顯示相應的圖片。如果sd卡內有多張BMP,可以再次按按鍵KEY2,會顯示下一張圖片。
開發板
顯示效果
-
FPGA
+關注
關注
1626文章
21678瀏覽量
602037 -
HDMI
+關注
關注
32文章
1676瀏覽量
151683 -
SD卡
+關注
關注
2文章
560瀏覽量
63813 -
BMP
+關注
關注
0文章
48瀏覽量
17044 -
紫光同創
+關注
關注
5文章
82瀏覽量
27490
發布評論請先 登錄
相關推薦
評論