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