OpenCores
URL https://opencores.org/ocsvn/modular_oscilloscope/modular_oscilloscope/trunk

Subversion Repositories modular_oscilloscope

[/] [modular_oscilloscope/] [trunk/] [hdl/] [daq/] [daq.vhd] - Rev 29

Go to most recent revision | Compare with Previous | Blame | View Log

----------------------------------------------------------------------------------------------------
--| Modular Oscilloscope
--| UNSL - Argentina
--|
--| File: adq.vhd
--| Version: 0.1
--| Tested in: Actel A3PE1500
--|-------------------------------------------------------------------------------------------------
--| Description:
--|   Adquisition control module. 
--|   It drives the ADC chips.
--|-------------------------------------------------------------------------------------------------
--| File history:
--|   0.01   | apr-2008 | First testing
--|   0.10   | apr-2009 | First release
----------------------------------------------------------------------------------------------------
--| Copyright ® 2009, Facundo Aguilera.
--|
--| This VHDL design file is an open design; you can redistribute it and/or
--| modify it and/or implement it after contacting the author.
 
--| Wishbone Rev. B.3 compatible
----------------------------------------------------------------------------------------------------
 
 
--| TODO:
--|  Access to both channels in consecutive reads  
 
 
 
-- Esta primera versión está realizada específicamente para controlar el ADC AD9201. Otras
-- versiones podrán ser más genéricas.
 
 
-- ADR    configuración (señal config)
-- ADR+1  datos canal 1
-- ADR+2  datos canal 2
-- ADR+3  sin usar
 
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--use IEEE.STD_LOGIC_ARITH.all;
use IEEE.NUMERIC_STD.ALL;
--use work.adq_pgk.all;
 
entity adq is
  generic (
    DEFALT_CONFIG : std_logic_vector := "0000100000000000"
                                      -- bits 8 a 0       clk_pre_scaler
                                      -- bits 9           clk_pre_scaler_ena
                                      -- bit 10           adc_sleep
                                      -- bit 11           adc_chip_sel
                                      -- bits 12 a 15     sin usar
 
                                      -- si clk_pre_scaler_ena = 1
                                      -- frecuencia_adc = frecuencia_wbn / ((clk_pre_scaler+1)*2)
                                      -- sino frecuencia_adc = frecuencia_wbn
  );
  port(
    -- Externo
    adc_data:     in    std_logic_vector (9 downto 0);
    adc_sel:      out   std_logic;
    adc_clk:      out   std_logic;
    adc_sleep:    out   std_logic;
    adc_chip_sel: out   std_logic;
 
 
    --  Interno
    RST_I:  in  std_logic;  
    CLK_I:  in  std_logic;  
    DAT_I:  in  std_logic_vector (15 downto 0);
    ADR_I:  in  std_logic_vector (1 downto 0);
    CYC_I:  in  std_logic;  
    STB_I:  in  std_logic; 
    WE_I:   in  std_logic;
    DAT_O:  out std_logic_vector (15 downto 0);
    ACK_O:  out std_logic 
  );
end adq;
 
 
architecture beh1 of adq is
  -- Tipos
  type data_array is array(0 to 2) of std_logic_vector(15 downto 0);
 
 
                --   type arr is array(0 to 3) of std_logic_vector(15 downto 0);
                -- 
                -- signal arr_a : arr;
                -- signal vec_0, vec_1, vec_2, vec_3 : std_logic vector(15 downto 0);
                -- ....
                -- arr_a(0) <= vec_0;
                -- arr_a(1) <= vec_1;
                -- ....
 
  -- Registros de configuración
  signal config:   std_logic_vector (15 downto 0);
  signal selector: data_array;
 
  -- Registros
  signal count: std_logic_vector (9 downto 0);
 
  -- Señales 
  signal s_adc_clk, s_adc_sleep, s_adc_chip_sel: std_logic; 
  signal data_ack_ready:      std_logic; -- habilita confirmación de datos
  signal conf_ack_ready:      std_logic; -- habilita confirmación de escritura de configuración
  signal clk_pre_scaler:      std_logic_vector (8 downto 0);
  signal clk_pre_scaler_ena:  std_logic;
  --signal clk_enable: std_logic_vector (9 downto 0);
 
begin
  --------------------------------------------------------------------------------------------------
  -- Asignaciones
  ---- Comunicación interna (Wishbone)
  selector(0) <= config;
  selector(1) <= (config'length - 1 downto adc_data'length => '0' ) & adc_data;
  selector(2) <= (config'length - 1 downto adc_data'length => '0' ) & adc_data;
  --selector(3) <= (others => '0' ); -- Sin usar
 
  ---- Registro de configuración config
  clk_pre_scaler <= config(8 downto 0);
  clk_pre_scaler_ena <= config(9); 
  s_adc_sleep <= config(10);
  s_adc_chip_sel <= config(11);
  -- sin asignar <= config(13); para usar en otras implementaciones
  -- sin asignar <= config(14);
  -- sin asignar <= config(15);
 
  ---- Comunicación externa (AD)
  adc_sleep <= s_adc_sleep;
  adc_chip_sel <= s_adc_chip_sel;
 
 
 
  --------------------------------------------------------------------------------------------------
  -- Generación de adc_clk
  process (CLK_I, clk_pre_scaler,RST_I,count, clk_pre_scaler_ena) 
  begin
    if RST_I = '1' then
      count <= (others => '0');
      s_adc_clk <= '0';
    elsif clk_pre_scaler_ena = '1' then
      if CLK_I'event and CLK_I = '1' then
        count <= count + 1;
        if count = clk_pre_scaler  then
          s_adc_clk <= not(s_adc_clk);
          count <= (others => '0');
        end if;        
      end if;
    else  
      count <= (others => '0');
      s_adc_clk <= CLK_I;
    end if;
  end process;
  adc_clk <= s_adc_clk;
 
  --------------------------------------------------------------------------------------------------
  -- Generación ack
  ACK_O <= CYC_I and STB_I and (data_ack_ready or conf_ack_ready);
  data_ack_ready  <=  '1' when (unsigned(count) = 0 and WE_I = '0' and unsigned(ADR_I) /= 0 and s_adc_clk = '1') 
                      or (clk_pre_scaler_ena /= '1') 
                  else
                      '0';                    
    -- count = 0 asegura que el dato actual ya fue leído
 
  conf_ack_ready  <=  '1' when unsigned(ADR_I) = 0  else
                      '0';
 
  --------------------------------------------------------------------------------------------------
  -- Selección de canal
  adc_sel <=  '1' when unsigned(ADR_I) = 2 else   -- selecciona canal Q
              '0';                                -- selecciona canal I
 
 
  --------------------------------------------------------------------------------------------------
  -- Lectura y escritura de datos
  ---- Generación de DAT_O
  DAT_O   <=  selector(conv_integer(ADR_I));
 
  ---- Almacenado de registro de configuración
  process (CLK_I, ADR_I, RST_I, DAT_I) 
  begin
 
    if CLK_I'event and CLK_I = '1' then
      if RST_I = '1' then
        config <= DEFALT_CONFIG;
      elsif WE_I = '1' and  CYC_I = '1' and STB_I = '1' then
        if unsigned(ADR_I) = 0 then
          config <= DAT_I; 
        end if;
      end if;             
    end if;
 
  end process;
 
 
end architecture beh1;

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.