转自:http://lauri.xn–vsandi-pxa.com/hdl/zynq/zybo-ov7670-to-vga.html


Piping OV7670 video to VGA output on ZYBO10. Nov ‘14


Introduction

Before getting into more complex topics such as AXI Stream and direct memory access, it’s recommended to first get familiar with pixel data encoding schemes and video timing signals. Hamsterworks has great examples for Zynq boards [1]. In this example VGA frames are grabbed from OV7670 chipset based camera and stored in Block RAM based framebuffer.

Omnivision OV7670 is a cheap 640x480 30fps camera module.

ZYBO is however more resource constrained so several modifications were required. In this case we’re reducing the vertical resolution twofold since ZYBO does not have enough Block RAM to contain whole VGA frame. The example is basically working on ZYBO, but there are still few bugs that need to be ironed out.

[1] http://hamsterworks.co.nz/mediawiki/index.php/OV7670_camera


Capture block

The capture block parses VSYNC and HREF signals and converts them into block RAM address. Pixel data is also a bit tricky - OV7670 transmits half of an 16-bit RGB (5:6:5) pixel during one PCLK cycle. Capture block latches the previous half and combines two halves into 12-bit RGB (4:4:4) pixel which is stored in block RAM. You are encouraged to use logic analyzer to debug video timing signals, as connecting wires to VGA output while display is connected is troublesome you might have to route extra pins onto Pmod connectors for debugging purposes.

----------------------------------------------------------------------------------
-- Engineer: Mike Field <hamster@snap.net.nz>
--
-- Description: Captures the pixels coming from the OV7670 camera and
--              Stores them in block RAM
----------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.ALL;
use ieee.NUMERIC_STD.ALL;entity ov7670_capture isport (pclk  : in   std_logic;vsync : in   std_logic;href  : in   std_logic;d     : in   std_logic_vector ( 7 downto 0);addr  : out  std_logic_vector (17 downto 0);dout  : out  std_logic_vector (11 downto 0);we    : out  std_logic);
end ov7670_capture;architecture behavioral of ov7670_capture issignal d_latch      : std_logic_vector(15 downto 0) := (others => '0');signal address      : std_logic_vector(18 downto 0) := (others => '0');signal address_next : std_logic_vector(18 downto 0) := (others => '0');signal wr_hold      : std_logic_vector( 1 downto 0)  := (others => '0');beginaddr <= address(18 downto 1);process(pclk)beginif rising_edge(pclk) then-- This is a bit tricky href starts a pixel transfer that takes 3 cycles--        Input   | state after clock tick--         href   | wr_hold    d_latch           d                 we address  address_next-- cycle -1  x    |    xx      xxxxxxxxxxxxxxxx  xxxxxxxxxxxxxxxx  x   xxxx     xxxx-- cycle 0   1    |    x1      xxxxxxxxRRRRRGGG  xxxxxxxxxxxxxxxx  x   xxxx     addr-- cycle 1   0    |    10      RRRRRGGGGGGBBBBB  xxxxxxxxRRRRRGGG  x   addr     addr-- cycle 2   x    |    0x      GGGBBBBBxxxxxxxx  RRRRRGGGGGGBBBBB  1   addr     addr+1if vsync = '1' thenaddress <= (others => '0');address_next <= (others => '0');wr_hold <= (others => '0');else-- This should be a different order, but seems to be GRB!dout    <= d_latch(15 downto 12) & d_latch(10 downto 7) & d_latch(4 downto 1);address <= address_next;we      <= wr_hold(1);wr_hold <= wr_hold(0) & (href and not wr_hold(0));d_latch <= d_latch( 7 downto  0) & d;if wr_hold(1) = '1' thenaddress_next <= std_logic_vector(unsigned(address_next)+1);end if;end if;end if;end process;
end behavioral;

Video output block

VGA output block generates HSYNC and VSYNC signals for the video outputs and corresponding input for the read address.

