Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

DCM w Spartanie 3E

09 Kwi 2008 13:15 2442 22
  • Poziom 15  
    Witam

    Muszę obsłużyć MIGa do DDR. Na wejście musi być podane 100MHz (0 i 90st). Podłączam sobie w tym momencie 2 DCMy kaskadowo. Pierwszy mnoży *2 i nie ma feedbacka, a drugi wykorzystuje wyjścia 0 i 90st. Zawsze jednak wyskakuje ostrzeżenie że wejście CLK_IN tego drugiego DCMa powinno być w zakresie 5-90MHz, a nie mogę ustawić parametru DLL frequency bo wtedy nie będę mógł korzystać z przesunięcia fazy o 90st.
    Ponadto mam pytanie czy w tym przypadku wyjście z pierwszego DCMa powinno iść przez global buffer czy local. Feedback drugiego DCMa mogę połączyć wewnętrznie i zewnętrznie.

    Generalnie układ zegarowy chodzi ale mam duże wątpliwości co do tego, że jest to optymalnie :). Uproszczony schemat poniżej:

    A tak btw to czy DDR RAM będzie chodził na 50MHz? Bo z dokumentacji mikrona wynika że trzeba podać co najmniej 77MHz.
  • PCBway
  • Pomocny post
    Poziom 18  
    pidorek napisał:
    Witam

    Muszę obsłużyć MIGa do DDR. Na wejście musi być podane 100MHz (0 i 90st). Podłączam sobie w tym momencie 2 DCMy kaskadowo. Pierwszy mnoży *2 i nie ma feedbacka, a drugi wykorzystuje wyjścia 0 i 90st. Zawsze jednak wyskakuje ostrzeżenie że wejście CLK_IN tego drugiego DCMa powinno być w zakresie 5-90MHz, a nie mogę ustawić parametru DLL frequency bo wtedy nie będę mógł korzystać z przesunięcia fazy o 90st.

    No to jesteś w dupie. Ja bym olał 10MHz nikogo nie zbawi. W pierwszym DCM-ie użyj wyjscia 2x, będzie szansa na mniejszy jitter. Albo w ogóle zrób na jednym DCM-ie.

    pidorek napisał:

    Ponadto mam pytanie czy w tym przypadku wyjście z pierwszego DCMa powinno iść przez global buffer czy local. Feedback drugiego DCMa mogę połączyć wewnętrznie i zewnętrznie.

    Generalnie układ zegarowy chodzi ale mam duże wątpliwości co do tego, że jest to optymalnie :). Uproszczony schemat poniżej:

    Jeśli chodzi to znaczy że idzie przez BUFG. DCM musi być sterowany z BUFG.

    pidorek napisał:

    A tak btw to czy DDR RAM będzie chodził na 50MHz? Bo z dokumentacji mikrona wynika że trzeba podać co najmniej 77MHz.

    Chyba sam sobie odpowiedziałeś.

    Dodano po 1 [minuty]:

    Feedback raczej zewnętrznie przez odpowiedniej długości ścieżkę na PCB.

    Dodano po 19 [minuty]:

    Nie wiem jaką masz dokumentację, ale z tego co udostępnia Xilinx to 5-90MHz dotyczy tylko niektórych układów ze stepping level 0, i to niezależnie od trybu pracy DCM-a. Może najpierw sprawdź sobie jaki masz układ na docelowej płytce.
  • Pomocny post
    Poziom 27  
    pidorek napisał:
    Muszę obsłużyć MIGa do DDR

    co to jest MIG ?, mnie sie jedynie z lotnictwem kojarzy;
    moze nie uzywajmy koledzy i ew. kolezanki skrotow, ktore sa
    specyficzne dla narzedzia/urzadzenia z ktorym aktualnie pracujemy ?

    skad w ogole pomysl, by laczyc 2 pll-ki w kaskade, korzysc zadna,
    a jedynie szansa na wiekszy jitter;
    jezeli dobrze sie domyslam, ze clock 90° ma pracowac jako dqs,
    to nie musi to byc dokladnie 1/4 fazy, wystarczy opoznienie
    o 2-3ns dla czestotliwosci pracy 100-200MHz, przy wyzszych
    raczej 1-2ns;
    Cytat:
    /.../wyjście z pierwszego DCMa powinno iść przez global buffer czy local

    moim zdaniem nie ma to zadnego znaczenia, narzedzie [ise] powinno samo
    wybrac wlasciwy driver zegara;
    Cytat:
    A tak btw to czy DDR RAM będzie chodził na 50MHz?

    minimalna czestotliwosc pracy zapewnia timingi zgodne ze specyfikacja
    ddr i z tym, co mozesz ogladnac w datasheet micron;
    moje doswiadczenia sa takie, ze im nizsza czestotliwosc, tym bardziej
    'rozjezdza' sie faza clock i dqs w czasie odczytu, ale pamiec
    pracuje dalej, trzeba jednak ten 'rozjazd' uwzglednic w kontrolerze
    pamieci;

    J.A
  • Poziom 18  
    J.A napisał:
    to nie musi to byc dokladnie 1/4 fazy, wystarczy opoznienie
    o 2-3ns dla czestotliwosci pracy 100-200MHz, przy wyzszych
    raczej 1-2ns;

    Dobre, tego nie wiedziałem.
  • PCBway
  • Pomocny post
    Poziom 27  
    [g.d] napisał:

    narysowalem taki schemat wejscia ddr, ktory chyba wyjasnia
    sprawe '90°';

    czarne to dane, czerwone dqs;
    przesuniecie dqs o ok 2ns powoduje, ze setup time jest staly, niezalezny
    od czestotliwosci, wlasnie 2ns, wieksza czestotliwosc to przesuwanie
    sie tego, co zaznaczone na zielono, czyli efektywnie kurczy sie hold time;

    J.A
  • Poziom 15  
    Widzę, że będę musiał to wypróbować.

    MIG - Memory Interface Generator, component do obsługi DDR SDRAM.

    Co do pracy RAMu na niższych częstotliwościach to wolałem się spytać bo widziałem, że Xilinx odpala taki ram na zegarze 50MHz. Widocznie skoro jest ok to musi te przesunięcia kontrolować, ale w to się nie wgłębiałem.
  • Pomocny post
    Poziom 27  
    pidorek napisał:
    widziałem, że Xilinx odpala taki ram na zegarze 50MHz

    co to znaczy: "xilinx odpala" ?


    pidorek napisał:
    Widocznie skoro jest ok to musi te przesunięcia kontrolować,
    ale w to się nie wgłębiałem

    jak rozumiem, masz zew. czestotliwosc 50MHz, czemu nie mozesz
    jej podniesc do 80MHz ?
    nie wyobrazam sobie, jak ise, czy tez ten mig moglby uwzgledniac
    przesuwanie sie dqs wzgledem clock, to zachowanie sie jest
    specyficzne dla konkretnej pamieci i zalezne od czestotliwosci;
    ja musialem mierzyc oscyloskopem i odpowiednio dopasowywac opoznienia
    w fpga, inaczej bylo dla 40MHz, inaczej dla 60MHz;
    nie liczylbym na to, ze twoj generator potrafi przewidziec zachowanie
    sie pamieci, ktora pracuje w warunkach poza specyfikacja;

    J.A

    Dodano po 8 [minuty]:


    a przy okazji - czym mozna narysowac pod winda prosty schemacik,
    prostokaty plus polaczenia i jakies opisy ?
    ja swoj rysunek w tym watku zrobilem paint'em i szlag mnie
    trafial pod koniec rysowania ...
    JA
  • Poziom 15  
    Cytat:
    co to znaczy: "xilinx odpala" ?


    Do trochę mniejszego sprartana umieszczają kody źródłowe gdzie MIG jest sterowany z 50 MHz (0 i 90 st) albo 66 MHz, nie jestem pewny bo 2 zegary idą do środka.

    Cytat:
    a przy okazji - czym mozna narysowac pod winda prosty schemacik,
    prostokaty plus polaczenia i jakies opisy ?
    ja swoj rysunek w tym watku zrobilem paint'em i szlag mnie
    trafial pod koniec rysowania ...


    paintem :) ale fakt długo się rzeźbi
  • Poziom 15  
    Cytat:
    co to znaczy: "xilinx odpala" ?


    Przepraszam skłamałem. Na evalu ze Spartanem 3E 1600 na płytce jest generator 50MHz, 66MHz i złącze SMA na wejście zegarowe. Sprawdzałem na schemacie i w ucfie i ten zegar jest podłączony przez złącze SMA. Zastanawiam się teraz czy taka konfiguracja jak narysowałem wcześniej umożliwi mi sprawne korzystanie z ramu, skoro xilinx nie korzystał z DCM 2x tylko podpiął 133MHz bezpośrednio do FPGA a w środku jest tylko DCM, który wypuszcza 0 i 90st.
  • Poziom 27  
    przeciez ten dcm pozwala na wiecej, niz tylko pomnozenie wejsciowego
    clock przez 2;
    ustaw parametry swojego clock manager tak, by generowal zegar
    ok. 100MHz i drugi o tej samej czestotliwosci, ale przesuniety i tyle;

    J.A
  • Poziom 15  
    Ale jeden DCM nie może jednocześnie mnożyć razy 2 i przesuwać o 90 st. Mogę wtedy jedynie korzystać z wyjścia 0 i 180 st, albo tak jak na rysunku wykorzystując dwa DCMy. Jeśli się mylę proszę mnie poprawić.
  • Pomocny post
    Poziom 27  
    pidorek napisał:
    Ale jeden DCM nie może jednocześnie mnożyć
    razy 2 i przesuwać o 90 st

    no faktycznie, kiepsko to wyglada, przed chwila poczytalem sobie
    o tym bloku dcm; dziwne, w ukladach altery pll ma 4-6 wyjsc
    i kazde wyjscie ma niezaleznie ustawiana czestotliwosc
    i przesuniecie fazy, myslalem, ze spartan/virtex maja podobnie;

    nie jest prawda, ze nie moze pomnozyc i przesunac jednoczesnie,
    problem w tym, ze z tego co przeczytalem wynika, ze moze przesunac
    jedynie wszystkie wyjscia naraz o te sama wartosc;

    mozesz zrobic tak: wygenerowac po prostu clock 2x, jesli wymusisz na ise,
    by go puscil przez jakas bramke, to bedziesz mial tez zegar 2x przesuniety
    o pare nanosekund, akurat przy czestotliwosci 100MHz zbytnia precyzja
    nie jest potrzebna;
    [jak 'wymusic' na ise nie wiem, zainstaluj quartus, to ci powiem ... :)]

    mozesz uzyc 2 dcm - jeden robi clock 2x, drugi 2x i przesuniecie;
    raczej powinienes sprawdzic oscyloskopem efekt;

    byc moze mozna tez - taka teoretyczna mozliwosc, bo nie probowalem
    w praktyce - podniesc clkin 4 razy, na jednym FF taktowanym zboczem
    narastajacym podzielic przez 2 - dostaniesz zegar 'podstawowy', na drugim
    taktowanym zboczem opadajacym dostaniesz zegar przesuniety o 90°;

    ==========================

    jeszcze jedna 'dowcipna' mozliwosc przyszla mi do glowy,
    mozesz zegar 100MHz wypuscic na 2 piny I/O i 'zawrocic' je z powrotem
    do fpga;
    wykorzystujac wbudowane w celi i/o opoznienie sygnalu wejsciowego,
    jeden clock opozniasz o zadana liczbe ns;
    to opoznienie jest precyzyjnie kontrolowane;

    J.A
  • Poziom 15  
    Wielkie dzięki. Bardzo fajne porady. Szczególnie ta z opóźnieniem na bramce (niestety jeszcze nie wiem jak to zrobić ;)) i mnożeniem *4. Póki co czekam na generator 100MHz. Jak już będę miał odpalone w ten najprostszy sposób to będę próbował to zrobić na wymieniony przez Ciebie sposób.
  • Pomocny post
    Poziom 27  
    pidorek napisał:
    /.../opóźnieniem na bramce (niestety jeszcze nie wiem jak to zrobić)

    wejdz na strone xilinxa i zrob search na: "synthesis attribute keep";

    a potem w ogole poczytaj o atrybutach syntezy, bywa czasem pomocne;

    J.A
  • Pomocny post
    Poziom 18  
    pidorek napisał:
    Póki co czekam na generator 100MHz. Jak już będę miał odpalone w ten najprostszy sposób to będę próbował to zrobić na wymieniony przez Ciebie sposób.

    Najprostszy sposób jest najlepszy, jak będziesz miał generator 100MHz to nie potrzebujesz żadnych dodatkowych nieudokumentowanych obejść.

    Dodano po 34 [minuty]:

    J.A napisał:
    pidorek napisał:
    /.../opóźnieniem na bramce (niestety jeszcze nie wiem jak to zrobić)

    wejdz na strone xilinxa i zrob search na: "synthesis attribute keep";

    a potem w ogole poczytaj o atrybutach syntezy, bywa czasem pomocne;

    J.A

    "synthesis attribute keep"; to zachowanie nazwy sygnału, a może i dobrze... :D
    Generalnie, jak się wstawi prymityw danej technologii to synteza nie powinna go ruszyć, szczególnie jak się nie doda źródeł prymitywu ;-)
    Więc powinno się obejść bez atrybutów, pomocne szczególnie że inne programy mają inne atrybuty.(choć pewnie każdy korzysta na ogół z jednego programu :cry:)
  • Poziom 27  
    [g.d.] napisał:
    "synthesis attribute keep"; to zachowanie nazwy sygnału

    'keep' chroni przed optymalizacja, nie tylko zachowuje nazwe;

    [g.d.] napisał:
    Generalnie, jak się wstawi prymityw danej technologii to synteza nie powinna go ruszyć

    quartus wywala bezlitosnie, jesli uzna, ze nie jest potrzebny;
    trzeba uzyc "keep/preserve" by bramka czy ff zostaly zachowane;
    nie sadze, by ise mialo inna polityke wzgledem logiki, ktora
    optymalizacja uzna za zbedna;

    J.A
  • Poziom 18  
    J.A napisał:
    [g.d.] napisał:
    "synthesis attribute keep"; to zachowanie nazwy sygnału

    'keep' chroni przed optymalizacja, nie tylko zachowuje nazwe;

    Chroni sygnały, nie wiem na ile instancje

    J.A napisał:

    [g.d.] napisał:
    Generalnie, jak się wstawi prymityw danej technologii to synteza nie powinna go ruszyć

    quartus wywala bezlitosnie, jesli uzna, ze nie jest potrzebny;
    trzeba uzyc "keep/preserve" by bramka czy ff zostaly zachowane;
    nie sadze, by ise mialo inna polityke wzgledem logiki, ktora
    optymalizacja uzna za zbedna;

    ISE(map.exe, par.exe) wyrzuca bezlitośnie wszystko co nie jest uzywane (co ma niepodłączone do niczego wyjścia, albo wejscia na constant). No chyba że dostanie switch -u. Nie tyka niczego co wygenerowała synteza (np. Synplify) i jest używane.

    Wydaje mi się że Synplify nie tyka niczego co zostało zainstancjonowane i jest używane(podpięte). Attrybuty syn_keep, syn_noprune są dobre dla instancji które np. nie mają wyjść, albo z jakiś powodów mogą zostać usuniete a sa potrzebne.
  • Poziom 15  
    Cytat:
    jeszcze jedna 'dowcipna' mozliwosc przyszla mi do glowy,
    mozesz zegar 100MHz wypuscic na 2 piny I/O i 'zawrocic' je z powrotem
    do fpga;
    wykorzystujac wbudowane w celi i/o opoznienie sygnalu wejsciowego,
    jeden clock opozniasz o zadana liczbe ns;
    to opoznienie jest precyzyjnie kontrolowane;



    No bardzo dowcipna :). Odpuszczę sobie jednak takie kombinacje. A co do tego keep hierarchy to co nieco widziałem. Mam już to ustawione na 'soft' bo MIG tego wymaga.
  • Pomocny post
    Poziom 27  
    pidorek napisał:
    A co do tego keep hierarchy to co nieco widziałem


    moze sie myle, ale jest mala szansa, ze jednak sie nie rozumiemy ...

    najlepiej wyjasnic sprawe na przykladzie :);
    [w verilogu oczywiscie jak zawsze w moim przypadku, ale przyklad
    jest tak prosty, ze piszacy w vhdl nie powinni miec problemu]

    Code:

    module syn_keep
    (
       input       clk, in_a, in_b, in_c, in_d,
       output reg  out_a, out_b, out_c, out_d
    );

    wire clkb;
    wire clkc;
    wire clkd /*synthesis syn_keep*/;

    assign clkb = clk;
    lcell del_clk ( .in(clk), .out(clkc) ); // "lcell" - prymityw altery
    assign clkd = clk;                      // clkd 'chroniony' przez syn_keep

    always @(posedge clk)
      out_a <= in_a;

    always @(posedge clkb)
      out_b <= in_b;

    always @(posedge clkc)
      out_c <= in_c;

    always @(posedge clkd)
      out_d <= in_d;

    endmodule


    flip-flop out_a jest wyzwalane bezposrednio zegarem wejsciowym;
    out_b uzywa clkb, ktory jest przez quartus zamieniony na clk;
    clkc jest wyjsciem z prymitywu 'lcell' i nie zostal zoptymalizowany,
    [tak jak twierdzil g.d, punkt dla niego, ja nie bylem pewien];
    clkd jest 'chroniony' przed optymalizacja przez dyrektywe:
    syn_keep;
    wg. mojego quartusa opoznienie przez taka pojedyncza cele wynosi
    nieco ponad 1ns, wiec raczej trzeba by uzyc dwie cele;
  • Poziom 15  
    No powiedzmy, że do końca tak tego nie rozumiałem. Wielkie dzięki, będę musiał trochę poćwiczyć z opóźnieniami na logice bo w tym momencie nie ukrywam jestem zielony w tym temacie.

    W MIGu jest używane w wielu architekturach żeby nie optymalizowało logiki. Tyle że ja myślałem że to się ustawia w opcjach syntezatora a tam właściwie ustawiałem tylko czy ma brać pod uwagę syn_keep czy je ignorować :).
  • Poziom 18  
    J.A napisał:
    wg. mojego quartusa opoznienie przez taka pojedyncza cele wynosi nieco ponad 1ns, wiec raczej trzeba by uzyc dwie cele;

    1 ns to dobra wartość na 1 cele, w przypadku 2-ch zwykle zakładam 2 ns + 1 ns na połaczenie pomiędzy celami, czyli w sumie około 3 ns.

    W ISE problem jest tego typu że od około wersji 9.x zamiast warning-a o zegarze routowanym lokalnymi połaczeniami jest error i trzeba ustawiać zmienną środowiskową XIL_PLACE_ALLOW_LOCAL_BUFG_ROUTING, wiem bo mam ją ustawionią na stałe od jakiegoś czasu :D. A od wersji 10.x trzeba zadeklarować taki zegar routowany po zasobach lokalnych w pliku *.ucf, szczęśliwie to nie moje zmartwienie. ;)

    Pozdrawiam

    Dodano po 9 [minuty]:

    pidorek napisał:
    Tyle że ja myślałem że to się ustawia w opcjach syntezatora a tam właściwie ustawiałem tylko czy ma brać pod uwagę syn_keep czy je ignorować :).

    Na każdym etapie jest jakaś tam optymalizacja i coś może zostać usunięte bądź nie mieścić się warunkach wymaganych na koniec danego etapu. Najwięcej w syntezie do netlisty bo na wejściu do tego procesu jest projekt napisany przez użytkownika, potem to już jakoś leci ;)

    Mnie się wydaje że syn_keep to optymalizacja na poziomie upychania do cel. Sygnał który ma syn_keep będzie "na zewnątrz" celi, ale nie daję głowy. Natomiast syn_noprune to żeby Synplify nie usuwało danej instancji, nawet jak ma na to ochotę ;)
  • Poziom 27  
    [g.d.] napisał:
    1 ns to dobra wartość na 1 cele/.../

    na jedna cele dobra, quartus zrobil to tak, jak na rysunku,
    bo uklad jest prosty [maly fan-out] i nie ma polaczen
    rejestr-rejestr;
    w przypadku 'normalnego' projektu, ten opozniony clock
    poszedlby na bufor zegarowy i dopiero z niego sterowane
    bylyby wejscia clk flip-flop'ow;
    a to sumarycznie daloby ok. 3ns w ukladach stratix
    [z nimi mam najwieksze doswiadczenie];
    w cyklonach pewnie jeszcze wieksze;

    [g.d.] napisał:
    W ISE problem jest tego typu że od około wersji 9.x/.../

    kolejny powod, po tych 'dziwnych' dcm, by nie lubic ise ... ;)

    J.A
  • Poziom 18  
    J.A napisał:
    kolejny powod, po tych 'dziwnych' dcm, by nie lubic ise ... ;)


    Dostrzegam nutę ironii :D, ale DCM-y są o.k. tylko trzeba się przegryźć przez samą koncepcję pętli dll, potem to już jest z górki, no chyba że ktoś woli mieć cały czas pod górkę. ;)