先自我介紹一下,小編浙江大學(xué)畢業(yè),去過(guò)華為、字節(jié)跳動(dòng)等大廠,目前阿里P7
深知大多數(shù)程序員,想要提升技能,往往是自己摸索成長(zhǎng),但自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年最新大數(shù)據(jù)全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,涵蓋了95%以上大數(shù)據(jù)知識(shí)點(diǎn),真正體系化!
由于文件比較多,這里只是將部分目錄截圖出來(lái),全套包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、大綱路線、講解視頻,并且后續(xù)會(huì)持續(xù)更新
如果你需要這些資料,可以添加V獲?。簐ip204888 (備注大數(shù)據(jù))
正文
1、目標(biāo)
使用 SD NAND數(shù)據(jù)讀寫(xiě)控制器讀取事先存儲(chǔ)在 SD NAND的圖片數(shù)據(jù),將讀取的圖片數(shù)據(jù)通過(guò)SDRAM 數(shù)據(jù)讀寫(xiě)控制器暫存在 SDRAM 芯片中,通過(guò) VGA 顯示器將暫存在 SDRAM 的圖片顯示出來(lái)。 SD 卡內(nèi)存儲(chǔ)兩張圖片,其交替顯示在 VGA 顯示器上,分辨率為 640*480。
SD NAND在SD2.0版本協(xié)議下,SPI模式的理論最大傳輸速率為50Mbps,加上命令號(hào)以及等待返回響應(yīng)信號(hào)的時(shí)間,實(shí)際上的傳輸速率還會(huì)下降。對(duì)于采用分辨率為640*480@60Hz 的顯示器來(lái)說(shuō),一幅圖像的數(shù)據(jù)量達(dá)到640*480*16bit = 4915200bit = 4800Kbit(1Kbit=1024bit), 每秒鐘刷新60次,那么每秒鐘需要傳輸?shù)臄?shù)據(jù)量達(dá)到4800Kbit*60 = 288000Kbit =281.25Mbit (1Mbit=1024Kbit)。由此可以看出,SD卡的讀寫(xiě)速度完全跟不上VGA的數(shù)據(jù)發(fā)送速度,因此必須先緩存一幅圖像到內(nèi)部或外部存儲(chǔ)器,再通過(guò)VGA接口顯示。FPGA的片內(nèi)存儲(chǔ)資源較少,對(duì)于緩存如此大量的數(shù)據(jù),只能使用SDRAM或DDR3緩存數(shù)據(jù)。
2、圖片的預(yù)處理
首先選取要顯示的圖片兩張,使用 Window 系統(tǒng)自帶的畫(huà)圖工具對(duì)圖片進(jìn)行處理,將圖片處理為分辨率 640*480。
VGA的顯示格式為16位RGB565格式,為了使SD NAND讀出的數(shù)據(jù)可以直接在VGA上顯示,需要將圖片通過(guò) “ IMG2LCD ” 上位機(jī)軟件轉(zhuǎn)成16位的RGB565格式的bin文件,再將bin文件導(dǎo)入SD NAND中。
使用 “ IMG2LCD ” 上位機(jī)軟件打開(kāi)兩張圖片,按如下設(shè)置相關(guān)參數(shù),然后點(diǎn)擊保存,就生成了兩個(gè)圖片的二進(jìn)制文件(像素值)。
3、SD NAND的預(yù)處理
SD NAND在經(jīng)過(guò)多次存放數(shù)據(jù)與刪除數(shù)據(jù)之后,存入的文件有可能不是按照連續(xù)的扇區(qū)地址存儲(chǔ)的,為了避免圖片顯示錯(cuò)誤,我們將bin文件導(dǎo)入SD NAND之前,需要對(duì)SD NAND進(jìn)行一個(gè)格式化處理。
首先得找個(gè)讀卡器,再把所用到的SD NAND開(kāi)發(fā)板插到讀卡器上邊,通過(guò)USB接口與PC建立鏈接。
本次實(shí)驗(yàn)我依然選用的是深圳雷龍公司的一款SD NAND產(chǎn)品----CSNP32GCR01-AOW。 可以看到這款SD NAND開(kāi)發(fā)板設(shè)計(jì)得很巧妙,把對(duì)外接口設(shè)計(jì)成了通用的micro接口,兼容性非常強(qiáng),不管是插讀卡器還是直接插FPGA開(kāi)發(fā)板,都是即插即用,十分方便。
接著說(shuō)回來(lái)對(duì)SD NAND的初始化處理。插上讀卡器后,選擇對(duì)應(yīng)的磁盤,點(diǎn)擊“格式化”,并點(diǎn)擊“開(kāi)始”
格式化完成后,將前面生成的兩張圖片對(duì)應(yīng)的bin文件存入對(duì)應(yīng)的SD NAND磁盤中:
SD NAND內(nèi)部的存儲(chǔ)資源是以扇區(qū)的形式進(jìn)行劃分的,為了將圖片的bin數(shù)據(jù)從SD NAND中讀取出來(lái),我們需要找到圖片存儲(chǔ)對(duì)應(yīng)的扇區(qū)地址。扇區(qū)地址可以用“WinHex 軟件”來(lái)查看。
以管理員身份運(yùn)行軟件 WinHex 軟件,點(diǎn)擊“工具 ”,然后點(diǎn)擊“打開(kāi)磁盤”:
雙擊打開(kāi)對(duì)應(yīng)的SD NAND,記錄下兩個(gè) bin文件的第一扇區(qū)地址:
此時(shí)查詢到的扇區(qū)地址就是bin文件存放的起始扇區(qū)地址,我們只需要按照這個(gè)起始扇區(qū)地址,按順序讀出SD NAND中的數(shù)據(jù)即可,直到讀完一張圖片中的所有數(shù)據(jù)。SD NAND中一個(gè)扇區(qū)存放512個(gè)字節(jié),也就是256個(gè)16位數(shù)據(jù),對(duì)于分辨率為640*480的圖片來(lái)說(shuō),共需要讀出1200(640*480/256)個(gè)扇區(qū)數(shù)據(jù)。
4、FPGA實(shí)現(xiàn)
先說(shuō)下總體思路:
- SD NAND中存有兩幅圖片,一副為雷龍公司的官網(wǎng)截圖,另一幅則是本博客的頭像
- FPGA從SD NAND中讀取這兩幅圖片的像素信息,并緩存到SDRAM中
- 將SDRAM中的數(shù)據(jù)(兩幅圖片的像素信息)通過(guò)VGA接口顯示在顯示器上
根據(jù)這個(gè)思路,可以對(duì)應(yīng)的畫(huà)對(duì)應(yīng)的系統(tǒng)框圖:
FPGA頂層模塊例化了以下五個(gè)模塊:PLL時(shí)鐘模塊、SD NAND讀取圖片控制模塊、SD NAND控制器模塊、SDRAM控制器模塊和VGA驅(qū)動(dòng)模塊。
4.1、詳細(xì)設(shè)計(jì)
(1) 頂層模塊
頂層模塊:頂層模塊主要完成對(duì)其余各模塊的例化,實(shí)現(xiàn)各模塊之間的數(shù)據(jù)交互。需要注意的是,系統(tǒng)初始化完成是在SD NAND以及SDRAM都初始化完成后才開(kāi)始拉高的,該信號(hào)控制著SD NAND讀取圖片控制模塊的復(fù)位信號(hào),因此SD NAND讀取圖片控制模塊是在系統(tǒng)初始化完成后才工作的,防止因SD NAND或者SDRAM初始化未完成導(dǎo)致數(shù)據(jù)錯(cuò)誤。
此部分代碼如下:
module top_sd_photo_vga(
input sys_clk , //系統(tǒng)時(shí)鐘
input sys_rst_n , //系統(tǒng)復(fù)位,低電平有效
//SD NAND接口
input sd_miso , //SD NANDSPI串行輸入數(shù)據(jù)信號(hào)
output sd_clk , //SD NANDSPI時(shí)鐘信號(hào)
output sd_cs , //SD NANDSPI片選信號(hào)
output sd_mosi , //SD NANDSPI串行輸出數(shù)據(jù)信號(hào)
//SDRAM接口
output sdram_clk , //SDRAM 時(shí)鐘
output sdram_cke , //SDRAM 時(shí)鐘有效
output sdram_cs_n , //SDRAM 片選
output sdram_ras_n , //SDRAM 行有效
output sdram_cas_n , //SDRAM 列有效
output sdram_we_n , //SDRAM 寫(xiě)有效
output [1:0] sdram_ba , //SDRAM Bank地址
output [1:0] sdram_dqm , //SDRAM 數(shù)據(jù)掩碼
output [12:0] sdram_addr , //SDRAM 地址
inout [15:0] sdram_data , //SDRAM 數(shù)據(jù)
//VGA接口
output vga_hs , //行同步信號(hào)
output vga_vs , //場(chǎng)同步信號(hào)
output [15:0] vga_rgb //紅綠藍(lán)三原色輸出
);
//parameter define
parameter PHOTO_H_PIXEL = 24'd640 ; //設(shè)置SDRAM緩存大小
parameter PHOTO_V_PIXEL = 24'd480 ; //設(shè)置SDRAM緩存大小
//wire define
wire clk_100m ; //100mhz時(shí)鐘,SDRAM操作時(shí)鐘
wire clk_100m_shift ; //100mhz時(shí)鐘,SDRAM相位偏移時(shí)鐘
wire clk_50m ;
wire clk_50m_180deg ;
wire clk_25m ;
wire rst_n ;
wire locked ;
wire sys_init_done ; //系統(tǒng)初始化完成
wire sd_rd_start_en ; //開(kāi)始寫(xiě)SD NAND數(shù)據(jù)信號(hào)
wire [31:0] sd_rd_sec_addr ; //讀數(shù)據(jù)扇區(qū)地址
wire sd_rd_busy ; //讀忙信號(hào)
wire sd_rd_val_en ; //數(shù)據(jù)讀取有效使能信號(hào)
wire [15:0] sd_rd_val_data ; //讀數(shù)據(jù)
wire sd_init_done ; //SD NAND初始化完成信號(hào)
wire wr_en ; //sdram_ctrl模塊寫(xiě)使能
wire [15:0] wr_data ; //sdram_ctrl模塊寫(xiě)數(shù)據(jù)
wire rd_en ; //sdram_ctrl模塊讀使能
wire [15:0] rd_data ; //sdram_ctrl模塊讀數(shù)據(jù)
wire sdram_init_done ; //SDRAM初始化完成
//*****************************************************
//** main code
//*****************************************************
assign rst_n = sys_rst_n & locked;
assign sys_init_done = sd_init_done & sdram_init_done; //SD NAND和SDRAM都初始化完成
assign wr_en = sd_rd_val_en;
assign wr_data = sd_rd_val_data;
//鎖相環(huán)
pll_clk u_pll_clk(
.areset (1'b0 ),
.inclk0 (sys_clk ),
.c0 (clk_100m ),
.c1 (clk_100m_shift ),
.c2 (clk_50m ),
.c3 (clk_50m_180deg ),
.c4 (clk_25m ),
.locked (locked )
);
//讀取SD NAND圖片
sd_read_photo u_sd_read_photo(
.clk (clk_50m),
//系統(tǒng)初始化完成之后,再開(kāi)始從SD NAND中讀取圖片
.rst_n (rst_n & sys_init_done),
.rd_busy (sd_rd_busy),
.rd_start_en (sd_rd_start_en),
.rd_sec_addr (sd_rd_sec_addr)
);
//SD NAND頂層控制模塊
sd_ctrl_top u_sd_ctrl_top(
.clk_ref (clk_50m),
.clk_ref_180deg (clk_50m_180deg),
.rst_n (rst_n),
//SD NAND接口
.sd_miso (sd_miso),
.sd_clk (sd_clk),
.sd_cs (sd_cs),
.sd_mosi (sd_mosi),
//用戶寫(xiě)SD NAND接口
.wr_start_en (1'b0), //不需要寫(xiě)入數(shù)據(jù),寫(xiě)入接口賦值為0
.wr_sec_addr (32'b0),
.wr_data (16'b0),
.wr_busy (),
.wr_req (),
//用戶讀SD NAND接口
.rd_start_en (sd_rd_start_en),
.rd_sec_addr (sd_rd_sec_addr),
.rd_busy (sd_rd_busy),
.rd_val_en (sd_rd_val_en),
.rd_val_data (sd_rd_val_data),
.sd_init_done (sd_init_done)
);
//SDRAM 控制器頂層模塊,封裝成FIFO接口
//SDRAM 控制器地址組成: {bank_addr[1:0],row_addr[12:0],col_addr[8:0]}
sdram_top u_sdram_top(
.ref_clk (clk_100m), //sdram 控制器參考時(shí)鐘
.out_clk (clk_100m_shift), //用于輸出的相位偏移時(shí)鐘
.rst_n (rst_n), //系統(tǒng)復(fù)位
//用戶寫(xiě)端口
.wr_clk (clk_50m), //寫(xiě)端口FIFO: 寫(xiě)時(shí)鐘
.wr_en (wr_en), //寫(xiě)端口FIFO: 寫(xiě)使能
.wr_data (wr_data), //寫(xiě)端口FIFO: 寫(xiě)數(shù)據(jù)
.wr_min_addr (24'd0), //寫(xiě)SDRAM的起始地址
.wr_max_addr (PHOTO_H_PIXEL*PHOTO_V_PIXEL),//寫(xiě)SDRAM的結(jié)束地址
.wr_len (10'd512), //寫(xiě)SDRAM時(shí)的數(shù)據(jù)突發(fā)長(zhǎng)度
.wr_load (~rst_n), //寫(xiě)端口復(fù)位: 復(fù)位寫(xiě)地址,清空寫(xiě)FIFO
//用戶讀端口
.rd_clk (clk_25m), //讀端口FIFO: 讀時(shí)鐘
.rd_en (rd_en), //讀端口FIFO: 讀使能
.rd_data (rd_data), //讀端口FIFO: 讀數(shù)據(jù)
.rd_min_addr (24'd0), //讀SDRAM的起始地址
.rd_max_addr (PHOTO_H_PIXEL*PHOTO_V_PIXEL),//讀SDRAM的結(jié)束地址
.rd_len (10'd512), //從SDRAM中讀數(shù)據(jù)時(shí)的突發(fā)長(zhǎng)度
.rd_load (~rst_n), //讀端口復(fù)位: 復(fù)位讀地址,清空讀FIFO
//用戶控制端口
.sdram_read_valid (1'b1), //SDRAM 讀使能
.sdram_pingpang_en (1'b0), //SDRAM 乒乓操作使能
.sdram_init_done (sdram_init_done), //SDRAM 初始化完成標(biāo)志
//SDRAM 芯片接口
.sdram_clk (sdram_clk), //SDRAM 芯片時(shí)鐘
.sdram_cke (sdram_cke), //SDRAM 時(shí)鐘有效
.sdram_cs_n (sdram_cs_n), //SDRAM 片選
.sdram_ras_n (sdram_ras_n), //SDRAM 行有效
.sdram_cas_n (sdram_cas_n), //SDRAM 列有效
.sdram_we_n (sdram_we_n), //SDRAM 寫(xiě)有效
.sdram_ba (sdram_ba), //SDRAM Bank地址
.sdram_addr (sdram_addr), //SDRAM 行/列地址
.sdram_data (sdram_data), //SDRAM 數(shù)據(jù)
.sdram_dqm (sdram_dqm) //SDRAM 數(shù)據(jù)掩碼
);
//VGA驅(qū)動(dòng)模塊
vga_driver u_vga_driver(
.vga_clk (clk_25m),
.sys_rst_n (rst_n),
.vga_hs (vga_hs),
.vga_vs (vga_vs),
.vga_rgb (vga_rgb),
.pixel_data (rd_data),
.data_req (rd_en), //請(qǐng)求像素點(diǎn)顏色數(shù)據(jù)輸入
.pixel_xpos (),
.pixel_ypos ()
);
endmodule
(2) PLL時(shí)鐘模塊
PLL時(shí)鐘模塊:PLL時(shí)鐘模塊通過(guò)調(diào)用鎖相環(huán)(PLL)IP核實(shí)現(xiàn),總共輸出五個(gè)時(shí)鐘,頻率分別為100Mhz、100Mhz(相位偏移-180度)、50Mhz、50Mhz(相位偏移180度)和25Mhz。 兩個(gè)100Mhz的時(shí)鐘用于為SDRAM控制器模塊提供驅(qū)動(dòng)時(shí)鐘;兩個(gè)50Mhz的時(shí)鐘用于為SD NAND控制器模塊提供驅(qū)動(dòng)時(shí)鐘;25Mhz用于為VGA驅(qū)動(dòng)模塊提供驅(qū)動(dòng)時(shí)鐘。
(3) SD NAND讀取圖片控制模塊
SD NAND讀取圖片控制模塊:SD NAND讀取圖片控制模塊通過(guò)控制SD NAND控制器的讀接口,從SD NAND中讀取圖像數(shù)據(jù),并在讀完一張圖片后延時(shí)一段時(shí)間,再去讀取另一張圖片數(shù)據(jù),實(shí)現(xiàn)兩張圖片的循環(huán)切換讀取。
此部分代碼:
網(wǎng)上學(xué)習(xí)資料一大堆,但如果學(xué)到的知識(shí)不成體系,遇到問(wèn)題時(shí)只是淺嘗輒止,不再深入研究,那么很難做到真正的技術(shù)提升。
需要這份系統(tǒng)化的資料的朋友,可以添加V獲?。簐ip204888 (備注大數(shù)據(jù))
一個(gè)人可以走的很快,但一群人才能走的更遠(yuǎn)!不論你是正從事IT行業(yè)的老鳥(niǎo)或是對(duì)IT行業(yè)感興趣的新人,都?xì)g迎加入我們的的圈子(技術(shù)交流、學(xué)習(xí)資源、職場(chǎng)吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習(xí)成長(zhǎng)!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-856760.html
D NAND讀取圖片控制模塊通過(guò)控制SD NAND控制器的讀接口,從SD NAND中讀取圖像數(shù)據(jù),并在讀完一張圖片后延時(shí)一段時(shí)間,再去讀取另一張圖片數(shù)據(jù),實(shí)現(xiàn)兩張圖片的循環(huán)切換讀取。
此部分代碼:
網(wǎng)上學(xué)習(xí)資料一大堆,但如果學(xué)到的知識(shí)不成體系,遇到問(wèn)題時(shí)只是淺嘗輒止,不再深入研究,那么很難做到真正的技術(shù)提升。
需要這份系統(tǒng)化的資料的朋友,可以添加V獲?。簐ip204888 (備注大數(shù)據(jù))
[外鏈圖片轉(zhuǎn)存中…(img-CxpREg1C-1713386078243)]文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-856760.html
一個(gè)人可以走的很快,但一群人才能走的更遠(yuǎn)!不論你是正從事IT行業(yè)的老鳥(niǎo)或是對(duì)IT行業(yè)感興趣的新人,都?xì)g迎加入我們的的圈子(技術(shù)交流、學(xué)習(xí)資源、職場(chǎng)吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習(xí)成長(zhǎng)!
到了這里,關(guān)于基于FPGA的SD NAND圖片顯示實(shí)現(xiàn)_sd-nand(2),被逼無(wú)奈開(kāi)始狂啃底層技術(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!