www.mikrocontroller.net

Forum: FPGA, VHDL & Co. AD7641 seriell ansteuern


Autor: Torsten Landschoff (bluehorn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Ich habe ein halbwegs amüsantes Problem. Wir haben ein Board mit einem 
Stapel AD7641 A/D Wandler (2MSPS, 18 Bit SAR). Diese sind seriell an 
einen fetten FPGA angebunden. Das Board haben wir gekauft mit 
Beispieldesigns. Letztere tasten die ADCs fies mit einer 140 MHz Clock 
ab (slave serial mode, was der Hersteller nicht empfiehlt).

Bin mir noch nicht klar, wie man die "vernünftig" anbindet, und dachte, 
ich stelle mal ein paar blöde Fragen hier im Forum. :)

Mein erster Gedanke (rein theoretisch, werden kaum das Board umbauen) 
war, das Master Serial Interface zu verwenden und mit einem/mehreren 
CPLDs die Daten aus den ADCs zu ziehen und auf der anderen Seite 
wiederum per SPI in den FPGA zu pumpen (Takt vom FPGA beim Auslesen).

Die Empfangsseite vom ADC könnte wie folgt aussehen (leicht gekürzt):
entity to_ad7641 is
port (adc_sync        : in std_logic;         -- frame synchronization
      adc_sclk        : in std_logic;         -- clock from adc
      adc_dout        : in std_logic;         -- data from adc
      data_ready      : out std_logic;        -- transitions on new data
      data            : out std_logic_vector(17 downto 0));
end entity to_ad7641;

architecture behavioural of to_ad7641 is

signal shift_in : std_logic_vector(17 downto 0);
signal ready : std_logic;

begin

data_ready <= ready;

-- Daten seriell übernehmen, wenn sync aktiv.
process (adc_sclk) is
begin
    if rising_edge(adc_sclk) then
        if adc_sync = '1' then
            shift_in <= shift_in(16 downto 0) & adc_dout;
        end if;
    end if;
end process;

-- Nach dem Transfer wird Sync low gezogen, dann reichen wir die Daten
-- weiter.
process (adc_sync) is
begin
    if falling_edge(adc_sync) then
        data <= shift_in;
        ready <= not ready;
    end if;
end process;

end architecture;

Rationale für die komische Formulierung: Wollte unabhängig von weiterer 
Taktquelle bleiben, SCLK stoppt nach dem Transfer, wenn ich das 
Datenblatt  http://www.analog.com/UploadedFiles/Data_Sheets/AD7641.pdf 
richtig lese.

Problem hier: Das Timing. Ich komme nicht so recht dahinter.

Nach Datenblatt (Figure 36) treibt der ADC die SDOUT-Leitung mindestens 
t22 = 1ns vor SCLK. Während SCLK high (t20 >= 2ns) ist SDOUT gültig.

Tja, wie gibt man das der Xilinx-Software an? Ich habe folgenden 
Constraint versucht:
NET "adc_sclk" TNM_NET = "adc_sclk";
TIMESPEC "TS_adc_sclk" = PERIOD "adc_sclk" 8 ns LOW 60 %;
NET "adc_dout" OFFSET = IN 0 ns BEFORE "adc_sclk" LOW ;

Die Angabe zu SCLK ist so nicht richtig: Die Periode kann zwischen 8ns 
und 14ns sein (t19). Dabei ist SCLK high mind. 2ns (t20) und SCLK low 
mind. 3ns (t21). Für adc_dout möchte ich angeben, dass der 1ns vor SCLK 
gesetzt wird und dann gehalten wird, bis SCLK auf low geht. In der Zeit 
müsste der Eingang gesampled werden.

Kann ich das in Xilinx Constraints modellieren? Ich tue mich da noch ein 
wenig schwer, weil ich bisher ganz gut ohne ausgekommen bin. Alles, was 
synchron läuft, kann er ja auch so analysieren.

Hoffe auf viele Kommentare,

  Torsten

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> das Master Serial Interface zu verwenden und mit einem/mehreren
> CPLDs die Daten aus den ADCs zu ziehen und auf der anderen Seite
> wiederum per SPI in den FPGA zu pumpen (Takt vom FPGA beim Auslesen)

Was soll das bringen? Da kannst den FPGA gleich mit einem 2. Takt 
versorgen.

Was ist Dein Problem? Läuft das Design?

Seh ich das richtig, Dein Takt kommt  vom ADC? Dann kannst Du damit die 
seriell->parallel Wandlung im FPGA machen und hintendran ein FIFO.

Rick

Autor: Torsten Landschoff (bluehorn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rick Dangerus wrote:
>> das Master Serial Interface zu verwenden und mit einem/mehreren
>> CPLDs die Daten aus den ADCs zu ziehen und auf der anderen Seite
>> wiederum per SPI in den FPGA zu pumpen (Takt vom FPGA beim Auslesen)
>
> Was soll das bringen? Da kannst den FPGA gleich mit einem 2. Takt
> versorgen.

Wenn man davon ein Dutzend Wandler hat, dann wird es schnell eng mit den 
Taktressourcen des FPGA. Zumal die alle unabhängig voneinander sind...

> Was ist Dein Problem? Läuft das Design?

Wohl weniger. Habe keinen CPLD, wollte nur mal evaluieren, ob man mit 
diesem Ansatz weiter kommt. Problem ist aber, dass der ADC SCLK nur für 
2 ns hochzieht und 1 ns vorher SDOUT beschreibt. Wenn ich die 
entsprechenden timing constraints angebe (s.o.), meckert ISE, dass er 
das Timing nicht erreichen kann.

Selbst, wenn ich den FPGA (grosser Virtex 4) als Ziel angebe, packt er 
das nicht. Master serial mode ist also raus. :(

> Seh ich das richtig, Dein Takt kommt  vom ADC? Dann kannst Du damit die
> seriell->parallel Wandlung im FPGA machen und hintendran ein FIFO.

Seriell zu parallel steht ja oben schon...

Gruss, Torsten

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.