FPGA统计摄像头输出-基于MD9T112

FPGA HDL源程序

FPGA统计摄像头的输出像素,窗口尺寸等等

//----------------------------------------------------------------------------
// user_logic.v - module
//----------------------------------------------------------------------------
//
// ***************************************************************************
// ** Copyright (c) 1995-2012 Xilinx, Inc.  All rights reserved.            **
// **                                                                       **
// ** Xilinx, Inc.                                                          **
// ** XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"         **
// ** AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND       **
// ** SOLUTIONS FOR XILINX DEVICES.  BY PROVIDING THIS DESIGN, CODE,        **
// ** OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,        **
// ** APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION           **
// ** THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,     **
// ** AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE      **
// ** FOR YOUR IMPLEMENTATION.  XILINX EXPRESSLY DISCLAIMS ANY              **
// ** WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE               **
// ** IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR        **
// ** REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF       **
// ** INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS       **
// ** FOR A PARTICULAR PURPOSE.                                             **
// **                                                                       **
// ***************************************************************************
//
//----------------------------------------------------------------------------
// Filename:          user_logic.v
// Version:           1.00.a
// Description:       User logic module.
// Date:              Fri Jun 13 15:26:29 2014 (by Create and Import Peripheral Wizard)
// Verilog Standard:  Verilog-2001
//----------------------------------------------------------------------------
// Naming Conventions:
//   active low signals:                    "*_n"
//   clock signals:                         "clk", "clk_div#", "clk_#x"
//   reset signals:                         "rst", "rst_n"
//   generics:                              "C_*"
//   user defined types:                    "*_TYPE"
//   state machine next state:              "*_ns"
//   state machine current state:           "*_cs"
//   combinatorial signals:                 "*_com"
//   pipelined or register delay signals:   "*_d#"
//   counter signals:                       "*cnt*"
//   clock enable signals:                  "*_ce"
//   internal version of output port:       "*_i"
//   device pins:                           "*_pin"
//   ports:                                 "- Names begin with Uppercase"
//   processes:                             "*_PROCESS"
//   component instantiations:              "<ENTITY_>I_<#|FUNC>"
//----------------------------------------------------------------------------

`uselib lib=unisims_ver
`uselib lib=proc_common_v3_00_a

module user_logic
(
  // -- ADD USER PORTS BELOW THIS LINE ---------------
  // --USER ports added here
  HREF_IN,
  VSYNC_IN,
  PCLK_IN,
  // -- ADD USER PORTS ABOVE THIS LINE ---------------

  // -- DO NOT EDIT BELOW THIS LINE ------------------
  // -- Bus protocol ports, do not add to or delete
  Bus2IP_Clk,                     // Bus to IP clock
  Bus2IP_Resetn,                  // Bus to IP reset
  Bus2IP_Data,                    // Bus to IP data bus
  Bus2IP_BE,                      // Bus to IP byte enables
  Bus2IP_RdCE,                    // Bus to IP read chip enable
  Bus2IP_WrCE,                    // Bus to IP write chip enable
  IP2Bus_Data,                    // IP to Bus data bus
  IP2Bus_RdAck,                   // IP to Bus read transfer acknowledgement
  IP2Bus_WrAck,                   // IP to Bus write transfer acknowledgement
  IP2Bus_Error                    // IP to Bus error response
  // -- DO NOT EDIT ABOVE THIS LINE ------------------
); // user_logic

// -- ADD USER PARAMETERS BELOW THIS LINE ------------
// --USER parameters added here
// -- ADD USER PARAMETERS ABOVE THIS LINE ------------

// -- DO NOT EDIT BELOW THIS LINE --------------------
// -- Bus protocol parameters, do not add to or delete
parameter C_NUM_REG                      = 4;
parameter C_SLV_DWIDTH                   = 32;
// -- DO NOT EDIT ABOVE THIS LINE --------------------

// -- ADD USER PORTS BELOW THIS LINE -----------------
// --USER ports added here
input VSYNC_IN;
input HREF_IN ;
input PCLK_IN ;
// -- ADD USER PORTS ABOVE THIS LINE -----------------

// -- DO NOT EDIT BELOW THIS LINE --------------------
// -- Bus protocol ports, do not add to or delete
input                                     Bus2IP_Clk;
input                                     Bus2IP_Resetn;
input      [C_SLV_DWIDTH-1 : 0]           Bus2IP_Data;
input      [C_SLV_DWIDTH/8-1 : 0]         Bus2IP_BE;
input      [C_NUM_REG-1 : 0]              Bus2IP_RdCE;
input      [C_NUM_REG-1 : 0]              Bus2IP_WrCE;
output     [C_SLV_DWIDTH-1 : 0]           IP2Bus_Data;
output                                    IP2Bus_RdAck;
output                                    IP2Bus_WrAck;
output                                    IP2Bus_Error;
// -- DO NOT EDIT ABOVE THIS LINE --------------------