----------------------------------------------------------------------------------
-- Engineer: Mike Field <hamster@snap.net.nz>
--
-- Description: Generate analog 640x480 VGA, double-doublescanned from 19200 bytes of RAM
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;entity ov7670_vga isport (clk25       : in  STD_LOGIC;vga_red     : out STD_LOGIC_VECTOR(4 downto 0);vga_green   : out STD_LOGIC_VECTOR(5 downto 0);vga_blue    : out STD_LOGIC_VECTOR(4 downto 0);vga_hsync   : out STD_LOGIC;vga_vsync   : out STD_LOGIC;frame_addr  : out STD_LOGIC_VECTOR(17 downto 0);frame_pixel : in  STD_LOGIC_VECTOR(11 downto 0));
end ov7670_vga;architecture Behavioral of ov7670_vga is-- Timing constantsconstant hRez       : natural := 640;constant hStartSync : natural := 640+16;constant hEndSync   : natural := 640+16+96;constant hMaxCount  : natural := 800;constant vRez       : natural := 480;constant vStartSync : natural := 480+10;constant vEndSync   : natural := 480+10+2;constant vMaxCount  : natural := 480+10+2+33;constant hsync_active : std_logic := '0';constant vsync_active : std_logic := '0';signal hCounter : unsigned( 9 downto 0) := (others => '0');signal vCounter : unsigned( 9 downto 0) := (others => '0');signal address  : unsigned(18 downto 0) := (others => '0');signal blank    : std_logic := '1';beginframe_addr <= std_logic_vector(address(18 downto 1));process(clk25)beginif rising_edge(clk25) then-- Count the lines and rowsif hCounter = hMaxCount-1 thenhCounter <= (others => '0');if vCounter = vMaxCount-1 thenvCounter <= (others => '0');elsevCounter <= vCounter+1;end if;elsehCounter <= hCounter+1;end if;if blank = '0' thenvga_red   <= frame_pixel(11 downto 8) & "0";vga_green <= frame_pixel( 7 downto 4) & "00";vga_blue  <= frame_pixel( 3 downto 0) & "0";elsevga_red   <= (others => '0');vga_green <= (others => '0');vga_blue  <= (others => '0');end if;if vCounter  >= vRez thenaddress <= (others => '0');blank <= '1';elseif hCounter  < 640 thenblank <= '0';address <= address+1;elseblank <= '1';end if;end if;-- Are we in the hSync pulse? (one has been added to include frame_buffer_latency)if hCounter > hStartSync and hCounter <= hEndSync thenvga_hSync <= hsync_active;elsevga_hSync <= not hsync_active;end if;-- Are we in the vSync pulse?if vCounter >= vStartSync and vCounter < vEndSync thenvga_vSync <= vsync_active;elsevga_vSync <= not vsync_active;end if;end if;end process;
end Behavioral;

It essentially plays the role of video card in a PC.


Controller block

Omnivision OV7670 uses Omnivision Serial Camera Control Bus (SCCB) protocol to set up the camera parameters. SCCB actually is I²C-compliant interface, but avoids the usage of I²C brand due to licensing fees [2]. The controller component is composed of three components: I²C bus master, OV7670 instructions and glue code.

The first one is used to emulate I²C bus master:

----------------------------------------------------------------------------------
-- Engineer: <mfield@concepts.co.nz
--
-- Description: Send the commands to the OV7670 over an I2C-like interface
----------------------------------------------------------------------------------library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;entity i2c_sender isport (clk   : in    std_logic;siod  : inout std_logic;sioc  : out   std_logic;taken : out   std_logic;send  : in    std_logic;id    : in    std_logic_vector(7 downto 0);reg   : in    std_logic_vector(7 downto 0);value : in    std_logic_vector(7 downto 0));
end i2c_sender;architecture behavioral of i2c_sender is-- this value gives a 254 cycle pause before the initial frame is sentsignal   divider  : unsigned (7 downto 0) := "00000001";signal   busy_sr  : std_logic_vector(31 downto 0) := (others => '0');signal   data_sr  : std_logic_vector(31 downto 0) := (others => '1');
beginprocess(busy_sr, data_sr(31))beginif busy_sr(11 downto 10) = "10" orbusy_sr(20 downto 19) = "10" orbusy_sr(29 downto 28) = "10"  thensiod <= 'Z';elsesiod <= data_sr(31);end if;end process;process(clk)beginif rising_edge(clk) thentaken <= '0';if busy_sr(31) = '0' thenSIOC <= '1';if send = '1' thenif divider = "00000000" thendata_sr <= "100" &   id & '0'  &   reg & '0' & value & '0' & "01";busy_sr <= "111" & "111111111" & "111111111" & "111111111" & "11";taken <= '1';elsedivider <= divider+1; -- this only happens on powerupend if;end if;elsecase busy_sr(32-1 downto 32-3) & busy_sr(2 downto 0) iswhen "111"&"111" => -- start seq #1case divider(7 downto 6) iswhen "00"   => SIOC <= '1';when "01"   => SIOC <= '1';when "10"   => SIOC <= '1';when others => SIOC <= '1';end case;when "111"&"110" => -- start seq #2case divider(7 downto 6) iswhen "00"   => SIOC <= '1';when "01"   => SIOC <= '1';when "10"   => SIOC <= '1';when others => SIOC <= '1';end case;when "111"&"100" => -- start seq #3case divider(7 downto 6) iswhen "00"   => SIOC <= '0';when "01"   => SIOC <= '0';when "10"   => SIOC <= '0';when others => SIOC <= '0';end case;when "110"&"000" => -- end seq #1case divider(7 downto 6) iswhen "00"   => SIOC <= '0';when "01"   => SIOC <= '1';when "10"   => SIOC <= '1';when others => SIOC <= '1';end case;when "100"&"000" => -- end seq #2case divider(7 downto 6) iswhen "00"   => SIOC <= '1';when "01"   => SIOC <= '1';when "10"   => SIOC <= '1';when others => SIOC <= '1';end case;when "000"&"000" => -- Idlecase divider(7 downto 6) iswhen "00"   => SIOC <= '1';when "01"   => SIOC <= '1';when "10"   => SIOC <= '1';when others => SIOC <= '1';end case;when others      =>case divider(7 downto 6) iswhen "00"   => SIOC <= '0';when "01"   => SIOC <= '1';when "10"   => SIOC <= '1';when others => SIOC <= '0';end case;end case;if divider = "11111111" thenbusy_sr <= busy_sr(32-2 downto 0) & '0';data_sr <= data_sr(32-2 downto 0) & '1';divider <= (others => '0');elsedivider <= divider+1;end if;end if;end if;end process;
end behavioral;

The second one contains OV7670 setup instructions:

