本设计使用的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这两个信号。 一个是有效信号,一个是数据。 我们用这两个信号就可以了。
获取的数据不能直接传输到HDMI进行显示。 因为OV5640模块生成的行信号非常差,有效信号不连续。 (OV5640一次传输8bit的数据,而RGB565格式要求每像素传输两次,因此有效信号每隔一个时钟周期生效。 )此外,根据OV5640的配置,模块的PCLK可能有效。 )
正点原子程序中,视频流存储在SDRAM中,但这里我的开发板资源很大,所以用BRAM安装了。
根据协议至寄存器的安排,输出视频流的大小为1024x768和每像素16位,因此产生以下大小的双端口BRAM
注:实际开发板上也有DDR3存储器,但是其需要用MIG IP核驱动,相对麻烦,在有处理器的SOC中可以用MIG内核,我也已经实现过,如果有空我就再写出来。
根据写入有效信号驱动写入地址变化
always@(posedgecam_pclk,negedge rst_n ) beginif(~rst_n ) begin addra=0; endelseBeginif(wr_en ) begin addra=addra 1; if(addra==20(HC0000-1 ) addra=0; 结束读取地址也同样实现
always@(Posedgeclk_65m,negedge rst_n ) Beginif(~rst_n ) begin addrb=0; endelseBeginif(rd_en ) begin addrb=addrb 1; if(addrb==20(HC0000-1 ) addrb=0; 结尾只需要最后连接到HDMI IP核心。 该IP核为24位,绿色和蓝色像素位置似乎相反,因此处理数据。
vid_pData={rd_data[15:11],3'b0,rd_data[4:0],3'b0,rd_data[10:5],2'b0}; 工程下载地址:
3359 download.csdn.net/download/dong ze2/11224991