⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libreria_i2c.vhd

📁 用VHDL实现视频控制程序,实现对图像的采集和压缩,
💻 VHD
📖 第 1 页 / 共 3 页
字号:
			load_bit <= '0';		
			OESDA <= '0';
			if (fin_espera128 = '1') then
				siguiente <= carga_nuevo_bit;
			else
				siguiente <= esp_sig_dato;
			end if;
		when carga_nuevo_bit =>
			-- Generamos aqui la carga del biestable
			-- de salida con el nuevo bit porque
			-- debemos hacerlo mientras SDA aun este
			-- en alta impedancia. Esto es para no
			-- apreciar en SDA conmutaciones entre el 
			-- ultimo bit cargado en el biestable y 
			-- el que cargamos ahora.
			load_new <= '0';
			inc_punt <= '0';
			inc_sel_byte <= '0';
			reset_sel_byte <= '0';
			ENespera64 <= '0';
			ENespera128 <= '1';
			ready <= '0';
			-- CONTROL SCL.
			preset_div <= '0';
			reset_div <= '1';
			OESCL <= '1';
			-- CONTROL SDA.
			reset_bit <= '0';
			load_bit <= '1';		
			OESDA <= '0';
			siguiente <= esp_SCL1;
		when set_punt_byte =>
			-- Hemos detectado el ACK del ultimo
			-- byte con exito y ya no quedan mas
			-- bytes por enviar. 
			-- Ponemos el puntero de bytes a "11"
			-- indicando que la transferencia ha 
			-- sido realizada con exito y nos 
			-- preparamos para generar la condicion
			-- de STOP.
			load_new <= '0';
			inc_punt <= '0';
			inc_sel_byte <= '1';
			reset_sel_byte <= '0';
			ENespera64 <= '0';
			ENespera128 <= '0';
			ready <= '0';
			-- CONTROL SCL.
			preset_div <= '0';
			reset_div <= '0';
			OESCL <= '1';
			-- CONTROL SDA.
			reset_bit <= '0';
			load_bit <= '0';		
			OESDA <= '0';
			siguiente <= STOP1;
		when STOP1 =>
			-- Se ha detectado el ACK del byte 
			-- del dato a escribir con exito o 
			-- bien ha ocurrido un fallo en la
			-- recepcion del ACK de algun byte.
			-- Hemos de esperar con SDA en alta
			-- impedancia hasta que SCL sea '0'
			-- para poder cambiar SDA a '0' y 
			-- comenzar asi a generar la condicion
			-- de STOP.
			-- Ahora reseteamos el biestable de 
			-- salida para que almacene el '0'
			-- que nos hara falta a continuacion.
			load_new <= '0';
			inc_punt <= '0';
			inc_sel_byte <= '0';
			reset_sel_byte <= '0';
			ENespera64 <= '0';
			ENespera128 <= '0';
			ready <= '0';
			-- CONTROL SCL.
			preset_div <= '0';
			reset_div <= '0';
			OESCL <= '1';
			-- CONTROL SDA.
			reset_bit <= '1';
			load_bit <= '0';		
			OESDA <= '0';		
			if (SCL = '0') then
				siguiente <= STOP2;
			else
				siguiente <= STOP1;
			end if;
		when STOP2 =>
			-- Esperamos 64 Tclk reseteando el 
			-- divisor para mantener SCL a '0'.
			load_new <= '0';
			inc_punt <= '0';
			inc_sel_byte <= '0';
			reset_sel_byte <= '0';
			ENespera64 <= '1';
			ENespera128 <= '0';
			ready <= '0';
			-- CONTROL SCL.
			preset_div <= '0';
			reset_div <= '1';
			OESCL <= '1';
			-- CONTROL SDA.
			reset_bit <= '0';
			load_bit <= '0';		
			OESDA <= '0';
			if (fin_Espera64 = '1') then 
				siguiente <= STOP3;
			else 
				siguiente <= STOP2;
			end if;
		when STOP3 =>
			-- Damos salida a SDA = '0' y esperamos
			-- 1 Tclk antes de usar de nuevo el
			-- contador de espera de 64 Tclk.
			-- Ya no hace falta que mantengamos
			-- reset_div a '1'.
			load_new <= '0';
			inc_punt <= '0';
			inc_sel_byte <= '0';
			reset_sel_byte <= '0';
			ENespera64 <= '0';
			ENespera128 <= '0';
			ready <= '0';
			-- CONTROL SCL.
			preset_div <= '0';
			reset_div <= '0';
			OESCL <= '1';
			-- CONTROL SDA.
			reset_bit <= '0';
			load_bit <= '0';		
			OESDA <= '1';
			siguiente <= STOP4;
		when STOP4 =>
			-- Esperamos 64 Tclk y luego ponemos
			-- a '1' SCL.
			load_new <= '0';
			inc_punt <= '0';
			inc_sel_byte <= '0';
			reset_sel_byte <= '0';
			ENespera64 <= '1';
			ENespera128 <= '0';
			ready <= '0';
			-- CONTROL SCL.
			preset_div <= '0';
			reset_div <= '0';
			OESCL <= '1';
			-- CONTROL SDA.
			reset_bit <= '0';
			load_bit <= '0';		
			OESDA <= '1';
			if (fin_espera64 = '1') then
				siguiente <= STOP5;
			else 
				siguiente <= STOP4;
			end if;
		when STOP5 =>
			-- Esperamos 1 Tclk para dar tiempo a
			-- resetear el contador de 64 Tclk
			-- pues ahora volveremos a usarlo.
			load_new <= '0';
			inc_punt <= '0';
			inc_sel_byte <= '0';
			reset_sel_byte <= '0';
			ENespera64 <= '0';
			ENespera128 <= '0';
			ready <= '0';
			-- CONTROL SCL.
			preset_div <= '0';
			reset_div <= '0';
			OESCL <= '1';
			-- CONTROL SDA.
			reset_bit <= '0';
			load_bit <= '0';		
			OESDA <= '1';
			siguiente <= STOP6;
		when STOP6 =>
			-- Ponemos SCL en alta impedancia y
			-- esperamos 64 Tclk antes de volver
			-- al reposo (lo cual supondria la
			-- generacion de la condicion de STOP
			-- pues, en reposo, SDA tambien se pone 
			-- en alta impedancia).
			load_new <= '0';
			inc_punt <= '0';
			inc_sel_byte <= '0';
			reset_sel_byte <= '0';
			ENespera64 <= '1';
			ENespera128 <= '0';
			ready <= '0';
			-- CONTROL SCL.
			preset_div <= '0';
			reset_div <= '0';
			OESCL <= '0';
			-- CONTROL SDA.
			reset_bit <= '0';
			load_bit <= '0';		
			OESDA <= '1';
			if (fin_espera64 = '1') then
				siguiente <= reposo; 
			else
				siguiente <= STOP6;
			end if;			
		when others =>
			siguiente <= reposo;
	end case;
