本設計用到的FPGA開發板是Digilent Nexys_Video 開發板,程序的基礎是正點原子爲其FPGA產品提供的驅動程序,由於板子硬件的不同,我做了一些改動,使之能在Nexys_Video上運行,正點原子程序在其官網可以下載。HDMI驅動用的是Digilent提供的IP核,在其官網可以下載。
vivado 版本 2018.1
攝像頭用的是這個
首先用Clocking Wizard生成攝像頭核HDMI IP核需要的65M時鐘。
攝像頭的驅動是用SCCB協議配置寄存器,正點原子給提供了,直接用就好了。
在其驅動最後的輸出模塊中,輸出了兩個信號:分別是cmos_frame_valid,cmos_frame_data。一個是有效信號,一個是數據。我們就用這兩個信號就可以了。
在正點原子原程序中,視頻流會被存儲在SDRAM中,這裏由於我的開發板資源很大,用BRAM就裝下了。
根據協議對寄存器的配置,輸出視頻流大小爲1024x768,每一個像素點是16位,所以,生成如下大小的雙端口BRAM
注:實際開發板上也有DDR3存儲器,但是其需要用MIG IP核驅動,相對麻煩,在有處理器的SOC中可以用MIG內核,我也已經實現過,如果有空我就再寫出來。
根據寫有效信號驅動寫地址變化
always @(posedge cam_pclk,negedge rst_n) begin
if(~rst_n) begin
addra<=0;
end else begin
if(wr_en) begin
addra<=addra+1;
if(addra==20'hc0000-1) addra<=0;
end
end
end
讀地址同理實現
always @(posedge clk_65m,negedge rst_n) begin
if(~rst_n) begin
addrb<=0;
end else begin
if(rd_en) begin
addrb<=addrb+1;
if(addrb==20'hc0000-1) addrb<=0;
end
end
end
最後連上HDMI IP核即可。由於該IP核是24位,並且綠藍像素位置貌似反了,所以要對數據進行處理。
vid_pData<={rd_data[15:11],3'b0,rd_data[4:0],3'b0,rd_data[10:5],2'b0};
工程下載地址: