contenido

  1. ...


Se pretende diseñar un sistema que capture imágenes con la cámara OV7670 y realice la detección de movimiento mediante diferencias entre la imagen actual y una pasada.

Como antecedente se recomienda una lectura a un capítulo anterior: «Cámara OV7670»

La tarjeta DE-115 es un producto de Terasic. Esta tarjeta cuenta con un FPGA Cyclone IV y un DAC triple de 8 bits de resolución por color. También es la tarjeta en la que se ha probado el proyecto.










La tarjeta DE2-115 tiene un reloj de 50MHz. De este reloj se divide la frecuencia a 25MHz para impulsar al sistema.


library ieee;
use ieee.std_logic_1164.all;

entity div25MHz is
port (	clk50MHz :  in std_logic;
	clk25MHz : out std_logic);
end entity div25MHz;

architecture behavior of div25MHz is
signal state : std_logic :='0';
begin
	clk25MHz<=state;
	
	process (clk50MHz) is
	begin
		if clk50MHz'event and clk50MHz='1' then
			state <= not state;
		end if;
	end process;

end architecture behavior;




El módulo pixel_capture utiliza la señal de reloj PCLK y las señales HREF y VSYNC de la OV7670 para:



Este módulo se encarga de recoger las muestras que entrega la cámara OV7670. El módulo envía una señal bank, la cual es indicativa de en cual banco de memoria se debe almacenar la imagen.

La carta ASM siguiente responde a ambas transiciones del reloj:






El módulo VRAM, para el presente texto, es acrónimo de Video RAM. Este tipo de memoria se diseñó para tener dos puertos síncronos de acceso. Ambos puertos tienen relojes indenpendientes:

La razón de tener dos puertos es para evitar el diseño de una cola las peticiones de acceso (lectura y escritura) a un chip RAM.


Este tipo de memoria tiene:





Considérese que:




library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity myRAM is 
port (
 AddrWr  :  in std_logic_vector (2 downto 0); --Dirección de escritura
 AddrRd  :  in std_logic_vector (2 downto 0); --Dirección de lectura
 clkWr	 :  in std_logic;
 clkRd	 :  in std_logic;
 dataIn  :  in std_logic_vector (3 downto 0); --Registro de entrada
 dataOut : out std_logic_vector (3 downto 0)	 --Registro de salida
 wrEn	 :  in std_logic);			 --Habilitacion de escritura: '0' no escribe, '1' escribe
);
end entity myRAM;

architecture behavior of myRAM is
type matrix is array (0 to 7) of std_logic_vector (3 downto 0);
signal       memory : matrix;
attribute  ramstyle : string;
attribute  ramstyle of memory : signal is "M-RAM";
signal    dataInBuf : std_logic_vector (3 downto 0);
signal AddressWrite : std_logic_vector (2 downto 0);
signal  AddressRead : std_logic_vector (2 downto 0);
begin

	--Acceso de escritura
	process (clkWr)
	begin
		if (clkWr'event and clkWr='1' and wrEn='1') then
			   dataInBuf <= dataIn;
			AddressWrite <= AddrWr;
			memory(to_integer(unsigned(AddressWrite)))<=dataInBuf;
		end if;		
	end process;	
	
	--Acceso de lectura
	process (clkRd)
	begin
		if (clkRd'event and clkRd='1') then
			AddressRead <= AddrRd;
			dataOut<=memory(to_integer(unsigned(AddressRead))); 
		end if;	
	end process;

end architecture behavior;