-- Company:
-- Engineer: Mike Field <hamster@sanp.net.nz>
--
-- Description: Register settings for the OV7670 Caamera (partially from OV7670.c
--              in the Linux Kernel
-- Edited by : Christopher Wilson <wilson@chrec.org>
------------------------------------------------------------------------------------
--
-- Notes:
-- 1) Regarding the WITH SELECT Statement:
--      WITH sreg(sel) SELECT
--           finished    <= '1' when x"FFFF",
--                        '0' when others;
-- This means the transfer is finished the first time sreg ends up as "FFFF",
-- I.E. Need Sequential Addresses in the below case statements
--
-- Common Debug Issues:
--
-- Red Appearing as Green / Green Appearing as Pink
-- Solution: Register Corrections Below
--
--
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;entity ov7670_registers isPort ( clk      : in  STD_LOGIC;resend   : in  STD_LOGIC;advance  : in  STD_LOGIC;command  : out  std_logic_vector(15 downto 0);finished : out  STD_LOGIC);
end ov7670_registers;architecture Behavioral of ov7670_registers issignal sreg   : std_logic_vector(15 downto 0);signal address : std_logic_vector(7 downto 0) := (others => '0');
begincommand <= sreg;with sreg select finished  <= '1' when x"FFFF", '0' when others;process(clk)beginif rising_edge(clk) thenif resend = '1' thenaddress <= (others => '0');elsif advance = '1' thenaddress <= std_logic_vector(unsigned(address)+1);end if;case address iswhen x"00" => sreg <= x"1280"; -- COM7   Resetwhen x"01" => sreg <= x"1280"; -- COM7   Resetwhen x"02" => sreg <= x"1204"; -- COM7   Size & RGB outputwhen x"03" => sreg <= x"1100"; -- CLKRC  Prescaler - Fin/(1+1)when x"04" => sreg <= x"0C00"; -- COM3   Lots of stuff, enable scaling, all others offwhen x"05" => sreg <= x"3E00"; -- COM14  PCLK scaling offwhen x"06" => sreg <= x"8C00"; -- RGB444 Set RGB formatwhen x"07" => sreg <= x"0400"; -- COM1   no CCIR601when x"08" => sreg <= x"4010"; -- COM15  Full 0-255 output, RGB 565when x"09" => sreg <= x"3a04"; -- TSLB   Set UV ordering,  do not auto-reset windowwhen x"0A" => sreg <= x"1438"; -- COM9  - AGC Cellingwhen x"0B" => sreg <= x"4f40"; --x"4fb3"; -- MTX1  - colour conversion matrixwhen x"0C" => sreg <= x"5034"; --x"50b3"; -- MTX2  - colour conversion matrixwhen x"0D" => sreg <= x"510C"; --x"5100"; -- MTX3  - colour conversion matrixwhen x"0E" => sreg <= x"5217"; --x"523d"; -- MTX4  - colour conversion matrixwhen x"0F" => sreg <= x"5329"; --x"53a7"; -- MTX5  - colour conversion matrixwhen x"10" => sreg <= x"5440"; --x"54e4"; -- MTX6  - colour conversion matrixwhen x"11" => sreg <= x"581e"; --x"589e"; -- MTXS  - Matrix sign and auto contrastwhen x"12" => sreg <= x"3dc0"; -- COM13 - Turn on GAMMA and UV Auto adjustwhen x"13" => sreg <= x"1100"; -- CLKRC  Prescaler - Fin/(1+1)when x"14" => sreg <= x"1711"; -- HSTART HREF start (high 8 bits)when x"15" => sreg <= x"1861"; -- HSTOP  HREF stop (high 8 bits)when x"16" => sreg <= x"32A4"; -- HREF   Edge offset and low 3 bits of HSTART and HSTOPwhen x"17" => sreg <= x"1903"; -- VSTART VSYNC start (high 8 bits)when x"18" => sreg <= x"1A7b"; -- VSTOP  VSYNC stop (high 8 bits)when x"19" => sreg <= x"030a"; -- VREF   VSYNC low two bitswhen x"1A" => sreg <= x"0e61"; -- COM5(0x0E) 0x61when x"1B" => sreg <= x"0f4b"; -- COM6(0x0F) 0x4Bwhen x"1C" => sreg <= x"1602"; --when x"1D" => sreg <= x"1e37"; -- MVFP (0x1E) 0x07  -- FLIP AND MIRROR IMAGE 0x3xwhen x"1E" => sreg <= x"2102";when x"1F" => sreg <= x"2291";when x"20" => sreg <= x"2907";when x"21" => sreg <= x"330b";when x"22" => sreg <= x"350b";when x"23" => sreg <= x"371d";when x"24" => sreg <= x"3871";when x"25" => sreg <= x"392a";when x"26" => sreg <= x"3c78"; -- COM12 (0x3C) 0x78when x"27" => sreg <= x"4d40";when x"28" => sreg <= x"4e20";when x"29" => sreg <= x"6900"; -- GFIX (0x69) 0x00when x"2A" => sreg <= x"6b4a";when x"2B" => sreg <= x"7410";when x"2C" => sreg <= x"8d4f";when x"2D" => sreg <= x"8e00";when x"2E" => sreg <= x"8f00";when x"2F" => sreg <= x"9000";when x"30" => sreg <= x"9100";when x"31" => sreg <= x"9600";when x"32" => sreg <= x"9a00";when x"33" => sreg <= x"b084";when x"34" => sreg <= x"b10c";when x"35" => sreg <= x"b20e";when x"36" => sreg <= x"b382";when x"37" => sreg <= x"b80a";when others => sreg <= x"ffff";end case;end if;end process;
end Behavioral;

Third one contains glue code for the IP core that can actually be instantiated:

