Hola,
muchas gracias!, uno de los codigos vhdl que probe para el control del adc0804 es el que te paso a continuacion. No se si es problema del propio codigo... o del plugin que tuve que crear para usar los puedos i/o de la spartan3... ¿?
----------------------------------------------------------------------------------
-- Sistema control para conversor AD
-- Maquina de estados
-------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL; -- Antes: use IEEE.STD_LOGIC_UNSIGNED.ALL;
library UNISIM;
use UNISIM.VComponents.all;
entity Control_AD_0804 is
port (
clk,ce: IN STD_LOGIC;
RESET: IN STD_LOGIC;
N_CS,N_RD,N_WR: OUT STD_LOGIC; -- Señales desde SPARTAN -> AD0804
N_INTR: IN STD_LOGIC; -- Señal desde AD0804 -> SPARTAN
DATA_IN: IN STD_LOGIC_VECTOR(7 downto 0) ; -- Datos procedentes del conversor A/D
DATA_OUT: OUT STD_LOGIC_VECTOR(7 downto 0) -- Datos salida hacia sistema ANC
--CONT_OUT: OUT STD_LOGIC_VECTOR(9 downto 0)
);
end Control_AD_0804;
architecture Behavioral of Control_AD_0804 is
-- Codificacion de la maquina de estados
type ESTADO_type is (Estado0, Estado1, Estado2, Estado3, Estado4, Estado5, Estado6); -- Declaracion de tipo ESTADO
signal ESTADO:ESTADO_type;
signal CONT:STD_LOGIC_VECTOR(9 downto 0); -- Para contaje de temporizacion (7 bits: 0-127)
begin
ESTADO_machineROCESS (clk,ce,RESET)
begin
if (ce='1') then
if (RESET='0') then
if (clk'event and clk='1') then
CASE ESTADO IS
WHEN Estado0 => -- Inicializacion de variables
N_CS <= '1'; -- Selecciono el conversor
N_WR <= '1';
N_RD <= '1';
ESTADO <= Estado1; -- Cambio de estado
WHEN Estado1 =>
CONT <= "0000000000";
N_CS <= '0';
ESTADO <= Estado2;
WHEN Estado2 => -- Doy ORDEN CONVERSION A/D
N_WR <= '0'; -- TW (100ns min => CONT>=5)
--CONT_OUT <= CONT;
if (CONT<6) then -- Espero 6 periodos (=> 120ns) antes de cambiar de estado
CONT<=CONT +'1';
end if;
if (CONT<6) then ESTADO <= Estado2;
else ESTADO <= Estado3;
end if;
WHEN Estado3 => -- Espero a que acabe la conversion (=> N_INTR=0)
N_WR <= '1';
CONT <= "0000000000";
if N_INTR='0' then
ESTADO <= Estado4;
else ESTADO <= Estado3;
end if;
WHEN Estado4 => -- Doy ORDEN LECTURA de DATO
N_RD <= '0'; -- Tacc (200ns max)
--CONT_OUT <= CONT;
if (CONT<10) then -- Espero 10 periodos (=> 200ns) antes de cambiar de estado
CONT<=CONT +'1';
end if;
if (CONT<10) then ESTADO <= Estado4;
else ESTADO <= Estado5;
end if;
WHEN Estado5 =>
DATA_OUT <= DATA_IN; -- Paso datos del conversor a sistema ANC
ESTADO <= ESTADO6;
WHEN Estado6 =>
if N_INTR='1' then -- Pongo N_RD=1 solo despues de que N_INTR vuelva a 1
N_RD <= '1';
ESTADO <= Estado1;
else ESTADO <= Estado6;
end if;
WHEN OTHERS =>
ESTADO <= Estado0;
end case;
end if;
elsif RESET='1' then N_CS<='1';
N_WR <= '1';
N_RD <= '1';
DATA_OUT <= "00000000";
end if;
else N_CS<='1';
N_WR <= '1';
N_RD <= '1';
DATA_OUT <= "00000000";
end if;
end process; -- Fin ESTADO_machine
end Behavioral;