Fpga ADC

Başlatan muebbet26, 21 Kasım 2012, 23:21:10

muebbet26

merhaba arkadaşlar
ben Fpga ile bir uygulama yapacağım, inputum analog olacağı için bunu dijitale çeviren bir devreye ihtiyacım var.
soru şu, ADC devresi kendiliğinden var olan bir kart biliyor musunuz ?
digilentin pmod ad'leri var, onları alıp takabilirim. ama sadece iki çeşit var, ve onların özellikleri benim beklentilerimi karşılamıyor.
büyük ihtimalle analogdevices'tan alacağım bir adc entegresi ile bir devre hazırlayacağım bu iş için
ama yine de sizin tecrübelerinize bir danışayım dedim..

teşekkürler,

yamak

Eğer öğrenme amaçlı uygulama yapmak istiyosan.Elinde stm32f4 discovery varsa onu kullanabilirsin.STM32F407 nin ADC si yeterince hızlı.

cuneyt08

Aslında ADC devresi kurmak zor bir iş olmasa gerek senin için. Nasıl bir uygulamada kullanacağını bilmiyorum ama ben de BASYS 2 üzerinde yapacağım bir uygulamada 8 outputlu 0804 ADC kullandım ve devre şematiği oldukça kolay breadboard üzerinde. Oradan da kablolarla FPGA'ya aktarabilirsin diye düşünüyorum...

Kolay gelsin çalışmanda...

kralsam

Alıntı yapılan: muebbet26 - 21 Kasım 2012, 23:21:10
merhaba arkadaşlar
ben Fpga ile bir uygulama yapacağım, inputum analog olacağı için bunu dijitale çeviren bir devreye ihtiyacım var.
soru şu, ADC devresi kendiliğinden var olan bir kart biliyor musunuz ?
digilentin pmod ad'leri var, onları alıp takabilirim. ama sadece iki çeşit var, ve onların özellikleri benim beklentilerimi karşılamıyor.
büyük ihtimalle analogdevices'tan alacağım bir adc entegresi ile bir devre hazırlayacağım bu iş için
ama yine de sizin tecrübelerinize bir danışayım dedim..

teşekkürler,

Merhaba,
Pmod kitler işini görmeyecek seviyede mi? Yoksa başka sorunlar mı var? Çok hızlı sistem, RF için vs. kullanacaksan dediğin gibi yetmez.

Ben bir dönem 14MHz aralıkta çalışmayı düşünmüştüm. Altera'nın kendi kitleri çok pahalıydı.(Sanırım hala öyle..400$ kadar.) Bende LT den bir entegre istedim geldi. Fakat kılıf ve gerekli çevrebirimleri ile ilgili verdiği örnek dev. bord 6 katmandı. Bir kaç katmanı azaltmayı düşündüm ama malesef Türkiye'de sorunsuzca ve ucuza basmak sıkıntılı oldu. Vazgeçtim. Böyle birşey düşünüyorsan ve bahsettiğim gibi üretim imkanın yoksa bütçene göre hazır modül yada basit çipler ile çalışmanı tavsiye ederim.

Çalışmalarında başarılar.

dehseyt_06

Eskişehir Osmangazi Üniversitesinde Yrd.Doç Hocanın hazırladığı adc belkı yardımcı olur. :)
----------------------------------------------------------------------------------
-- ADC reader
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity adc is Port (
  -- bunlar disable edilecek diğer bileşenler için
  SPI_SS_B   : out STD_LOGIC; -- U3  disable with 1
  SF_CE0     : out STD_LOGIC; -- D16 disable with 1
  FPGA_INIT_B: out STD_LOGIC; -- T3  disable with 1

  -- bunlar ortak pinler 
  Rst        : in  STD_LOGIC;     -- K17
  clk        : in  STD_LOGIC;     -- C9
  SPI_SCK    : out STD_LOGIC;     -- U16
  -- bunlar ADC ile ilgili pinler
  AD_CONV    : out STD_LOGIC;     -- P11
  SPI_MISO   : in  STD_LOGIC;     -- N10
  DOUT       : out STD_LOGIC_VECTOR(7 downto 0);  -- F9 E9 D11 C11 F11 E11 E12 F12
  -- bunlar ise AMP ile ilgili
  AMP_CS     : inout STD_LOGIC;   -- N7
  SPI_MOSI   : out STD_LOGIC;     -- T4
  AMP_SHDN   : out STD_LOGIC      -- P7
  );
end adc;

architecture adc of adc is
  signal stt: integer range 0 to 3 :=0;
  signal adcstt : integer range 0 to 3 :=0;
  signal cntr: integer range 0 to 40 := 0;
  signal slower: std_logic_vector(2 downto 0);
  signal DData: STD_LOGIC_VECTOR (35 downto 0);
  constant Gain : STD_LOGIC_VECTOR (7 downto 0) := "10001000"; -- reversed bit order
begin

  SPI_SS_B <= '1';  -- SPI üzerindeki diğer bileşenleri disable et
  SF_CE0 <= '1';
  FPGA_INIT_B <= '1';
 
 
  process(clk, Rst) begin
    if(rising_edge(clk)) then
      if(Rst='1') then
        AMP_CS <= '0';      AMP_SHDN <= '1';
        SPI_SCK <= '0';     SPI_MOSI <= '0';
        AD_CONV <= '0';     stt <= 0;  adcstt <= 0;
        cntr <= 0; slower <= "000";
      else
        AMP_SHDN <= '0';
        if(AMP_CS = '0') then -- handle amplifiers
          if(slower = "000") then
            case stt is
              when 0 => SPI_SCK <= '0'; 
              when 1 => SPI_MOSI <= Gain(cntr); 
              when 2 => SPI_SCK <= '1';
              when 3 => SPI_SCK <= '0';
                        if(cntr=7) then AMP_CS <= '1'; end if;
                        cntr <= cntr +1;
            end case;
            stt <= stt+1;
          end if;
          slower <= slower +1;
        else -- handle ADC
          if(adcstt=0) then
            -- bits (2-15) =channel-0 (bit reversed, ie LSB is at MSB position)
            -- bits (18-31) =channel-1 , diğer bitler kullanılmıyor.
            -- 8 biti (kanal 0) dışarı verelim, LED'leri yakalım
            DOUT <= DData(14 downto 7);
            AD_CONV <= '1';
            adcstt <= 1; cntr <= 0; stt <= 0;
          elsif(adcstt=1) then
            AD_CONV <= '0';
            adcstt <= 2; SPI_SCK <= '0';
          else
            case stt is
              when 0 => DData(cntr) <= SPI_MISO;
              when 1 => SPI_SCK <= '1';
              when 2 => SPI_SCK <= '0';
                        if(cntr=33) then adcstt <= 0; end if;
                        cntr <= cntr +1;
              when 3 => null;
            end case;
            stt <= stt+1;
          end if;
        end if;  -- amp or adc
      end if;    -- Reset
    end if;      -- clk'event
  end process;
 
end adc;