----------------------------------------------------------------------------------
-- Engineer: Mike Field <hamster@snap.net.nz>
--
-- Description: Controller for the OV760 camera - transferes registers to the
--              camera over an I2C like bus
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;entity ov7670_controller isPort ( clk   : in    STD_LOGIC;resend :in    STD_LOGIC;config_finished : out std_logic;sioc  : out   STD_LOGIC;siod  : inout STD_LOGIC;reset : out   STD_LOGIC;pwdn  : out   STD_LOGIC;xclk  : out   STD_LOGIC
);
end ov7670_controller;architecture Behavioral of ov7670_controller isCOMPONENT ov7670_registersPORT(clk      : IN std_logic;advance  : IN std_logic;resend   : in STD_LOGIC;command  : OUT std_logic_vector(15 downto 0);finished : OUT std_logic);END COMPONENT;COMPONENT i2c_senderPORT(clk   : IN std_logic;send  : IN std_logic;taken : out std_logic;id    : IN std_logic_vector(7 downto 0);reg   : IN std_logic_vector(7 downto 0);value : IN std_logic_vector(7 downto 0);siod  : INOUT std_logic;sioc  : OUT std_logic);END COMPONENT;signal sys_clk  : std_logic := '0';signal command  : std_logic_vector(15 downto 0);signal finished : std_logic := '0';signal taken    : std_logic := '0';signal send     : std_logic;constant camera_address : std_logic_vector(7 downto 0) := x"42"; -- 42"; -- Device write ID - see top of page 11 of data sheet
beginconfig_finished <= finished;send <= not finished;Inst_i2c_sender: i2c_sender PORT MAP(clk   => clk,taken => taken,siod  => siod,sioc  => sioc,send  => send,id    => camera_address,reg   => command(15 downto 8),value => command(7 downto 0));reset <= '1';                                           -- Normal modepwdn  <= '0';                                           -- Power device upxclk  <= sys_clk;Inst_ov7670_registers: ov7670_registers PORT MAP(clk      => clk,advance  => taken,command  => command,finished => finished,resend   => resend);process(clk)beginif rising_edge(clk) thensys_clk <= not sys_clk;end if;end process;
end Behavioral;

[2] http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/99/t/6092


Importing VHDL code

To insert VHDL code snippets into Vivado:

  • From the main menu select Tools → Create and Package IP, click Next.
  • Select Package a specified directory, click Next.
  • Locate the directory which contains VHDL files for IP location, click
    Next.
  • Set Project name to main component name.
  • Set Project location to the parent folder of the VHDL files.
  • Click Finish

Once you have added everything to the library it’s time to instantiate the code in the design, for each component add the corresponding block:

  • Click on Open Block Design under IP Integrator to open up the high
    level block design.
  • Right click in the designer area and select Add IP…
  • Locate the components added earlier
  • Repeat same steps for all components

Next step is to insert block RAM, clocking wizard and connect the components.


Instantiating block RAM

Since block RAM is highly platform specific a Xilinx block has to be inserted. Right click in the high level design → Add IP…Block Memory Generator to insert block RAM. Right click on the block → Customize block… opens up the dialog for editing block RAM parameters.

Stand Alone mode makes it possible to generate Simple Dual Port RAM which is essentially memory with write port and read port. Port width refers to amount of bits that can be read/written at once or in other words the size of a memory slot. Port depth refers to count of such slots which translates to address bit width.


Block RAM generator parameters


Routing pins

The base.xdc important chunks are following:

# Debounce button and config finished LED
set_property PACKAGE_PIN R18 [get_ports button_debounce]
set_property PACKAGE_PIN M14 [get_ports led_config_finished]# Top JE
set_property PACKAGE_PIN H15 [get_ports ov7670_reset]
set_property PACKAGE_PIN J16 [get_ports {ov7670_d[1]}]
set_property PACKAGE_PIN W16 [get_ports {ov7670_d[3]}]
set_property PACKAGE_PIN V12 [get_ports {ov7670_d[5]}]# Bottom JE
set_property PACKAGE_PIN Y17 [get_ports ov7670_pwdn]
set_property PACKAGE_PIN T17 [get_ports {ov7670_d[0]}]
set_property PACKAGE_PIN U17 [get_ports {ov7670_d[2]}]
set_property PACKAGE_PIN V13 [get_ports {ov7670_d[4]}]# Top JD
set_property PACKAGE_PIN R14 [get_ports {ov7670_d[7]}]
set_property PACKAGE_PIN P14 [get_ports ov7670_pclk]
set_property PACKAGE_PIN T15 [get_ports ov7670_vsync]
set_property PACKAGE_PIN T14 [get_ports ov7670_sioc]# Bottom JD
set_property PACKAGE_PIN V18 [get_ports {ov7670_d[6]}]
set_property PACKAGE_PIN V17 [get_ports ov7670_xclk]
set_property PACKAGE_PIN U15 [get_ports ov7670_href]
set_property PACKAGE_PIN U14 [get_ports ov7670_siod]# Red channel of VGA output
set_property PACKAGE_PIN M19 [get_ports {RED_O[0]}]
set_property PACKAGE_PIN L20 [get_ports {RED_O[1]}]
set_property PACKAGE_PIN J20 [get_ports {RED_O[2]}]
set_property PACKAGE_PIN G20 [get_ports {RED_O[3]}]
set_property PACKAGE_PIN F19 [get_ports {RED_O[4]}]# Green channel of VGA output
set_property PACKAGE_PIN H18 [get_ports {GREEN_O[0]}]
set_property PACKAGE_PIN N20 [get_ports {GREEN_O[1]}]
set_property PACKAGE_PIN L19 [get_ports {GREEN_O[2]}]
set_property PACKAGE_PIN J19 [get_ports {GREEN_O[3]}]
set_property PACKAGE_PIN H20 [get_ports {GREEN_O[4]}]
set_property PACKAGE_PIN F20 [get_ports {GREEN_O[5]}]
# Blue channel of VGA output
set_property PACKAGE_PIN P20 [get_ports {BLUE_O[0]}]
set_property PACKAGE_PIN M20 [get_ports {BLUE_O[1]}]
set_property PACKAGE_PIN K19 [get_ports {BLUE_O[2]}]
set_property PACKAGE_PIN J18 [get_ports {BLUE_O[3]}]
set_property PACKAGE_PIN G19 [get_ports {BLUE_O[4]}]# Horizontal and vertical synchronization of VGA output
set_property PACKAGE_PIN P19 [get_ports HSYNC_O]
set_property PACKAGE_PIN R19 [get_ports VSYNC_O]# Voltage levels
set_property IOSTANDARD LVCMOS33 [get_ports button_debounce]
set_property IOSTANDARD LVCMOS33 [get_ports led_config_finished]
set_property IOSTANDARD LVCMOS33 [get_ports ov7670_pclk]
set_property IOSTANDARD LVCMOS33 [get_ports ov7670_sioc]
set_property IOSTANDARD LVCMOS33 [get_ports ov7670_vsync]
set_property IOSTANDARD LVCMOS33 [get_ports ov7670_reset]
set_property IOSTANDARD LVCMOS33 [get_ports ov7670_pwdn]
set_property IOSTANDARD LVCMOS33 [get_ports ov7670_href]
set_property IOSTANDARD LVCMOS33 [get_ports ov7670_xclk]
set_property IOSTANDARD LVCMOS33 [get_ports ov7670_siod]
set_property IOSTANDARD LVCMOS33 [get_ports {ov7670_d[*]}]
set_property IOSTANDARD LVCMOS33 [get_ports {RED_O[*]}]
set_property IOSTANDARD LVCMOS33 [get_ports {GREEN_O[*]}]
set_property IOSTANDARD LVCMOS33 [get_ports {BLUE_O[*]}]
set_property IOSTANDARD LVCMOS33 [get_ports HSYNC_O]
set_property IOSTANDARD LVCMOS33 [get_ports VSYNC_O]# Magic
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets ov7670_pclk_IBUF]

Using the pin mapping above the camera can be connected cleanly to the board:


Omnivision OV7670 attached to Pmod connectors JD and JE.

Remember to connect GND and 3.3V rails of the ZYBO to cameras GND and 3.3V rails.


Final high level design


High level design

Click on Generate bitstream button and transfer resulting bitstream file to the boot partition and restart ZYBO.


Summary

If you’ve connected camera correctly you should see the video feed from the camera on the screen attached to VGA output. Capture and controller blocks can be re-used in other examples involving Omnivision OV7670 camera, so it’s important to get expected outcome at this point.

Piping OV7670 video to VGA output on ZYBO相关推荐

  1. 使用36-pin的STM32输出VGA, VGA output using a 36-pin STM32

    源:使用36-pin的STM32输出VGA, VGA output using a 36-pin STM32 Bitbox : a small open, DIY 32 bit VGA console ...

  2. VGA接口复习笔记(原理,时序)VGA接口FPGA实现

    VGA接口复习笔记(原理,时序)VGA接口FPGA实现 一.显示器工作原理 显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左 ...

  3. 总:基于FPGA的OV7670摄像头显示

    目录 前言: 一.整体系统设计 二.各部分模块设计 1.时钟模块 2.OV7670初始化模块 3.DVP协议数据流模块 4.写FIFO模块 5.读FIFO模块 6.写FIFO控制模块 7.读FIFO控 ...

  4. UVC (USB Video Class) 使用笔记 (转)

    最近有个需求,要在ARM Linux上实现USB Camera 拍照功能. 0. 背景知识: 首先要确认的是,Kernel 是否支持 USB Camera.因为 Linux 下,USB 协议除了电气协 ...

  5. Nexys4 DDR + OV7670 摄像头实时监控系统

    Nexys4 DDR+OV7670 软件环境:vivado2018.2 简介:开发板Nexys4 DDR, 摄像头OV7670,是CMOS 图像传感器,最高分辨率640*480.将摄像头OV7670通 ...

  6. JS获取HTML video标签视频第一帧

    2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE html> <html> <head> <meta charse ...

  7. Video for linux 2 example (v4l2 demo)

            V4L2 API讲解附demo (注:从他人博客整理修正而来) (看完本文后,更简便的api请移步至video for linux 2 API) 1. 定义 V4L2(Video Fo ...

  8. usb转vga转换器

        usb转vga转换器最高支持到:1680*1050 (USB2.0) 最高支持到:2048*1152(USB2.0) 最高支持到:2048*1152(USB3.0) 是否发现你现在花了相当多的 ...

  9. 【四 zedboard】 VGA显示彩条

    观看开源骚客第二季并结合自己手上的zedboard板子,实现了VGA彩条显示. 首先打开zedboard的用户手册查看vga相关的接口.zedboard的资料可以到digilent官网下载(https ...

最新文章

  1. python爬虫原理-python爬虫原理详细讲解
  2. 关于有限自动机的一篇不错的文章
  3. spring-session使用教程(一):redis共享session
  4. 如何使用makefile编译不同平台的目标文件(makefile的参数传递)
  5. JS高级——变量提升
  6. 华为收购港湾核心业务 6年恩怨尘埃落定
  7. 如果你在aws ec2上安装php7x 的时候提示 libwebp 错误,可以试一下下面这个代码...
  8. 5817. 【NOIP提高A组模拟2018.8.15】 抄代码
  9. DNF单机版搭建(局域网、外网)
  10. Smarty - 下载
  11. 安利FeHelper
  12. java供应链项目详解_基于jsp的企业供应链管理系统-JavaEE实现企业供应链管理系统 - java项目源码...
  13. html为标题添加脚注,如何在rmarkdown html中的特定标题下放置脚注?
  14. 【跟我学Puppet】1.5 Puppet 3.7 使用Hiera定义配置
  15. 持安科技孙维伯:零信任 业务与安全的最优解
  16. 平面设计素材|黑白海报设计,暗黑潮流
  17. Java并发指南1:并发基础与Java多线程
  18. 华为技术官又出神作,鸿蒙操作系统完整文档笔记现已疯传
  19. AppNode受控端命令 - AppNode帮助中心
  20. [漏洞分析] CVE-2022-0995 watch_queue 1bit “溢出“内核提权

热门文章

  1. python词频统计西游记_Python文本统计功能之西游记用字统计操作示例
  2. python合并表格源代码_Excel电子表格如何合并单元格,Python编程实践,xlwt模块的应用...
  3. ADSCOPE广告产品趋势解读(二)——穿山甲“智能分层”
  4. Wordpress更换ip不能正常访问解决方法
  5. 看rom助手如何教你脱离伸手党,做出自己的rom
  6. 世间没有一条绝对容易的捷径,切勿急功近利!
  7. mysql复合函数索引_联合运输按照(    )标准分为协作式和衔接式的联合运输。...
  8. Fota 升级-差分包制作
  9. 仿牛客网社区开发--核心功能模块
  10. C#进行图片压缩(对jpg压缩效果最好)