//----------------------------------------------------------------------------
// Implementation
//----------------------------------------------------------------------------

  // --USER nets declarations added here, as needed for user logic

  // Nets for user logic slave model s/w accessible register example
  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg0;
  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg1;
  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg2;
  reg        [C_SLV_DWIDTH-1 : 0]           slv_reg3;
  wire       [3 : 0]                        slv_reg_write_sel;
  wire       [3 : 0]                        slv_reg_read_sel;
  reg        [C_SLV_DWIDTH-1 : 0]           slv_ip2bus_data;
  wire                                      slv_read_ack;
  wire                                      slv_write_ack;
  integer                                   byte_index, bit_index;

  // USER logic implementation added here

  // ------------------------------------------------------
  // Example code to read/write user logic slave model s/w accessible registers
  //
  // Note:
  // The example code presented here is to show you one way of reading/writing
  // software accessible registers implemented in the user logic slave model.
  // Each bit of the Bus2IP_WrCE/Bus2IP_RdCE signals is configured to correspond
  // to one software accessible register by the top level template. For example,
  // if you have four 32 bit software accessible registers in the user logic,
  // you are basically operating on the following memory mapped registers:
  //
  //    Bus2IP_WrCE/Bus2IP_RdCE   Memory Mapped Register
  //                     "1000"   C_BASEADDR + 0x0
  //                     "0100"   C_BASEADDR + 0x4
  //                     "0010"   C_BASEADDR + 0x8
  //                     "0001"   C_BASEADDR + 0xC
  //
  // ------------------------------------------------------

  assign
    slv_reg_write_sel = Bus2IP_WrCE[3:0],
    slv_reg_read_sel  = Bus2IP_RdCE[3:0],
    slv_write_ack     = Bus2IP_WrCE[0] || Bus2IP_WrCE[1] || Bus2IP_WrCE[2] || Bus2IP_WrCE[3],
    slv_read_ack      = Bus2IP_RdCE[0] || Bus2IP_RdCE[1] || Bus2IP_RdCE[2] || Bus2IP_RdCE[3];

  // implement slave model register(s)
  always @( posedge Bus2IP_Clk )
    begin

      if ( Bus2IP_Resetn == 1'b0 )
        begin
          slv_reg0 <= 0;
          slv_reg1 <= 0;
          slv_reg2 <= 0;
          slv_reg3 <= 0;
        end
      else
        case ( slv_reg_write_sel )
          4'b1000 :
            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
              if ( Bus2IP_BE[byte_index] == 1 )
                slv_reg0[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
          4'b0100 :
            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
              if ( Bus2IP_BE[byte_index] == 1 )
                slv_reg1[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
          4'b0010 :
            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
              if ( Bus2IP_BE[byte_index] == 1 )
                slv_reg2[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
          4'b0001 :
            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
              if ( Bus2IP_BE[byte_index] == 1 )
                slv_reg3[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
          default : begin
            slv_reg0 <= slv_reg0;
            slv_reg1 <= slv_reg1;
            slv_reg2 <= slv_reg2;
            slv_reg3 <= slv_reg3;
                    end
        endcase

    end // SLAVE_REG_WRITE_PROC

  // ------------------------------------------------------------
  // Example code to drive IP to Bus signals
  // ------------------------------------------------------------

  assign IP2Bus_Data = (slv_read_ack == 1'b1) ? slv_ip2bus_data :  0 ;
  assign IP2Bus_WrAck = slv_write_ack;
  assign IP2Bus_RdAck = slv_read_ack;
  assign IP2Bus_Error = 0;

wire rst 	;
assign rst = slv_reg0[0];

reg[3:0] frame_end = 0;
reg[31:0] frame_count = 0;  //2 times of frame

always @(posedge VSYNC_IN or negedge rst)
begin
	if(1'b0 == rst)
	begin
		frame_count <= 32'h0;
		frame_end   <= 4'b0 ;
	end
	else
	begin
		frame_count <= frame_count + 1'b1;
		frame_end   <= frame_end   + 1'b1;
	end
end

reg[15:0] colum_count = 0;
reg[11:0] colum_end  = 0;
wire [15:0] colum_count_wire;
assign colum_count_wire = ((4'hf != frame_end)&&(4'h1 != frame_end)) ? colum_count : 16'h0;

always @(posedge HREF_IN or negedge rst )
begin
	if(1'b0 == rst)
	begin
		colum_end	<= 12'h0;
		colum_count <= 16'h0;
	end
	else
	begin
		if((1'b1 == VSYNC_IN)&&(4'h1 == frame_end))
		begin
			colum_count <= colum_count + 1'b1;
			colum_end   <= colum_end + 1'b1;
		end
		else if (4'hf == frame_end)
		begin
			colum_count <= 16'h0;
			colum_end   <= colum_end + 1'b1;
		end
		else
		begin
			colum_count <= colum_count;
			colum_end   <= colum_end + 1'b1;
		end
	end
end

reg[15:0] row_count = 0;
wire[15:0] row_count_wire;
assign row_count_wire = ((12'hfff != colum_end)&&(12'h02 != colum_end)) ? row_count : 16'h0;

always @(posedge PCLK_IN or negedge rst )
begin
	if (1'b0 == rst)
	begin
		row_count  <= 16'h0;
	end
	else
	begin
		if((1'b1 == HREF_IN)&&(12'h02 == colum_end))
		begin
			row_count <= row_count + 1'b1;
		end
		else if (12'hfff == colum_end)
		begin
			row_count <= 16'h00;
		end
		else
		begin
			row_count <= row_count;
		end
	end
end

//statiscal the time of a frame
reg[31:0] pixel_count = 0;
wire [31:0] pixel_count_wire;
assign pixel_count_wire =  ((4'h1  != frame_end)&&(4'hf != frame_end)) ? pixel_count : 31'h0;

always @(posedge Bus2IP_Clk or negedge rst)
begin
	if (1'b0 == rst)
	begin
		pixel_count <= 32'h0;
	end
	else
	begin
		if(4'h1 == frame_end)
		begin
			pixel_count <= pixel_count + 1'b1 ;
		end
		else if (4'hf == frame_end)
		begin
			pixel_count <= 31'h0;
		end
		else
		begin
			pixel_count <= pixel_count;
		end
	end
end

wire[31:0] row_colum_count;
assign row_colum_count ={ colum_count_wire ,row_count_wire};
  // implement slave model register read mux
  always @( slv_reg_read_sel or slv_reg0 or slv_reg1 or slv_reg2 or slv_reg3 )
    begin 

      case ( slv_reg_read_sel )
        4'b1000 : slv_ip2bus_data <= slv_reg0;
        4'b0100 : slv_ip2bus_data <= row_colum_count;
        4'b0010 : slv_ip2bus_data <= frame_count;
        4'b0001 : slv_ip2bus_data <= pixel_count_wire;
        default : slv_ip2bus_data <= 0;
      endcase

    end // SLAVE_REG_READ_PROC

endmodule

SDK源程序

  printf("**********VmodCAM Image Statis Reret******\n");
  VMODCAM_STATISTICAL_mWriteSlaveReg0(XPAR_VMODCAM_STATISTICAL_0_BASEADDR,0,0);
  DelayMs(50);
  VMODCAM_STATISTICAL_mWriteSlaveReg0(XPAR_VMODCAM_STATISTICAL_0_BASEADDR,0,1);
  printf("********************end*******************\n");
if(BTNL == Status)
{
	    Status = VMODCAM_STATISTICAL_mReadSlaveReg1(XPAR_VMODCAM_STATISTICAL_0_BASEADDR,0);
	    printf("VMODCAM_STATISTICAL Image Size is               :%d  x  %d\n",Status&0xffff,Status>>16);
	    Status = VMODCAM_STATISTICAL_mReadSlaveReg2(XPAR_VMODCAM_STATISTICAL_0_BASEADDR,0);
	    printf("VMODCAM_STATISTICAL Image Frame Num is          :%d	      \n",Status);
	    Status = VMODCAM_STATISTICAL_mReadSlaveReg3(XPAR_VMODCAM_STATISTICAL_0_BASEADDR,0);
	    printf("VMODCAM_STATISTICAL Every Image Have clk Num is :%d		  \n",Status);
	    printf("VMODCAM_STATISTICAL Every Image Total Time is   :%d	ms	  \n",Status/100000);
}

输出RGB565分析

首先我们设置输出模式为RGB565:   IIC设置【Rx2797】为0x0020

				0x33,0x8C,0x27,0x97, // Output format; Context B shadow
				0x33,0x90,0x00,0x20, // RGB with BT656 codes
				0x33,0x8C,0x27,0x07, // Output width; Context B
				0x33,0x90,0x02,0x80, // 640
				0x33,0x8C,0x27,0x09, // Output height; Context B
				0x33,0x90,0x01,0xe0, // 480

注: VMODCAM_STATISTICAL Image Size is   :1280  x 480  其实就是标准的640 x 480 也就是480 行640 列 见下图

RGB565也就是一个像素占两个字节 奇字节分别是R7-R3 G7-G5

偶字节分别是G4-G3 B7-B3              其中G 占6个位

其他的类似。

参考:

datasheet             1/4-Inch 2Mp System-On-A-Chip (SOC) CMOS  Digital Image Sensor

http://blog.csdn.net/xiabodan/article/details/30256297

FPGA统计摄像头输出-基于MD9T112

时间: 2024-10-05 14:19:51

FPGA统计摄像头输出-基于MD9T112的相关文章

Debug格式化输出----基于C语言

Debug格式化输出----基于C语言 1. 使用宏实现 举例: #include <stdio.h> #define ECHO_COLOR_NONE "\033[0;0m" #define ECHO_COLOR_GREEN "\033[0;32m" #define debug(fmt, args...) printf(ECHO_COLOR_GREEN"Debug: " fmt "(file: %s, func: %s, l

Python中Counter统计数据输出具体办法

from collections import Counter # 列表 l_one = [1709020621, 1709020621, 1770603107, 1770603105, 1770603106, 1770603105, 1709020621] # 把列表换成字典统计 c = Counter(l_one) print(c) k = c.most_common(len(c)) # 找出全部元素从大到小的元素频率以及对应的次数. # 转化成列表形式,列表每一项又是元祖. print(k

JSP+MySQL进行数据统计并输出

/*省略连接数据库语句*/ 1 String sql="select sum(字段名) from 数据表名";//查询数据表的SQL语句 2 ResultSet rs=stmt.executeQuery(sql);//创建结果集并赋值 3 while(rs.next()){ 4 String a=rs.getString(1); 5 out.print(a);//输出结果a 6 } 运用sum函数计算字段(即数据表的某一列),可得出一个数据,所以用getString(1)获取该字符串.

GB28181接入摄像头输出可结构化分析的视频流

GB28181流媒体服务搭建 搭建入口,解压启动即用:https://www.liveqing.com/docs/download/LiveGBS.html 什么是视频结构化 视频结构化是对视频数据的结构化处理,对原始视频流进行分析,提取出关键数据,在一些智能化场景下建模使用. 开启输出RTSP 注意 在 Linux 下面开启 554 端口通常需要 root 权限, 需要以 sudo 来运行 livesms 服务程序 编辑 LiveSMS 压缩包下面的 livesms.ini > [rtsp]

OrangePI通过ffmpeg和nginx把摄像头输出为rtmp

首先安装点基础套件 sudo apt install -y ffmpeg libx264-dev libssl-dev yasm cmake 从源码编译安装ffmpeg 以上命令已经安装了发布版的ffmpeg,不过如果有需要,可以按照源码版的编译安装 git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg cd ffmpeg sudo ./configure --enable-shared --prefix=/usr/local/ffmpeg mak

编一个程序,输入10个整数,并放在数组中,先降序输出全部的数,再统计并输出当中正数、负数和零的个数

public class Demo1 { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); list.add(-1); list.add(-2); list.add(-4); list.add(0); list.add(2); list.add(5); list.add(9); list.add(7); list.add(-9); list.add(-7);

基于INTEL FPGA硬浮点DSP实现卷积运算

概述 卷积是一种线性运算,其本质是滑动平均思想,广泛应用于图像滤波.而随着人工智能及深度学习的发展,卷积也在神经网络中发挥重要的作用,如卷积神经网络.本参考设计主要介绍如何基于INTEL 硬浮点的DSP Block实现32位单精度浮点的卷积运算,而针对定点及低精度的浮点运算,则需要对硬浮点DSP Block进行相应的替换即可. 原理分析 设:f(x), g(x)是两个可积函数,作积分: 随着x的不同取值,该积分定义了一个新的函数h(x),称为函数f(x)与g(x)的卷积,记为h(x)=f(x)*

[PHP]基于Sort Set进行活跃用户统计

作者:zhanhailiang 日期:2014-12-14 参考文章: 使用Redis bitmap进行活跃用户统计 本文提供基于Sort Set进行活跃用户统计的PHP版本: https://github.com/billfeller/billfeller.github.io/blob/master/code/UserTj.php

基于iCamera测试光电大赛官方指定摄像头mt9m001调试小结

先看看官方的接口 组委会指定的模块接口 信号定义说明: VDD:3.3v GND:地 SCK:摄像头寄存器的iic配置信号的时钟线 SDA:摄像头寄存器的iic配置信号的数据线 XCLK:摄像头的主时钟输入,必须有时钟输入,对于我们的标准摄像头一般输入24Mhz时钟 PCLK:摄像头的像素时钟输出,只要摄像头模块正常,xclk输入后,pclk必定有对于的时钟输出. VS:摄像头的帧同步信号 HS:摄像头的行同步信号 D9-D0:视频数据口  默认接高八位,对齐即可,多余的悬空即可 其余信号:TR