end process transiciones;


sincro:process(reloj,reset)
	begin
	if (reset = '1') then 
		actual <= reposo;
	elsif (reloj'event and reloj = '1') then
		actual <= siguiente;
	end if;
end process sincro;
end FSM_I2C_arch;


library IEEE;
use IEEE.std_logic_1164.all;
entity tx_bit is
    port (
	reset: in STD_LOGIC;
        reloj: in STD_LOGIC;
        clear: in STD_LOGIC;
        D: in STD_LOGIC;
        LE: in STD_LOGIC;
	Q: out STD_LOGIC
    );
end tx_bit;

architecture tx_bit_arch of tx_bit is
begin
process(reset,reloj,clear,LE)
begin
  	if (reset = '1') then 
  		Q <= '0';
  	elsif (reloj'event and reloj = '1') then
  		if (clear = '1') then
  			Q <= '0';
  		elsif (LE = '1') then
  			Q <= D;
  		end if;
  	end if;
end process; 
end tx_bit_arch;


library IEEE;
use IEEE.std_logic_1164.all;
entity IOpad is
    port (
        OE: in STD_LOGIC;
        SAL: in STD_LOGIC;
        ENT: out STD_LOGIC;
        PAD: inout STD_LOGIC
    );
end IOpad;

architecture IOpad_arch of IOpad is
begin
PAD <= SAL when (OE = '1') else 'Z'; 
ENT <= PAD;  
end IOpad_arch;



library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity cont_espera64 is
    port (
	reset: in STD_LOGIC;
        reloj: in STD_LOGIC;
        enable: in STD_LOGIC;
        fin: out STD_LOGIC
    );
end cont_espera64;

architecture cont_espera64_arch of cont_espera64 is
signal cuenta: std_logic_vector(6 downto 0);
begin
process (reset,reloj,enable)
begin
   	if (reset = '1') then
   		cuenta <= (others => '0');
   	elsif (reloj'event and reloj = '1') then
   		if(enable = '0') then
   			cuenta <= (others=>'0');
   		else
   			cuenta <= cuenta + '1';
   		end if;
	end if;
end process;
fin <= cuenta(6);
end cont_espera64_arch;


library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity cont_espera128 is
    port (
	reset: in STD_LOGIC;
        reloj: in STD_LOGIC;
        enable: in STD_LOGIC;
        fin: out STD_LOGIC
    );
end cont_espera128;

architecture cont_espera128_arch of cont_espera128 is
signal cuenta: std_logic_vector(7 downto 0);
begin
process (reset,reloj,enable)
begin
   	if (reset = '1') then
   		cuenta <= (others => '0');
   	elsif (reloj'event and reloj = '1') then
   		if(enable = '0') then
   			cuenta<=(others=>'0');
   		else
   			cuenta <= cuenta + '1';
   		end if;
	end if;
end process;
fin <= cuenta(7);
end cont_espera128_arch;


library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

entity FSM_gen_datos is
	port (
        	reloj: in STD_LOGIC;
        	reset: in STD_LOGIC;
        	inicio: in STD_LOGIC;
         	ready: in STD_LOGIC;
        	punt_byte: in STD_LOGIC_VECTOR (1 downto 0);
        	fin_espera128: in STD_LOGIC;
        	punt_mem: in STD_LOGIC_VECTOR (6 downto 0);
        	trans: out STD_LOGIC;
        	dir: out STD_LOGIC_VECTOR (7 downto 0);
        	dato: out STD_LOGIC_VECTOR (7 downto 0);
               	ENespera128: out STD_LOGIC;
               	reset_punt_mem: out STD_LOGIC;
               	inc_punt_mem: out STD_LOGIC;
               	resultado: out STD_LOGIC_VECTOR (3 downto 0);
               	conf_valida: out STD_LOGIC
        );
end FSM_gen_datos;

architecture FSM_gen_datos_arch of FSM_gen_datos is
type TipoEstado is (reposo,inicio_transf,espera_128,espera_ready,
		    mira_puntero,avanza_puntero,espera_sig_transf,
		    correcto
		   );
type MEM is array (0 to 93) of STD_LOGIC_VECTOR (15 downto 0);
signal actual,siguiente: TipoEstado;
signal memdatos: MEM;

begin
-- Comenzamos inicializando con los datos de configuracion, cada uno de 
-- los registros que componen a la memoria.
-- En el byte superior estara la subdireccion del registro que vamos a
-- escribir. En el inferior estara el dato que deseamos escribir en la 
-- correspondiente subdireccion.
memdatos (0) <= X"0108";
memdatos (1) <= X"02C3";
memdatos (2) <= X"0333";
memdatos (3) <= X"0400";
memdatos (4) <= X"0500";
memdatos (5) <= X"066C";--06E9
memdatos (6) <= X"076C";--070D
memdatos (7) <= X"0898";
memdatos (8) <= X"0901";
memdatos (9) <= X"0A80";
memdatos (10) <= X"0B47";
memdatos (11) <= X"0C40";
memdatos (12) <= X"0D00";
memdatos (13) <= X"0E01";
memdatos (14) <= X"0F2A";
memdatos (15) <= X"1000";
memdatos (16) <= X"110C";
memdatos (17) <= X"12A7";   --Anteriormente era 12E7, para q RTS1 sea ODD y RTS0 HREF
memdatos (18) <= X"1300";
memdatos (19) <= X"1400";
memdatos (20) <= X"1500";
memdatos (21) <= X"1600";
memdatos (22) <= X"1700";
memdatos (23) <= X"1800";
memdatos (24) <= X"1900";
memdatos (25) <= X"1A00";
memdatos (26) <= X"1B00";
memdatos (27) <= X"1C00";
memdatos (28) <= X"1D00";
memdatos (29) <= X"1E00";
memdatos (30) <= X"2000";
memdatos (31) <= X"2100";
memdatos (32) <= X"2200";
memdatos (33) <= X"2300";
memdatos (34) <= X"2400";
memdatos (35) <= X"2500";
memdatos (36) <= X"2600";
memdatos (37) <= X"2700";
memdatos (38) <= X"2800";
memdatos (39) <= X"2900";
memdatos (40) <= X"2A00";
memdatos (41) <= X"2B00";
memdatos (42) <= X"2C00";
memdatos (43) <= X"2D00";
memdatos (44) <= X"2E00";
memdatos (45) <= X"2F00";
memdatos (46) <= X"3000";
memdatos (47) <= X"3100";
memdatos (48) <= X"3200";
memdatos (49) <= X"3300";
memdatos (50) <= X"3400";
memdatos (51) <= X"3500";
memdatos (52) <= X"3600";
memdatos (53) <= X"3700";
memdatos (54) <= X"3800";
memdatos (55) <= X"3900";
memdatos (56) <= X"3A00";
memdatos (57) <= X"3B00";
memdatos (58) <= X"3C00";
memdatos (59) <= X"3D00";
memdatos (60) <= X"3E00";
memdatos (61) <= X"3F00";
memdatos (62) <= X"4002";
memdatos (63) <= X"41FF";--4177 pa ponerlo en b/n
memdatos (64) <= X"42FF";-- ...
memdatos (65) <= X"43FF";
memdatos (66) <= X"44FF";
memdatos (67) <= X"45FF";
memdatos (68) <= X"46FF";
memdatos (69) <= X"47FF";
memdatos (70) <= X"48FF";
memdatos (71) <= X"49FF";
memdatos (72) <= X"4AFF";
memdatos (73) <= X"4BFF";
memdatos (74) <= X"4CFF";
memdatos (75) <= X"4DFF";
memdatos (76) <= X"4EFF";
memdatos (77) <= X"4FFF";
memdatos (78) <= X"50FF";
memdatos (79) <= X"51FF";
memdatos (80) <= X"52FF";
memdatos (81) <= X"53FF";
memdatos (82) <= X"54FF";
memdatos (83) <= X"55FF";
memdatos (84) <= X"56FF";
memdatos (85) <= X"57FF";-- hasta aqu

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -