基于OV7670摄像头视频传输
系统总设计图
系统组成部分
摄像头初始化模块
摄像头初始化通过IIC协议或者SCCB协议写入寄存器改写数据。初始化之前满足的条件如图所示。
IIC初始化模块代码
module OV7670_INIT_IIC(Clk,Rst_n,Start,Iic_clk,Sda,Init_done
);
input Clk;
input Rst_n;
input Start;output Iic_clk;
inout Sda;
output reg Init_done;reg [7:0]data_cnt;//计数115个数据计数计数器
localparam DATA_SIZE = 8'd115;
wire [15:0]q_rom;
wire done_iic;
reg wr_en;
wire [7:0]wr_data;//写入的数据
wire [15:0]word_adrr;
reg [1:0]main_state;
wire ack ;
reg [9:0] cnt;
reg ok ;always @(posedge Clk or negedge Rst_n)if(!Rst_n)cnt <= 1'b0;elseif(done_iic)cnt <= 1'b0;elseif(cnt == 10'd99) //计数2uscnt <= 1'b0;elsecnt <= cnt + 1'b1;always @(posedge Clk or negedge Rst_n)if(!Rst_n)ok <= 1'b0;elseif(cnt == 10'd99)ok <= 1'b1;elseok <= 1'b0;always @(posedge Clk or negedge Rst_n)if(!Rst_n)data_cnt <= 1'b0;else if(Start)data_cnt <= 1'b0;else if(data_cnt < DATA_SIZE)beginif(done_iic && (!ack))data_cnt <= data_cnt + 1'b1;else data_cnt <= data_cnt;endelse data_cnt <= DATA_SIZE;//产生初始化完成标志信号
always @(posedge Clk or negedge Rst_n)if(!Rst_n)Init_done <= 1'b0;else if(data_cnt == DATA_SIZE)Init_done <= 1'b1;else Init_done <= 1'b0;//状态机发送数据
always @(posedge Clk or negedge Rst_n)if(!Rst_n)beginmain_state <= 2'b0;wr_en <= 1'b0;endelse beginif(data_cnt < DATA_SIZE)begincase(main_state)2'b0:beginif(Start) main_state <= 2'd1;else main_state <= 2'd0;end2'd1:beginwr_en <= 1'b1;main_state <= 2'd2;end2'd2:beginwr_en <= 1'b0;if(ok)main_state <= 2'd1;else main_state <= 2'd2;enddefault : main_state <= 1'b0;endcase endelse beginwr_en <= 1'b0;main_state <= 1'b0;endend//IIC模块
IIC IIC(.Clk(Clk),.Rst_n(Rst_n),.Wr(wr_en),.Read(1'b0),.Wdata_num(1),.Rdata_num(1'b1),.Address_num(2'd1),.Device_adress(8'h42), //器件片选地址.Word_adrr(word_adrr), //存储单元地址.Wr_data(wr_data),.Rd_data(),.Wr_data_vaule(),.Rd_data_vaule(),.Done(done_iic),.ack(ack),.Sda(Sda),.Iic_clk(Iic_clk)
);assign wr_data = q_rom[7:0];
assign word_adrr = q_rom[15:8];OV7670_TABLE_ROM OV7670_TABLE_ROM
(.addr(data_cnt),.clk(Clk), .q(q_rom)
);endmodule
IIC单次写入8位115个不同寄存器地址的数据。
IIC初始化模块问题与原因
使用IIC协议初始化失败的原因主要是IIC总线空闲时间太短,及上一次写入完成产生停止位(上升沿)与下一次开始写入产生起始位(下降沿)间隔时间太短,不满足摄像头器件要求。器件要求如图所示。
而使用逻辑分析仪测得实际波形如图所示。
由图可以清楚的看到,当IIC协议第二次写入不同的寄存器地址时,从机未产生应答位,导致初始化失败,实际的总线空闲时间为700ns。
SCCB初始化模块代码
module OV7670_INIT_SCCB(Clk ,Rst_n ,Start ,Sccb_clk ,Sda ,Init_done
);input Clk ;
input Rst_n ;
input Start ;
output Sccb_clk ;
output Sda ;
output reg Init_done ;
reg [7:0] addr_cnt ; //计数115次地址计数器
wire [15:0] q_rom ;
wire [7:0] wr_data ;
wire [7:0] word_adrr ;
wire wr_done ;
reg wr_en ;
reg [1:0] main_state ;localparam DATA_SIZE = 115 ;always @(posedge Clk or negedge Rst_n)if(!Rst_n)addr_cnt <= 1'b0;elseif(Start)addr_cnt <= 1'b0;elseif(addr_cnt < DATA_SIZE)beginif(wr_done)addr_cnt <= addr_cnt + 1'b1;elseaddr_cnt <= addr_cnt ; endelseaddr_cnt <= DATA_SIZE ;always @(posedge Clk or negedge Rst_n)if(!Rst_n)Init_done <= 1'b0;elseif(addr_cnt == DATA_SIZE)Init_done <= 1'b1;elseInit_done <= 1'b0;always @(posedge Clk or negedge Rst_n)if(!Rst_n)beginmain_state <= 2'b0;wr_en <= 1'b0;endelse beginif(addr_cnt < DATA_SIZE)begincase(main_state)2'b0:beginif(Start) main_state <= 2'd1;else main_state <= 2'd0;end2'd1:beginwr_en <= 1'b1;main_state <= 2'd2;end2'd2:beginwr_en <= 1'b0;if(wr_done)main_state <= 2'd1;enddefault : main_state <= 1'b0;endcase endelse beginwr_en <= 1'b0;main_state <= 1'b0;endendassign wr_data = q_rom[7:0] ;
assign word_adrr = q_rom[15:8] ;SCCB SCCB_inst(.Clk (Clk ) ,.Rst_n (Rst_n ) ,.Wr (wr_en ) ,.Wr_data (wr_data ) ,.Wr_data_vaule () ,.Wr_done (wr_done ) ,.Word_adrr (word_adrr ) , //存储单元地址.Device_adress (8'h42) , //器件地址.Read () , .Rd_data () ,.Rd_data_vaule () ,.Rd_done () ,.Sda (Sda ) ,.Sccb_clk (Sccb_clk )
);OV7670_TABLE_ROM OV7670_TABLE_ROM_insy
(.addr (addr_cnt ) ,.clk (Clk ) , .q (q_rom )
);endmodule
与IIC初始化代码基本相同,因为只写不读数据。
SCCB初始化遇到的问题及原因
SCCB模块代码中,在同一个always语句中第一个if语句判断优先级高于第二个if判断,由于初始化代码中的SCCB使能信号保持高电平导致一直产生SCCB协议时钟信号CLK,在CLK高电平时SDA信号未有产生下降沿及起始位,导致初始化失败。问题代码如图所示。
实际问题波形与正确波形比较如图所示。两个波形在CLK信号为高电平时产生上升沿即停止位,但是错误波形在CLK为高时没有产生下降沿即停止位。
摄像头DVP协议
使用IIC协议初始化摄像头(改写摄像头中的寄存器的值)
创建ROM,将IIC控制数据保存到ROM中,使用查找表输入到IIC控制。
module OV7670_TABLE_ROM
#(parameter DATA_WIDTH=16, parameter ADDR_WIDTH=8)
(input [(ADDR_WIDTH-1):0] addr,input clk, output reg [(DATA_WIDTH-1):0] q
);// Declare the ROM variablereg [DATA_WIDTH-1:0] rom[2**ADDR_WIDTH-1:0];// Initialize the ROM with $readmemb. Put the memory contents// in the file single_port_rom_init.txt. Without this file,// this design will not compile.// See Verilog LRM 1364-2001 Section 17.2.8 for details on the// format of this file, or see the "Using $readmemb and $readmemh"// template later in this section.initialbegin/*OV7670 VGA RGB565参数 */rom[0 ][15:0] = 16'h3a_04; //rom[1 ][15:0] = 16'h40_d0; rom[2 ][15:0] = 16'h12_04; //VGA,RGB输出//输出窗口设置rom[3 ][15:0] = 16'h32_b6; rom[4 ][15:0] = 16'h17_13; rom[5 ][15:0] = 16'h18_01; //5rom[6 ][15:0] = 16'h19_02; rom[7 ][15:0] = 16'h1a_7a; //0x7a,rom[8 ][15:0] = 16'h03_0a; //0x0a,rom[9 ][15:0] = 16'h0c_00; rom[10 ][15:0] = 16'h15_00; rom[11 ][15:0] = 16'h3e_00; //10rom[12 ][15:0] = 16'h70_00; rom[13 ][15:0] = 16'h71_01; rom[14 ][15:0] = 16'h72_11; rom[15 ][15:0] = 16'h73_00; //rom[16 ][15:0] = 16'ha2_02; //15rom[17 ][15:0] = 16'h11_80; //时钟分频设置,0,不分频.rom[18 ][15:0] = 16'h7a_20; rom[19 ][15:0] = 16'h7b_1c; rom[20 ][15:0] = 16'h7c_28;rom[21 ][15:0] = 16'h7d_3c; //20rom[22 ][15:0] = 16'h7e_55; rom[23 ][15:0] = 16'h7f_68; rom[24 ][15:0] = 16'h80_76; rom[25 ][15:0] = 16'h81_80;rom[26 ][15:0] = 16'h82_88; rom[27 ][15:0] = 16'h83_8f; rom[28 ][15:0] = 16'h84_96; rom[29 ][15:0] = 16'h85_a3; rom[30 ][15:0] = 16'h86_af;rom[31 ][15:0] = 16'h87_c4; //30rom[32 ][15:0] = 16'h88_d7; rom[33 ][15:0] = 16'h89_e8; rom[34 ][15:0] = 16'h13_e0; rom[35 ][15:0] = 16'h00_00; //AGCrom[36 ][15:0] = 16'h10_00; rom[37 ][15:0] = 16'h0d_00; rom[38 ][15:0] = 16'h14_28; //0x38, limit the max gainrom[39 ][15:0] = 16'ha5_05; rom[40 ][15:0] = 16'hab_07;rom[41 ][15:0] = 16'h24_75; //40rom[42 ][15:0] = 16'h25_63; rom[43 ][15:0] = 16'h26_A5; rom[44 ][15:0] = 16'h9f_78; rom[45 ][15:0] = 16'ha0_68;rom[46 ][15:0] = 16'ha1_03; //0x03,rom[47 ][15:0] = 16'ha6_df; //0xdf,rom[48 ][15:0] = 16'ha7_df; //0xdf,rom[49 ][15:0] = 16'ha8_f0; rom[50 ][15:0] = 16'ha9_90;rom[51 ][15:0] = 16'haa_94; //rom[52 ][15:0] = 16'h13_ef; rom[53 ][15:0] = 16'h0e_61; rom[54 ][15:0] = 16'h0f_4b; rom[55 ][15:0] = 16'h16_02;rom[56 ][15:0] = 16'h1e_11; //图像输出镜像控制.0x07,rom[57 ][15:0] = 16'h21_02; rom[58 ][15:0] = 16'h22_91; rom[59 ][15:0] = 16'h29_07; rom[60 ][15:0] = 16'h33_0b;rom[61 ][15:0] = 16'h35_0b; //60rom[62 ][15:0] = 16'h37_1d; rom[63 ][15:0] = 16'h38_71; rom[64 ][15:0] = 16'h39_2a; rom[65 ][15:0] = 16'h3c_78;rom[66 ][15:0] = 16'h4d_40; rom[67 ][15:0] = 16'h4e_20; rom[68 ][15:0] = 16'h69_00; rom[69 ][15:0] = 16'h6b_00; //PLL*4=48Mhzrom[70 ][15:0] = 16'h74_19; rom[71 ][15:0] = 16'h8d_4f;rom[72 ][15:0] = 16'h8e_00; //70rom[73 ][15:0] = 16'h8f_00; rom[74 ][15:0] = 16'h90_00; rom[75 ][15:0] = 16'h91_00; rom[76 ][15:0] = 16'h92_00; //0x19,//0x66rom[77 ][15:0] = 16'h96_00; rom[78 ][15:0] = 16'h9a_80; rom[79 ][15:0] = 16'hb0_84; rom[80 ][15:0] = 16'hb1_0c; rom[81 ][15:0] = 16'hb2_0e;rom[82 ][15:0] = 16'hb3_82; //80rom[83 ][15:0] = 16'hb8_0a; rom[84 ][15:0] = 16'h43_14; rom[85 ][15:0] = 16'h44_f0; rom[86 ][15:0] = 16'h45_34;rom[87 ][15:0] = 16'h46_58; rom[88 ][15:0] = 16'h47_28; rom[89 ][15:0] = 16'h48_3a; rom[90 ][15:0] = 16'h59_88; rom[91 ][15:0] = 16'h5a_88;rom[92 ][15:0] = 16'h5b_44; //90rom[93 ][15:0] = 16'h5c_67; rom[94 ][15:0] = 16'h5d_49; rom[95 ][15:0] = 16'h5e_0e; rom[96 ][15:0] = 16'h64_04; rom[97 ][15:0] = 16'h65_20;rom[98 ][15:0] = 16'h66_05; rom[99 ][15:0] = 16'h94_04; rom[100][15:0] = 16'h95_08; rom[101][15:0] = 16'h6c_0a; rom[102][15:0] = 16'h6d_55;rom[103][15:0] = 16'h4f_80; rom[104][15:0] = 16'h50_80; rom[105][15:0] = 16'h51_00; rom[106][15:0] = 16'h52_22; rom[107][15:0] = 16'h53_5e; rom[108][15:0] = 16'h54_80;rom[109][15:0] = 16'h09_03; //驱动能力最大rom[110][15:0] = 16'h6e_11; //100rom[111][15:0] = 16'h6f_9f; //0x9e for advance AWBrom[112][15:0] = 16'h55_00; //亮度rom[113][15:0] = 16'h56_40; //对比度rom[114][15:0] = 16'h57_80; //0x40, change according to Jim's request endalways @ (posedge clk)beginq <= rom[addr];endendmodule
DVP协议如图所示
PCLK:摄像头输出时钟信号传输FPGA,不同分辨率频率不同。
VSYNC: 传输一张图片产生两个VSYNC脉冲,脉冲之间的低电平传输一次显示的整张图片。
HREF:在VSYNC两次脉冲之间传输有效,一次HREF高电平表示传输一行图片像素点,第二个HREF高电平表示传输第二行图片像素点。
Data:输出为RGB565数据(红5位,绿6位,蓝5位, 节省存储空间,提高存储器带宽利用率)。在HREF为高电平时传有效数据,每个PCLK上升沿变换数据。
每一个像素点由RGB三种颜色表示,两个8位Data数据传输一个像素点RGB(16位)数据。
DVP模块设计图如图所示
DVP协议文件
module CAMERA_OV7670_DVP(Rst_n , Clk_cmos , //驱动摄像头时钟Cmos_pclk , //摄像头输入时钟Cmos_vsync ,Cmos_href ,Cmos_data ,Cmos_data_value ,Cmos_data_pixel ,Xaddress ,Yaddress ,Wr_rst , //·SDRAM中写缓存清零标志位Cmos_xclk );
input Cmos_pclk ;
input Rst_n ;
input Cmos_vsync ;
input Cmos_href ;
input [7:0] Cmos_data ;
input Clk_cmos ;output Cmos_data_value ;//一行传输一个像素点RGB数据有效标志位
output [15:0] Cmos_data_pixel ;
output [11:0] Xaddress ;
output [11:0] Yaddress ;
output Cmos_xclk ;
output reg Wr_rst ;reg mid_Cmos_vsync;
reg mid_Cmos_href;
reg [7:0]mid_Cmos_data;
reg [12:0]hcnt; //计数一行像素计数器 比地址多一位 地址两倍 每个像素点16位计数一个传8位
reg [11:0]ycnt; //计数多列像素计数器
reg [15:0]mid_Cmos_data_pixel;
reg mid_Cmos_data_value;//一行传输一个像素点RGB数据有效标志位
reg [3:0]del_frame_cnt;
reg delete_en;assign Cmos_data_pixel = mid_Cmos_data_pixel;
assign Cmos_data_value = mid_Cmos_data_value && delete_en;assign Cmos_xclk = Clk_cmos;always @(posedge Cmos_pclk or negedge Rst_n)if(!Rst_n)Wr_rst <= 1'b1;else if(mid_Cmos_vsync)Wr_rst <= 1'b0;elseWr_rst <= Wr_rst;always @(posedge Cmos_pclk or negedge Rst_n) //快速IO 使用IO寄存器提高时序性能if(!Rst_n)beginmid_Cmos_href <= 1'b0;mid_Cmos_vsync <= 1'b0;mid_Cmos_data <= 8'd0;endelse beginmid_Cmos_href <= Cmos_href; mid_Cmos_vsync <= Cmos_vsync;mid_Cmos_data <= Cmos_data;end//计数每行Cmos_data数据,每个Cmos_data8位
always @(posedge Cmos_pclk or negedge Rst_n)if(!Rst_n)hcnt <= 1'b0;else if(mid_Cmos_href)hcnt <= hcnt + 1'b1;else hcnt <= 1'b0;assign Xaddress = hcnt[12:1]; //取高12位 相当于右移 FPGA避免除法//输出两个Cmos_data8位数据 组成一个像素点16位数据
always @(posedge Cmos_pclk or negedge Rst_n)if(!Rst_n)mid_Cmos_data_pixel <= 16'd0;else if(!hcnt[0]) //偶数传高8位 奇数传低8位mid_Cmos_data_pixel[15:8] <= mid_Cmos_data; //偶数else mid_Cmos_data_pixel[7:0] <= mid_Cmos_data;//一个像素点RGB数据传输成功标志信号
always @(posedge Cmos_pclk or negedge Rst_n)if(!Rst_n)mid_Cmos_data_value <= 1'd0;else if(hcnt[0]) mid_Cmos_data_value <= 1'd1; //奇数else mid_Cmos_data_value <= 1'd0;//多列计数器计数多列像素点
always @(posedge Cmos_pclk or negedge Rst_n)if(!Rst_n)ycnt <= 1'b0;else if(mid_Cmos_vsync)ycnt <= 1'b0;else if({mid_Cmos_href,Cmos_href} == 2'b01) //检测mid_Cmos_href上升沿 前 后ycnt <= ycnt + 1'b1;else ycnt <= ycnt;assign Yaddress = ycnt;//舍弃前10帧
always @(posedge Cmos_pclk or negedge Rst_n)if(!Rst_n)del_frame_cnt <= 1'b0;else if({mid_Cmos_vsync,Cmos_vsync} == 2'b01)beginif(del_frame_cnt >= 4'd10) //高速数据del_frame_cnt <= 4'd10;else del_frame_cnt <= del_frame_cnt + 1'b1;endelsedel_frame_cnt <= del_frame_cnt;always @(posedge Cmos_pclk or negedge Rst_n)if(!Rst_n)delete_en <= 1'b0;else if(del_frame_cnt >= 4'd10)delete_en <= 1'b1;else delete_en <= 1'b0;endmodule
模拟摄像头信号仿真DVP接口
`timescale 1ns/1ns
`define Clk_period 60
module CAMERA_OV7670_DVP_tb;
reg Pclk;
reg Rst_n;
reg Vsync;
reg Href;
reg [7:0]Data;wire Data_value;
wire [15:0]Data_pixel;
wire [11:0]Xaddress;
wire [11:0]Yaddress;
CAMERA_OV7670_DVP CAMERA_OV7670_DVP(.Pclk(Pclk),.Rst_n(Rst_n),.Vsync(Vsync),.Href(Href),.Data(Data),.Data_value(Data_value),.Data_pixel(Data_pixel),.Xaddress(Xaddress),.Yaddress(Yaddress)
);integer i,j ; //定义变量
parameter WITH = 16;
parameter HIGH = 12;initial Pclk = 1;
always #(`Clk_period) Pclk = ~Pclk;initial
begin
Rst_n = 0;
Vsync = 0;
Href = 0;
Data = 0;
#(200+1);
Rst_n = 1;
#200;
repeat(15)beginVsync = 1;#200;Vsync = 0; #300for(i=0;i<HIGH;i=i+1)beginfor(j=0;j<WITH;j=j+1)beginHref = 1;Data = Data + 1;#(`Clk_period*2);endHref = 0;#400; endend$stop;
end
endmodule
仿真结果如图所示
Cmos_data_pixel输出Cmos_data位拼接的16位数据.
实际IIC与DVP协议波形
与设计波形一致。
系统顶层文件代码
`include "disp_parameter.v"module DVP_SDRAM_VGA(//global port
input wire Clk ,
input wire Rst_n ,//camera interface
input wire Cmos_pclk ,
input wire Cmos_vsync ,
input wire Cmos_href ,
input wire [7:0] Cmos_data ,
output wire Cmos_xclk , //驱动摄像头时钟
output wire Cmos_sclk ,
inout wire Cmos_sda ,
output wire Cmos_pwdn ,
output wire Cmos_rst_n ,//SDRAM port
output wire Sdram_clk ,
output wire Sdram_cke ,
output wire Sdram_cs_n ,
output wire Sdram_cas_n ,
output wire Sdram_ras_n ,
output wire Sdram_we_n ,
output wire [1:0] Sdram_ba ,
output wire [12:0] Sdram_addr ,
inout wire [15:0] Sdram_dq ,
output wire [1:0] Sdram_dqm , //VGA port
output wire [`Red_Bits - 1 :0] Disp_red ,
output wire [`Green_Bits - 1 :0] Disp_green ,
output wire [`Blue_Bits - 1 :0] Disp_blue ,
output wire Hsync ,
output wire Vsync ,
output wire Clk_vga ,
output wire Clk_blk );reg [31:0] cnt ;
wire go ;
wire sys_rst_n ;
wire clk_cmos_24M ;
wire clk_100M ;
wire clk_shift_100M ;
wire clk_vga_24M ;
wire lock ;
wire init_done ;
wire wr_req ; //读SDRAM请求信号
wire [15:0] data_cmos ; //摄像头信号
wire pix_reg ;
wire [15:0] pix_data ;
wire wr_rst ;
wire [10:0] pix_x ;
wire [10:0] pix_y ;
wire rd_value_r ;
reg rd_value ;assign Cmos_pwdn = 1'b0;
assign Cmos_rst_n = (cnt > 32'd175_000); //3.5msassign sys_rst_n = Rst_n && lock;always @(posedge Clk or negedge Rst_n)if(!Rst_n)cnt <= 1'b0 ;elseif(cnt < 32'd6500_001) // 6.5mscnt <= cnt + 1'b1 ;elsecnt <= cnt ;assign go = (cnt == 32'd6500_000 ) ? 1'b1:1'b0;assign rd_value_r = ((pix_x == 0) && (pix_y == 0))?1'b1:1'b0; //读缓存模块清零标志位always @(posedge Clk or negedge Rst_n)if(!Rst_n)rd_value <= 1'b0;elseif(rd_value_r)rd_value <= 1'b1;elserd_value <= rd_value ;pll pll_inst (.areset ( !Rst_n ),.inclk0 ( Clk ),.c0 ( clk_cmos_24M ),.c1 ( clk_100M ),.c2 ( clk_shift_100M ),.c3 ( clk_vga_24M ),.locked ( lock ));OV7670_INIT_IIC OV7670_INIT_IIC_inst(.Clk (Clk ) ,.Rst_n (sys_rst_n ) ,.Start (go ) ,.Iic_clk (Cmos_sclk ) ,.Sda (Cmos_sda ) ,.Init_done (init_done )
);CAMERA_OV7670_DVP CAMERA_OV7670_DVP_inst(.Rst_n (sys_rst_n) , .Clk_cmos (clk_cmos_24M) , //驱动摄像头时钟.Cmos_pclk (Cmos_pclk ) , //摄像头输入时钟.Cmos_vsync (Cmos_vsync) ,.Cmos_href (Cmos_href ) ,.Cmos_data (Cmos_data ) ,.Cmos_data_value (wr_req ) ,.Cmos_data_pixel (data_cmos) ,.Xaddress () ,.Yaddress () ,.Wr_rst (wr_rst) ,.Cmos_xclk (Cmos_xclk) );SDRAM_TOP SDRAM_TOP_inst(.Clk (clk_100M) ,.Rst_n (sys_rst_n) ,.Clk_out (clk_shift_100M) , //输入相位偏移时钟.Wr_fifo_wr_clk (Cmos_pclk) , .Wr_fifo_wr_req (wr_req) ,.Wr_fifo_wr_data (data_cmos) , //写入写FIFO中的.Sdram_wr_b_addr (0) ,.Sdram_wr_e_addr (640*480) ,.Wr_burst_len (10'd512) ,.Wr_rst (!sys_rst_n) , //写复位信号.Rd_fifo_rd_clk (clk_vga_24M) ,.Rd_fifo_rd_req (pix_reg) ,.Sdram_rd_b_addr (0) ,.Sdram_rd_e_addr (640*480) ,.Rd_burst_len (10'd512) , //读突发长度.Rd_rst (!sys_rst_n) , //读复位信号.Rd_value (rd_value) ,.Rd_fifo_rd_data (pix_data) , //读FIFO中读出的数据.Rd_fifo_num () , //读FIFO中存在的数据个数.Sdram_clk (Sdram_clk ) ,.Sdram_cke (Sdram_cke ) , .Sdram_cs_n (Sdram_cs_n ) ,.Sdram_cas_n (Sdram_cas_n) ,.Sdram_ras_n (Sdram_ras_n) ,.Sdram_we_n (Sdram_we_n ) ,.Sdram_ba (Sdram_ba ) ,.Sdram_addr (Sdram_addr ) ,.Sdram_dq (Sdram_dq ) , // SDRAM 数据总线.Sdram_dqm (Sdram_dqm ) );VGA_CTRL VGA_CTRL_inst(.Clk (clk_vga_24M) , .Rst_n (sys_rst_n) ,.Pix_data ({pix_data[15:11],3'd0,pix_data[10:5],2'd0,pix_data[4:0],3'd0}) , //R G B.Disp_red (Disp_red ) ,.Disp_green (Disp_green) ,.Disp_blue (Disp_blue ) ,.Hsync (Hsync ) ,.Vsync (Vsync ) ,.Pix_x (pix_x) ,.Pix_y (pix_y) ,.Clk_vga (Clk_vga) ,.Vga_blk (Clk_blk) , //VGA 场消隐信号.Pix_reg (pix_reg)
); // VGA_CTRL VGA_CTRL_inst(// .Clk (clk_vga_24M) , // .Rst_n (sys_rst_n) ,// .Pix_data (pix_data) , //R G B// .Disp_red (Disp_red ) ,// .Disp_green (Disp_green) ,// .Disp_blue (Disp_blue ) , // .Hsync (Hsync ) ,// .Vsync (Vsync ) ,// .Pix_x (pix_x) ,// .Pix_y (pix_y) ,// .Clk_vga (Clk_vga) ,// .Vga_blk (Clk_blk) , //VGA 场消隐信号// .Pix_reg (pix_reg)
// ); endmodule
在文件中调用"disp_parameter.v"文件,可以选择RGB565或者RGB888模式展示。
实际运行如图所示。
基于OV7670摄像头视频传输相关推荐
- 挑战一个人搭建一套完整直播系统4: 实现网络摄像头视频传输
摄像头采购的是海康卫视的网络摄像头: 支持通过rtsp传输视频流,网络摄像头的配置如下: ffmpeg可以直接通过rtsp获取摄像头视频数据并推流到我们之前搭建好的Nginx服务,具体指令如下: ff ...
- python 通过socket通讯实现实时摄像头视频传输
话不多说,直接上代码: 这是服务端代码: import socket import cv2 import numpy as npsk = socket.socket() # sk.setsockopt ...
- 移植摄像头视频传输JPEG格式代码学习过程
目录 理解厂家的源代码 ov2640.c文件 DCMI.c文件 SCCB.c文件 main.c文件 总结 理解厂家的源代码 这里我使用的是普中的ov2640模块 ov2640.c文件 返回值:0,成功 ...
- 【正点原子FPGA连载】第三十六章 基于OV5640的PL以太网视频传输实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...
- Android 手机采集摄像头视频 socket 视频传输实时传播
这里搜集了两种实现Android 手机采集摄像头视频 socket 视频传输实时传播的方法,两种都可以使用. 第一种如下: 1.通过客户端socket请求,服务端接受到请求后,获取socket的输出流 ...
- 摄像头视频采集压缩及传输
摄像头视频采集压缩及传输 引言: 摄像头基本的功能还是视频传输,那么它是依靠怎样的原理来实现的呢?所谓视频传输: 就是将图片一张张传到屏幕,由于传输速度很快,所以可以让大家看到连续动态的画面,就像放电 ...
- 【OV7670】基于FPGA的OV7670摄像头介绍和使用
1.软件版本 quartusii12.1 2.本算法理论知识 OV7670摄像头模块 带384Kb FIFO 数字摄像头 手动变焦 OV7670总共有656*488个像素,其中640*480个有效 ...
- 基于ffmpeg+SDL 实时播放摄像头视频
基于ffmpeg+SDL 实时播放摄像头视频 基本流程 udp接收rtp数据流接收一帧数据后,转换为NAL单元送去解码 (这里特别说明一下,我本次用的接口是支持从连续数据流中自动分割出一个个NAL的, ...
- 【正点原子FPGA连载】第三十章 基于OV5640的PL以太网视频传输实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
最新文章
- Kafka的生产者优秀架构设计
- python迭代器两个基本方法可供参考_浅析python迭代器和生成器
- 一、自然语言处理概述
- php rabbitmq demo
- XML序列化和反序列化 以及相关类的写法
- ubuntu16.04 安装composer 以及 laravel
- 毁前的圆明园竟然这么美
- Android特色开发之账户管理
- p值小于0.05拒绝还是接受_干货:关乎你的实验成败,0.05这个值不容小觑!
- 微信公众号排版 | 汇总和实战
- layabox游戏开发经验分享2
- Windows下的conda换源和pip换源
- GWAS相关的曼哈顿图-SNP密度图
- 职场的5个时间管理技巧
- 国企直招,内推! 科陆电子--嵌入式工程师/C# 工程师
- 创建区块计算次数_区块链计算的四个阶段
- SCI、SCI期刊与SCI论文的区别
- php crypt函数缓冲区溢出漏洞,GIMP 堆缓冲区溢出漏洞(CVE-2017-17784)
- sql日志的详细打印的配置
- 【多项式】CQBZOJ 3773 多项式计算五合一