-- Control AD7303
-- José Jorge Enríquez Rodríguez
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity control_dac is
port(
clk_50MHz: in std_logic; -- Reloj de la tarjeta Spartan 3 Starter Kit (50 MHz)
reset: in std_logic;
dato_paralelo: in std_logic_vector( 7 downto 0 ); -- Dato a convertir
dac_sync: out std_logic;
dac_sclk: out std_logic;
dac_din: out std_logic
);
end control_dac;
architecture Behavioral of control_dac is
begin
process( reset, clk_50MHz )
variable temp: integer := 0;
begin
if ( reset = '1' ) then
temp := 0;
dac_sync <= '1';
dac_sclk <= '0';
dac_din <= '0';
elsif ( rising_edge( clk_50MHz ) ) then
temp := temp + 1;
if ( temp < 3 ) then
dac_sync <= '1'; dac_sclk <= '0';
elsif ( temp < 5 ) then
dac_sync <= '1'; dac_sclk <= '1'; -- Termina nivel alto sync
elsif ( temp < 7 ) then -- Inicia envío de datos (bit 16)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= '0'; -- Referencia interna
elsif ( temp < 9 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 11 ) then -- (bit 15)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= '0'; -- Uncommited bit
elsif ( temp < 13 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 15 ) then -- (bit 14)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= '0'; -- LDAC
elsif ( temp < 17 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 19 ) then -- (bit 13)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= '1'; -- Deshabilita canal B
elsif ( temp < 21 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 23 ) then -- (bit 12)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= '0'; -- Habilita canal A
elsif ( temp < 25 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 27 ) then -- (bit 11)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= '0'; -- Direcciona canal A
elsif ( temp < 29 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 31 ) then -- (bit 10)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= '0'; -- CR1
elsif ( temp < 33 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 35 ) then -- Último bit configuración (bit 9)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= '1'; -- CR0 (actualizar input reg. desde el shift reg. DAC A)
elsif ( temp < 37 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 39 ) then -- MSB dato a convertir (bit 8)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= dato_paralelo( 7 );
elsif ( temp < 41 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 43 ) then -- (bit 7)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= dato_paralelo( 6 );
elsif ( temp < 45 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 47 ) then -- (bit 6)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= dato_paralelo( 5 );
elsif ( temp < 49 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 51 ) then -- (bit 5)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= dato_paralelo( 4 );
elsif ( temp < 53 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 55 ) then -- (bit 4)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= dato_paralelo( 3 );
elsif ( temp < 57 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 59 ) then -- (bit 3)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= dato_paralelo( 2 );
elsif ( temp < 61 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 63 ) then -- (bit 2)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= dato_paralelo( 1 );
elsif ( temp < 65 ) then
dac_sync <= '0'; dac_sclk <= '1';
elsif ( temp < 67 ) then -- LSB dato a convertir (bit 1)
dac_sync <= '0'; dac_sclk <= '0';
dac_din <= dato_paralelo( 0 );
elsif ( temp < 68 ) then
dac_sync <= '0'; dac_sclk <= '1';
else
temp := 0;
end if;
end if;
end process;
end Behavioral;