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.

FIR Compiler Altera sygnały wejściowe

07 Lip 2008 02:08 2815 26
  • Poziom 10  
    Witajcie,

    Mam pytanie do Was, czy ktoś z tutaj obecnych używał z powodzeniem generatora filtrów firmy Altera FIR Compiler?

    Otóż mam problem z projektem modulatora sigma - delta i właśnie ze stopniem filtru interpolacyjnego.

    Temat jest opisany tutaj: (przepraszam, że nie wklejam całości, ale tak wydawało mi się to bardziej sensowne)

    Temat na Forum Altery

    W symulacjach cały układ działa. Jednak zaimplementowany nie pracuje tak jak powinien niestety. Główne pytanie jest takie czy w odpowiedni sposób podaje sygnały do wejść tych dwóch filtrów wygenerowanych przez FIR Compiler'a.

    Z góry dziękuję za wszelkie sugestie.

    Serdecznie pozdrawiam,

    Marcin
  • PCBway
  • Poziom 27  
    fulinstrumentale napisał:
    /.../mam problem z projektem modulatora/.../

    jesli o mnie chodzi, to nie ma szans bym sie przebrnal ze zrozumieniem
    przez to, co zrobiles;
    ale jesli uwazasz, ze symulacja pokazuje poprawne dzialanie ukladu,
    to dodaj signaltap i porownaj przebiegi ze sprzetu z tym, co pokazuje
    symulator;
    dodajac signaltap miej na uwadze, ze jesli projekt sam w sobie
    pochlania znaczace - powiedzmy wiecej niz 50% - zasoby fpga, to
    monitorowanie zbyt duzej liczby sygnalow na raz w analizatorze
    moze zmienic timing calosci;
    majac symulacje jako referencje powinienes byc w stanie w miare
    szybko znalezc miejsce gdzie symulacja i zaschowanie hardware sie
    roznia; a potem powinno byc 'z gorki';

    J.A

    Dodano po 33 [minuty]:

    wlasnie zobaczylem pytania pod Twoim postem na forum Altery ... :)

    Cytat:
    1. Is that a problem with that I'am not using on-board clock (50MHz)?

    nie sadze, chyba ze zegar ktorego uzywasz jest 'kiepskiej jakosci';

    Cytat:
    3. How can I get rid of those Clock Holds?

    trudno powiedziec bez znajomosci calosci i narzedzi do analizy
    quartusa, pierwsza rzecza ktora mozesz zrobic, to zmienic
    ustawienia kompilacji, by narzedzie bardziej sie postaralo osiagnac
    wymagania czasowe:
    settings->fitter settings->Router effort multipl. i router timing opt. level;

    jezeli uzywasz wyjsc licznikow jako sygnalow zegarowych to w pewnych
    okolicznosciach mozesz miec problem, bo ich faza moze byc przesunieta,
    co da wlasnie problemy z hold lub setup time;
    takie rozsuniecie w fazie powinienes zauwazyc na symulacji czasowej;
    ale nie patrz na q[x] licznika, bo jesli sygnal jest uzywany jako zegar,
    to idzie najpierw na clockctrl modul, a dopiero potem na porty
    zegarowe FF; jak to quartus zrobil mozesz zobaczyc na floorplan view;

    J.A
  • Poziom 10  
    Dziękuję za szybką odpowiedź.

    Nie pomyślałem powiem szczerze o tym żeby sprawdzić wszystko w Signal Tap. Mam "web edition" i do tej pory nie pozwalał mi go odpalić i dopiero przed chwilą zobaczyłem, że trzeba zmienić jedną z opcji w Quartus'ie.

    Co do używania wyjść z licznika jako zegarów do następnych bloków to bardzo dużo się o tym naczytałem i bardzo wiele różnych kombinacji robiłem. Najlepsze jest to, że jak wyrzucam te sygnały zegarowe z wyjścia licznika na I/O pins na płycie, to na oscyloskopie zegary te wyglądają bardzo dobrze i tak jak powinny...

    Zupełnie odmienną natomiast rzeczą jest używanie FIR Compiler'a od Altery...Niby w symulacjach filtry te dobrze działają, ale ja jednak mam sporo wątpliwości co do tego czy dobrze łączę ze sobą filtry, a przede wszystkim czy w odpowiedni sposób podaję sygnały na wejścia filtrów (odkąd wprowadzili te dodatkowe sygnały do współpracy z interfejsem Avalon-ST nie jest to wcale do końca jasne...).

    Tak więc może ktoś z Was miał do czynienia właśnie z filtrami generowanymi przez FIR Compiler?

    Jutro postaram się sprawdzić wyniki w Signal Tap i dam znać co i jak.

    Dzięki i pozdrawiam.

    Marcin
  • Poziom 27  
    fulinstrumentale napisał:
    jak wyrzucam te sygnały zegarowe z wyjścia licznika na I/O pins na płycie,
    to na oscyloskopie zegary te wyglądają bardzo dobrze i tak jak powinny

    ten obraz na oscyloskopie moze byc niestety zludny;
    rzecz w tym, ze jesli Twoj projekt mocno zalezy od wzajemnej
    fazy zegarow produkowanych przez licznik, to bardziej polegalbym na
    symulatorze, niz na osyloskopie - zaskakujaca opinia na pierwszy rzut oka,
    ale musisz wziac pod uwage to, ze na osyloskopie nie widzisz sygnalow
    clock, ktore docieraja do wejsc 'clk' przerzutnikow, ale sygnaly po przejsciu
    od driver'ow zegarow do I/O bloku - czas przejscia miedzy zrodlem zegara
    a pinem fpga moze byc znaczaco rozny dla roznych zegarow;
    o samym module fir altery nic Ci nie powiem, bo nigdy ich nie uzywalem;
    ale z signaltap moge sluzyc pomoca :);
    a przy okazji - czemu korzystasz w top level z edytora schematow
    by polaczyc ze soba 'pod-moduly' ?
    korzysc z tego zadna;

    J.A
  • Poziom 17  
    Nie mozesz robic tak ze dzielisz zegar a potem wyjscie tego dzielnika podajesz na wejscie zegarowe innego modulu.
    Tak sie da ale sie nie robi, poczytaj warningi quartusa, napewno napisal cos o "gated clocks".
    To wszystko ma chodzic na zegarze z wejscia/pllki, jak chcesz miec podzielony to wyjscie z dzielnika przypnij do wejscia enable.

    Reset powinien byc asynchronicznie ustawiany ale zwalniany synchronicznie.

    RMCK i OSCLK to jest to samo zrodlo zegara? czy masz 2 rozne? jesli tak to Q(6:0) musi byc zsynchronizowane z OSCLK.
  • Poziom 10  
    Witajcie!

    Cytat:
    bardziej polegalbym na
    symulatorze, niz na osyloskopie - zaskakujaca opinia na pierwszy rzut oka


    Rzeczywiście mnie to zaskoczyło, ale to zapewne dlatego, że nie mam zbyt dużego doświadczenia z FPGA i wszystko co robię, robię "na wyczucie, że tak powinno to działać"... Poza tym dopiero od 1,5 miesiąca używam Quartus'a i może dlatego robię tak:
    Cytat:
    a przy okazji - czemu korzystasz w top level z edytora schematow
    by polaczyc ze soba 'pod-moduly' ?
    korzysc z tego zadna;


    Co do Signal Tap bardzo dziękuję za chęć pomocy i na pewno skorzystam, niestety dzisiaj nie miałem czasu podłączyć wszystkiego, ale myślę, że w tym tygodniu znajdę chwilę.

    Cytat:
    Nie mozesz robic tak ze dzielisz zegar a potem wyjscie tego dzielnika podajesz na wejscie zegarowe innego modulu.
    Tak sie da ale sie nie robi


    No właśnie powiem Ci szczerze, że również i to mnie zaskoczyło...jak pamiętam z uczelni to takimi właśnie sygnałami z liczników operowaliśmy przy "laboratoryjnych projektach" i nie było z tym problemów (może to zależeć od środowiska i firmy produkującej dany sprzęt?).

    Co do tych zegarów RMCK i OSCLK. Wg tego co wyczytałem w nocie katalogowej układu CS8416 (CS 8416) to wydaje mi się, że pochodzą one z tego samego źródła...

    FIR Compiler Altera sygnały wejściowe


    Co do PLL...niestety nie mogę z niego skorzystać, bo potrzebne mi są zbyt niskie częstotliwości. Co do wejść "enable", próbowałem tak robić, ale zawsze coś mi gdzieś nie pasowało tak więc jeśli nie uważacie tego za zły pomysł załączam sam moduł wejściowy (archiwum projektowe Quartus'a). I na tej podstawie ,jako bardziej doświadczeni użytkownicy, nauczycie mnie czegoś, a przy okazji może i Inni na tym skorzystają...

    Serdecznie pozdrawiam!

    Marcin

    PS. Nie pamiętam już jak tu się wstawiało załączniki więc przepraszam i podaję link: IN_MODULE
  • Pomocny post
    Poziom 17  
    1. DDR jest na wyjsciu kosci, takze wszystko - caly design ma chodzic albo na rising albo na falling edge nie utrudniaj sobie zycia.
    2. Nie operuj na variable, uzyj signal
    3. Jeden proces/always - jeden wektor/sygnal

    To jest System Verilog: reg [31:0] shiftreg = 0; - wiedziales o tym?

    O resecie juz pisalem.
    Jesli nie wiesz jak wygladaja wzajemne relacje zegarow to traktuj je jako asynchroniczne wzgledem siebie. Takze q6 przepusc przez detektor zbocza i zpipelinuj 3x z zegarem osclk. Oczywiscie buff ma operowac na osclk. Nie bede tu sie rozpisywal 10x dlaczego bo to jest napisane w kazdym dokumencie altery/xilinxa dotyczacym poprawnego kodowania.

    Wejscia danych Datain, rxdata i Dataout zatrzasnij jeszcze jeden raz, tak zeby miec rowno zatrzasniete na pinach, a wogole jestes pewien ze zatrzaskujesz to dobrze? jaka jest relacja zegara ktorym to zatrzaskujesz do naplywajacych danych? moze sie wstrzelasz w setup/hold?
  • PCBway
  • Poziom 10  
    Cześć.

    Przepraszam, że tak długo nie pisałem.

    Griva:

    Będę robił wszystko po kolei, bo nie jestem "biegły" niestety w projektowaniu w FPGA...Z tym resetem to chodzi Ci o coś takiego?

    FIR Compiler Altera sygnały wejściowe

    Z zatrzaskiwaniem to powiem Ci szczerze, że mam kilka wątpliwości. Nie wiem czy dobrze Cię zrozumiałem żeby zatrzasnąć dane na zwykłych przerzutnikach? Obiło mi się kiedyś o uszy, że aby uniknąć metastabilności to można używać "techniki" double flopping, ale tego się używa do przesyłania danych jednobitowych między dwoma różnymi domenami zegarów?

    Myślałem o tym żeby użyć FIFO do tego celu, ale nie jestem do końca przekonany czy coś mi to da...

    Cytat:
    Takze q6 przepusc przez detektor zbocza i zpipelinuj 3x z zegarem osclk


    Niestety nie rozumiem do końca idei takiej operacji...

    Siadam dalej i będę próbował.

    Pozdrawiam,
    Marcin
  • Poziom 17  
    Tu masz zagadnienia dot. clk enabli i pare innych fajnych rzeczy.
    Link

    ten 3x pipeline jest wlasnie po to zeby wykluczyc metastabilnosc. Fifa uzywasz jak chcesz przekroczyc domene danymi a nie jednym sygnalem, za duze marnotrastwo ;-)

    Reset ma wygladac tak:

    Code:
    reg [3:0] reset_srl;
    

    always @(posedge clk or posedge reset)
    if (reset)
     reset <= 4'hF;
    else
     reset <= {reset[2:0], 1'b0};

    wire DesignReset = reset[3]; //ten wire podlaczasz do Twoich modulow

    i na koniec maly cytat:

    If you use the output from combinational logic as a clock signal or as an
    asynchronous reset signal, you should expect to see glitches in your
    design. In a synchronous design, glitches on data inputs of registers are
    normal events that have no consequences. However, a glitch or a spike on
    the clock input (or an asynchronous input) to a register can have
    significant consequences. Narrow glitches can violate the register’s
    minimum pulse width requirements. Setup and hold times may also be
    violated if the data input of the register is changing when a glitch reaches
    the clock input. Even if the design does not violate timing requirements,
    the register output can change value unexpectedly and cause functional
    hazards elsewhere in the design.
  • Poziom 10  
    Cześć.

    Dzięki za odpowiedź, ale nurtuje mnie jeszcze jedna sprawa...

    Jeśli używam zegarów generowanych na podstawie innego zegara to czy problemy związane z metastabilnością muszę rozwiązywać na etapie projektowania czy wystarczy w odpowiedni sposób użyć narzędzia TimeQuest w Quartus'ie?

    Chodzi mi o coś takiego...

    TIME QUEST Example

    Serdecznie pozdrawiam,

    Marcin
  • Poziom 17  
    fulinstrumentale napisał:
    Cześć.

    Dzięki za odpowiedź, ale nurtuje mnie jeszcze jedna sprawa...

    Jeśli używam zegarów generowanych na podstawie innego zegara to czy problemy związane z metastabilnością muszę rozwiązywać na etapie projektowania czy wystarczy w odpowiedni sposób użyć narzędzia TimeQuest w Quartus'ie?

    Chodzi mi o coś takiego...



    przeciez wkleilem Ci linka, NIE UZYWASZ GENEROWANYCH ZEGAROW - chyba ze projektujesz ASICi, w co watpie.
    Generalnie wczesnym etapie projektowania jest ustalenie domen zegarow, ich przejsc oraz strategia resetow.
    To ze TimeQuest potrafi zconstrainowac design jeszcze nic nie oznacza, bo co zrobisz jak zmieni sie producent kosci, wymaganie fmax wzrosnie. Prowizorka zazwyczaj przestaje dzialac jak oddasz produkt do klienta :)
  • Poziom 27  
    fulinstrumentale i griva napisał:
    rozne rzeczy o zegarach

    ja generalnie jestem znacznie mniej restrykcyjnie nastawiony do
    dzielenia zegarow za pomoca licznika niz griva, uzywanie wyjsc
    przerzutnikow jako sygnalow clock uwazam za normalna technike w fpga;
    troche uwagi trzeba poswiecic sytuacji, gdy jeden modul przetwarza
    dane z zegarem bedacym wyjsciem q[j] licznika po czym dane te
    trafiaja do modulu operujacego z zegarem, ktorego zrodlem jest q[j+1],
    na przyklad;
    powazny problem jest wtedy, gdy masz moduly pracujace z zegarami,
    ktore sa calkowicie asynchroniczne, ale wydaje mi sie, ze to nie
    jest Twoj przypadek fulinstrumentale;

    wklejony fragment:
    "If you use the output from combinational logic as a clock..."
    mowi o czyms innym i takich rozwiazan faktycznie nalezy sie wystrzegac;
    przykladem moze byc clock tworzony w taki sposob:
    jest licznik i zegar zdefiniowany jako '1' jesli licznik < 7, jako '0'
    w przeciwnym przypadku; w tym przypadku sygnal zegarowy jest wyjsciem
    z logiki kombinacyjnej, jak zalozono we wklejonym fragmencie;

    fulinstrumentale napisał:
    Jeśli używam zegarów generowanych na podstawie innego zegara, to czy problemy
    związane z metastabilnością muszę rozwiązywać na etapie projektowania, czy wystarczy
    w odpowiedni sposób użyć narzędzia TimeQuest w Quartus'ie?

    metastabilnosc wystepuje wtedy, gdy dane i probkujacy je clock sa asynchroniczne,
    wtedy to zjawisko musi wystapic raz na jakis czas, w ukladzie synchronicznym,
    o ile okres zegara jest dluzszy niz najdluzsza sciezka kombinacyjna, zjawisko
    to [metastab.] nie wystepuje [oczywiscie, zawsze mozna cos sp*rzyc ...];
    tak wiec w constrains de facto masz podac okres zegara by kompilator
    postaral sie tak ulozyc ligike, by przetwazanie kombinacyjne trwalo krocej
    niz czas miedzy kolejnymi zboczami; w pewnym uproszczeniu ...;

    co do Twojego problemu fulinst. moze pomocne bedzie podzielenie
    projektu na 2 czesci;
    w pierwszej czesci masz - o ile dobrze pamietam - kawalek ktory szeregowe
    dane zamienia na 16 bitowy wektor, ogranicz sie na poczatek do tego
    fragmentu i upewnij sie symulatorem i signatap-em, ze naprawde dostajesz
    na wyjsciu ukladu wstepnego to, co wprowadzasz jako dane szeregowe;
    potem zastanowimy sie nad testowaniem filtra;

    J.A
  • Poziom 17  
    J.A napisał:
    uzywanie wyjsc przerzutnikow jako sygnalow clock uwazam za normalna technike w fpga;


    sorki ale sie nie zgodze, to nie jest normalna technika. Jesli kazdy producent fpga pisze zeby tak nie robic to napewno z czegos to wynika.
    Mozemy sie zastanowic, juz zakladajac ze wyjscie dzielnika zostanie przeciete przerzutnikiem, przeroutowanie na wejscie clk przerzutnika sygnalu z linii danych skutkowac bedzie zawsze wiekszym opoznienim niz sygnal z lini zegarowej. Dodatkowo opoznienie jest bardzo nie deterministyczne bo zalezy od wzajemnego polozenia dzielnika i przerzutnika. Owszem mozna to zconstrainowac, zrobic reczny placement, area itd. tylko co wtedy jak pol projektu ma takie kwiatki?

    Kazdy taki dzielnik mozna opisac w pelni synchronicznym kodem. Sa sytuacje w ktorych takie dzielniki maja sens, projektujemy design low-power itp rzeczy ale w normalnym projekcie to jest proszenie sie o klopoty.
  • Poziom 27  
    griva napisał:
    sorki ale sie nie zgodze

    no ja tez sie nie zgodze :)
    Cytat:
    Jesli kazdy producent fpga pisze zeby tak nie robic

    kazdy producent pisze, jak to robic poprawnie ... :)

    J.A
  • Poziom 17  
    J.A napisał:

    Cytat:
    Jesli kazdy producent fpga pisze zeby tak nie robic

    kazdy producent pisze, jak to robic poprawnie ... :)

    J.A


    jak gosc pisze w dokumentacji i to nie tyczy sie tylko FPGA - "strongly not recommended" to dla mnie tzn. "Panowie spieprz***smy, jak nie chcecie miec problemow zrobcie to inaczej" ;-)
  • Poziom 10  
    Cytat:
    uzywanie wyjsc
    przerzutnikow jako sygnalow clock uwazam za normalna technike w fpga;


    Jak pamiętam z uczelni, tak właśnie Nas uczyli...no, ale rzeczywiście każdy tekst, który udało mi się przeczytać przestrzegał przed takowym postępowaniem.

    Cytat:
    moze pomocne bedzie podzielenie
    projektu na 2 czesci;


    Tak dokładnie też o tym myślałem z tymże w tej kwestii będę potrzebował pomocy, bo nie znam Signal Tap'a...Zgadza się, dane wchodzą na moduł konwersji szeregowo - równoległej i takie 16-bitowe dane są podawane do bufora skąd mają wychodzić już na filtry.

    W jaki sposób mogę sprawdzić poprawność działania tej części w Signal Tap?

    Serdecznie pozdrawiam,

    Marcin
  • Pomocny post
    Poziom 27  
    fulinstrumentale napisał:
    /.../przestrzegał przed takowym postępowaniem/.../

    sa sytuacje, kiedy jest to calkiem bezpieczne, czasami trzeba troche uwazac,
    a czasem unikac - temat na dluzsza dyskusje, ktora moze zakonczmy teraz w tym watku,
    bo pewnie malo kogo to w tej chwili obchodzi :);

    Cytat:
    W jaki sposób mogę sprawdzić poprawność działania tej części w Signal Tap?

    SigTap jest tak samo prosty jak quartusowy symulator;
    - Tools->SignalTap Logic Analyzer
    - po prawej stronie pole 'Clock' wybierz sygnal, ktorym bedziesz
    zapisywal monitorowane dane, oczywiscie najlepiej wybrac najszybszy zegar
    w projekcie, ja czesto podwajam na pll najwieksza czestotliwosc i jej
    uzywam jako clock SigTap;
    - ponizej zmien 'sample depth' na wartosc 1-2K, RAM type co uwazasz,
    moze 'Auto' na poczatek najlepsze;
    - po lewej na gorze zostaw 'Incremental Compilation' bez 'ptaszka'
    - ponizej 'double click to add nodes' wywola znane Co zapewne okno
    z 'node finder'
    - w polu 'Filter' wybierz >SignalTap pre-synthesis<, w polu 'Named' mozesz
    wpisac nazwe sygnalu badz czesc z '*' - np. *adres* przefiltruje wszystkie
    nazwy, ktore gdzies maja string 'adres'; klik na 'List';
    - po lewej stronie bedziesz mial znalezione nazwy, te, ktore chcesz monitorowac
    musisz przeniesc na prawo, najprosciej 'double click' na nazwe;
    [nie umieszczaj tam przypadkiem zegara ktory taktuje SigTap]
    - po 'OK' masz 'ptaszki' w kolumnie 'Data Enable' - to znaczy ze te linie
    chcesz zapisywac, i w kolumnie 'Trigger Enable' - to znaczy, ze
    te linie chcesz podlaczyc do modulu triggera, o ile pierwsze zostaw
    jak jest, o tyle w kolumnie 'Trig.En' mozesz 'odhaczyc' to, co na
    pewno nie bedziesz uzywal do wyzwalania SigTap, zwykle uzywa sie do
    tego lini sterujacych, czasem adres, rzadko dane;
    usuniecie sygnalow z modulu trigger zmniejsza zuzycie logiki, dlatego
    warto sie nad tym zastanowic, ale jesli caly Twoj projekt zajmuje
    kilkanascie % fpga zostaw jak jest;
    - save, po zapisaniu quartus powinien zapytac, czy dolaczyc
    SignalTap file do projektu, oczywiscie tak;
    - mozesz to sprawdzic/zmienic w Settings->SignalTap Logic Analyzer
    - kompilujesz;
    - po skompilowaniu [jesli bez bledow] szukasz ikonki [prawa gorna czesc]
    'program device' o ile w polu [obok] z plikiem *.sof jest wlasciwy file;
    - po zaladowaniu do fpga prawy click w kolumnie 'trigger levels'
    i wybierasz warunki wyzwalania - Low, High, zbocze itd;
    jesli wybierzesz bus, mozesz podac wartosc w hex, bin, mozesz tez
    niektore bity ustawic w 'x' - don't care;
    - i na koniec trzeba znalezc guzik 'Run'

    no to do roboty ...

    J.A
  • Poziom 10  
    Witam ponownie z kolejną dawką pytań (jeśli będziecie mieli już dość to dajcie znać :))

    No więc przede wszystkim jeszcze raz dzięki za pomoc.

    J.A:

    Co do tego Signal Tap'a to rzeczywiście metodyka jest podobna jak w symulatorze, ale nie rozumiem kilku rzeczy...

    Cytat:
    po prawej stronie pole 'Clock' wybierz sygnal, ktorym bedziesz
    zapisywal monitorowane dane


    W takim razie to, że np. dane fizycznie będą przychodzić z fs = 44100 Hz, a w polu 'Clock' dam np. zegar RMCK (128 x fs), nie będzie miało wpływu na poprawność zapisywanych danych?

    Cytat:
    w kolumnie 'Data Enable' - to znaczy ze te linie
    chcesz zapisywac, i w kolumnie 'Trigger Enable' - to znaczy, ze
    te linie chcesz podlaczyc do modulu triggera


    O ile 'Data Enable' jest logiczne o tyle 'Trigger Enable' nie do końca rozumiem...Dajmy na to, że chciałbym monitorować całą, 16 bitową szynę danych wyjściowych z modułu tego konwertera szeregowo - równoległego. Mam wtedy dajmy na to DATA_OUT[0], DATA_OUT[1], ..., DATA_OUT[15] i jak się wtedy ma do tych pojedynczych bitów opcja 'Trigger Enable'. Czy to jest po prostu opcja dla jakiegoś sygnału, który rozpoczyna w ogóle działanie Signal Tap (np. jakiś guzik na płytce albo jakiś globalny 'enable' dla układu), a ja się doszukuje jakiś komplikacji?

    Kolejna sprawa z samymi zegarami i ich domenami w tym projekcie, bo trochę mi się już bałagan zrobił w głowie, a te wszystkie aspekty związane z zegarami nie są dla mnie takie hopsiup proste, bo nigdy się z takimi problemami nie spotkałem. Tak więc posłużę się obrazkiem:

    FIR Compiler Altera sygnały wejściowe

    W module konwertera dane są pobierane z zegarem OSCLK. Dane na wyjściu są dostępne z częstotliwością fs = 44100. Następnie, okazuje się, że bardzo lekkomyślnie, stwierdziłem, że stworze sobie bufor, który będzie te dane odbierał, ale zgodnie z RMCK/128 (czyli fs = 44100, bo RMCK = 128 x fs). Filtr 1 interpoluje sygnał x2 tak więc (zgodnie z manualem do filtrów od Altery) potrzebne są mi dwa zegary - RMCK/128 dla danych wchodzących do filtra i RMCK/64 dla danych wychodzących (po interpolacji). Kolejny moduł filtra (też interpoluje x2) to kolejne dwa zegary: dla danych wejściowych RMCK/64 i dla wychodzących RMCK/32. Ostatni moduł filtra interpoluje x32 czyli dla danych wchodzących mam zegar RMCK/32 a dla wychodzących RMCK.

    Teraz nie mówię o samym układzie i jego konstrukcji...Ale może w ogóle trzeba koncepcję zmienić...skoro na samym początku dane są pobierane zgodnie z zegarem OSCLK to tego zegara powinienem używać przy każdym kolejnym module...z tym, że także i ten zegar musiałbym dzielić a do ostatniego modułu filtra i pomnożyć x2 żeby uzyskać f = 128 x fs...

    Powiem Wam szczerze, że trochę się już pogubiłem w tym wszystkim...jedyne co dobrze zrozumiałem i wiem o co chodzi to sprawa z 'resetem', który powinien być synchronicznie zwalniany.

    Dziękuję za wszystko i proszę o cierpliwość :)

    Serdeczne pozdrowienia,

    Marcin
  • Poziom 27  
    fulinstrumentale napisał:
    dane fizycznie będą przychodzić z fs = 44100 Hz, a w polu 'Clock'
    dam np. zegar RMCK (128 x fs), nie będzie miało wpływu na poprawność zapisywanych danych?

    na poprawnosc nie, na uzytecznosc moze;
    jesli dobrze rozumiejm, RMCK jest 128 razy szybszy niz predkosc naplywu danych;
    taka konfiguracja ma oczywiscie maly sens bo zapelnisz
    cala pamiec analizatora bezuzytecznymi danymi, czestotliwosc zegara SignalTap
    powinna byc dostosowana do czestotliwosci danych ktore chcesz zobaczyc;
    jesli chcesz monitorowac linie o duzej roznicy czestotliwosci, mozesz stworzyc
    2 pliki/moduly SignalTap i dolaczyc do projektu oba, dzieki temu mozesz
    przelaczac sie z jednego analizatora na drugi bez koniecznosci ponownej kompilacji;
    Cytat:
    /.../'Trigger Enable' nie do końca rozumiem/.../

    ja tez nie bardzo rozumiem...
    SignalTap dziala jak przecietny analizator logiczny - wpisuje do pamieci stan
    linii wybranych do monitorowania i po zapisaniu calej pamieci zaczyna od nowa
    nadpisujac to, co zostalo wczesniej zapisane;
    zeby uchwycic interesujace zdarzenie, trzeba zdefiniowac 'trigger', ktory troche
    wbrew nazwie nie startuje dzialanie analizatora, ale zatrzymuje nadpisywanie
    pamieci po wystapieniu zdefiniowanego 'trigger-a';
    jesli wiec chcesz zobaczyc, co sie dzialo w systemie gdy pojawila sie na liniach
    danych wartosc 'X', trzeba kliknac prawym w kolumnie 'trigg' i wpisac te wartosc;

    SignalTap jako taki uruchamia sie ikonka 'run' - po nacisnieciu zaczyna wypelniac pamiec
    az wystapi uklad danych zdefiniowany jako trig. wtedy przestanie zapisywac i wyswietli
    przebiegi na ekranie;
    jeszcze jedna uwaga - w czasie pracy mozna zmieniac, bez koniecznosci rekompilacji,
    polozenie triggera, na poczatku bufora - wtedy zobaczysz glownie to, co sie
    stalo po interesujacym cie zdarzeniu, w srodku i pod koniec;

    o zegarach moze jutro, bo zbieram sie juz do domu ... :);

    J.A
  • Poziom 10  
    Witajcie.

    J.A:

    Czyli rozumiem, że z tym zegarem w Signal Tap jest tak, że skoro fizycznie moje dane napływają z częstotliwością 44100 Hz to i zegar Signal Tap'a powinien także być taktowany taką częstotliwością? Trochę mnie to zmyliło, bo wcześniej pisałeś, że Ty używasz PLL żeby podwoić zegar, który używasz w projekcie i nie do końca wiedziałem po co.

    A z tym trigger'em już łapie co nieco, dziękuję za wyjaśnienie :)

    Co do tego o czym pisał Griva

    Cytat:
    Jesli nie wiesz jak wygladaja wzajemne relacje zegarow to traktuj je jako asynchroniczne wzgledem siebie. Takze q6 przepusc przez detektor zbocza i zpipelinuj 3x z zegarem osclk. Oczywiscie buff ma operowac na osclk


    to chodziło Ci o blok synchronizera + detektor zbocza? coś na rodzaj tego?

    FIR Compiler Altera sygnały wejściowe

    I mam kolejne pytanie: czy w tym projekcie ja przekraczam domeny zegarów tylko sygnałami z wyjścia dzielnika częstotliwości czy także i danymi? Przyjrzałem się też solucji Quartus'a do ostrzeżenia: "Data Bits are Not Synchronized When Transferred Between Asynchronous Clock Domains (Design Assistant Rule)", aby użyć handshaking protocole"

    Taką sytuację:

    FIR Compiler Altera sygnały wejściowe

    zastąpić taką:

    FIR Compiler Altera sygnały wejściowe

    Dziękuję ślicznie za wszelką dotychczasową pomoc.

    Serdeczne pozdrowienia,
    Marcin
  • Poziom 27  
    fulinstrumentale napisał:
    /.../Ty używasz PLL żeby podwoić zegar, który używasz
    w projekcie i nie do końca wiedziałem po co

    czasem uzywam podwojonej czestotliwosci, pll prawie zawsze;
    otoz jesli taktujesz SigTap zegarem, z ktorym pracuje logika
    i cos nie gra - SigTap pokazuje inne dane niz sie spodziewasz, trudno
    jest rozpoznac, czy problem jest w logice, czy w timingu, podwojona
    czestotliwosc monitorowania danych przez SigTap - czesto - pozwala to
    rozstrzygnac;
    poza tym, jesli widzisz 'zle' dane w analizatorze logicznym, musisz
    wziac pod uwage, ze jednak SigTap moze miec inny timing dane-clock niz
    logika, mala szansa, ale jest;
    teraz pll - dzieki 'resource editor' w quartusie zegar mozna przesunac
    o kilka ns w przod czy w tyl bez koniecznosci rekompilacji, co pozwala
    stwierdzic, czy bledne dane to zle zakodowana funkcja, blad timingu logiki,
    czy byc moze sam SigTap ma problem z timingiem;

    Cytat:
    to chodziło Ci o blok synchronizera + detektor zbocza?
    coś na rodzaj tego?

    nie wyrokuje, co griva mial na mysli, ale rysunek ktory
    zamiesciles ponizej to dla mnie jakies dziwactwo;
    3 stopniowy synchronizator, bo o to chyba chodzi, powinien
    wygladac jakos tak:
    dana 'D' test zapisywana ptrzez FF1 zegarem clk1, wyjscie 'Q'
    z tego FF wchodzi na lancuszek 2-3 FF taktowanych drugim zegarem
    clk2; to co narysowales wyglada jak synchronizacja zegarow ?
    dla mnie dziwne;

    teraz Twoj 'niebieski' rysunek z poprzedniego posta:
    jezeli masz na wstepie modul konwersji szer.rown., to na jego wyjsciu
    bedziesz mial dane 16 bitowe wychodzace z czestotliwoscia 16 razy
    mniejsza niz czestotliwosc danych szeregowych, nie bardzo wiem,
    jak mozesz je dosynchronizowac do innej czestotliwosci bez fifo
    i jakiegos handshaking'u;
    jestes pewien, ze te filtry altery maja jeden zegar taktujacy dane
    wejsciowe i drugi, dwukrotnie szybszy, dla danych wyjsciowych ?
    nie znam sie na filtrach, ale to by znaczylo ze modul FIR produkuje
    dane 'z powietrza';
    [bo wypuszcza wiecej bajtow niz dostal do przetworzenia];
    w kazdym razie - masz racje z tymi zegarami FIR czy nie,
    jesli okreslisz czestotliwosc na wejsciu, tym samym definiujesz
    szybkosc wyplywu danych na wyjsciu i odwrotnie, jesli zalozysz
    konkretny 'data rate' na wyjsciu, musisz z okreslona szybkoscia
    dostarczac dane wejsciowe, nie mozesz tych 2 wielkosci przyjac
    dowolnie;
    chyba ze ... wlaczysz w ten lancuszek fifo, ktore bedzie w stanie
    zatrzymac na chwile zrodlo danych, jesli dane wplywaja szybciej
    niz sa odbierane, albo odbiornik danych moze byc na jakisz czas
    przetwarzania bajtow postawiony w stan 'hold' jesli odbior jest
    szybszy niz naplyw;

    i jeszcze zegary - jesli dzielisz jakas zewnetrzna czestotliowsc
    licznikiem na kilka pod-czestotliwosci, to ciagle masz do czynienia
    z zegarami synchronicznymi i to o dobrze zdefiniowanych zaleznosciach
    fazowych, w takim przypadku rozne extra uklady do przechodzenia
    z jednej domeny clock do drugiej nie sa konieczne, bo stosunkowo
    latwo jest zapewnic transfer danych miedzy [powiedzmy] q6 i q5;
    sztuczki z 'clock domain crossing' sa potrzebne, jesli masz
    do czynienia z zegarami asynchronicznymi;

    czym robisz takie ladne rysunki ?
    brakuje mi na domowym pc czegos, czym moglbym zilustrowac
    to co opisuje slowami, w koncu dobry rysunek to jak
    tysiac slow :);

    J.A
  • Poziom 10  
    Witajcie.

    J.A:

    Ok co do tych zegarów to już mniej więcej wiem co i jak.

    Co do tego mojego "szarego" rysuneczku to przepraszam za błąd...masz rację, że to jakieś dziwactwo wyjdzie z tego :) Miałem w głowie to żeby nie używać Q[6] (RMCK/128 = 44100Hz) jako zegara taktującego bufor za odbiornikiem szeregowo-równoległym tylko jak już wcześniej pisaliście ten bufor taktować zegarem OSCLK, ale z sygnałem 'enable' pojawiającym się co 44100 Hz. Z tym, ten sygnał 'enable' będzie generowany z tego zegara RMCK, który jest szybszy niż OSCLK więc ten 'enable' będę musiał przepuścić przez coś takiego...(chyba :))

    FIR Compiler Altera sygnały wejściowe

    Cytat:
    to na jego wyjsciu
    bedziesz mial dane 16 bitowe wychodzace z czestotliwoscia 16 razy
    mniejsza niz czestotliwosc danych szeregowych, nie bardzo wiem,
    jak mozesz je dosynchronizowac do innej czestotliwosci bez fifo
    i jakiegos handshaking'u;


    Z tego modułu konwersji szer-rown wychodzą rzeczywiście dane 16bitowe, ale częstotliwość tych danych szeregowych to 2822400Hz (64x44100) - taki jest układ ramki w formacie I2S - 64 bity, po 32 bity na każdy kanał, a ja biorę tylko 16 bitów z jednego kanału w każdej ramce. Co do tego handshaking'u to właśnie sam już nie wiem szczerze mówiąc...

    Co do tych filtrów Altery...

    FIR Compiler

    Na stronie 4-20 są sygnały we/wy z modułu tego filtra. A na stronie 4-21 zaczynają się 'Timing Diagrams' czyli to co powinno mnie bardzo interesować :) w każdym diagramy czasowe przy filtrach interpolacyjnych są podane na stronie 4-25 rysunek 4.20 - i jak nic są to dwa zegary chyba, że coś przeoczyłem...

    A rysunki (może się zdziwisz), ale robię w Paint w Windows'ie :) Najważniejsze to dobrze ustawić kolor tła i kolor właściwego rysowania a także czy jakiś bloczek ma się z tym tłem zlewać czy nie.

    Dzięki wielkie za pomoc.

    Serdeczne pozdrowienia,

    Marcin

    Dodano po 2 [godziny]:

    Mam już ten modulik synchronizacji sygnału 'enable', o którym pisałem poprzednio.

    Przy takiej konfiguracji Quartus (a konkretnie jego Design Assistant) przestał wywalać mi ostrzeżenie: "Data Bits are Not Synchronized When Transferred Between Asynchronous Clock Domains (Design Assistant Rule)".

    Ale nadal nie do końca wiem czy takie kodowanie jest zgodne z kanonami...

    W każdym razie tutaj jest poprzednia wersja projektu: IN MODULE
    a tutaj jest ta wersja z użyciem 'clock_enable' i tym synchronizatorem: IN MODULE ver 1

    Serdecznie pozdrawiam,

    Marcin
  • Poziom 27  
    mam robote, nie mam czasu na dluzsze pisanie, moze w weekend;
    1. jest jakas zaleznosc miedzy RMCLK i OSCLK ?
    czy one sa asynchroniczne - z dwoch niezaleznych zrodel,
    czy jedno zrodlo ?
    kolejny rysunek 'synchronizacji' dla mnie tez wyglada dziwnie;

    2.
    Cytat:
    /.../A na stronie 4-21 zaczynają się 'Timing Diagrams'
    /.../jak nic są to dwa zegary chyba, że coś przeoczyłem

    ja nie widze 2 zegarow, przeczytaj uwaznie opisy tych wykresow;

    J.A

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

    no i co z ta zaleznoscia miedzy RMCLK i OSCLK ?
    to istotna informacja dla by znalezc poprawne rozwiazanie
    Twojego problemu;
    nie mozesz uzyc zegara z ktorym przychodza dane seryjne do
    taktowania calosci systemu ?

    ten watek sprawil, ze troche mnie kusi, by napisac dluzszy post
    o 'filozofii' uzywania zegarow i sygnalow sterujacych jak clk_en,
    reset w fpga, ale konieczniosc rysowanie w paint - bez wykresow nie da
    sie przedstawic tego tematu w jasny sposob - zniecheca mnie wyjatkowo
    skutecznie;
    J.A
  • Poziom 10  
    J.A napisał:
    ten watek sprawil, ze troche mnie kusi, by napisac dluzszy post o 'filozofii' uzywania zegarow i sygnalow sterujacych jak

    Kiedy można się spodziewać? :)
    adam.
  • Poziom 17  
    fulinstrumentale napisał:
    Witajcie.

    to chodziło Ci o blok synchronizera + detektor zbocza? coś na rodzaj tego?


    Taką sytuację:

    FIR Compiler Altera sygnały wejściowe

    zastąpić taką:

    FIR Compiler Altera sygnały wejściowe

    Dziękuję ślicznie za wszelką dotychczasową pomoc.

    Serdeczne pozdrowienia,
    Marcin


    rysuneczki sa jak najbardziej poprawne - o to chodzi. Jak masz wieksza ilosc danych to przejscie zrob przez fifo.
  • Poziom 10  
    Witajcie.

    Przepraszam, że tak długo nie pisałem, ale dopiero co wróciłem z urlopu :)

    J.A:

    Właśnie jeszcze raz przestudiowałem notkę katalogową tego układu CS8416 i cytuję: "In master mode, lef/right clock (OLRCK) and serial bit clock (OSCLK) are outputs, derived from the recovered RMCK clock"

    Ten moduł jest u mnie jako master więc RMCK i OSCLK są chyba synchroniczne ze sobą...

    Cytat:
    nie mozesz uzyc zegara z ktorym przychodza dane seryjne do
    taktowania calosci systemu ?


    Dane seryjne przychodzą z częstotliwością 64xFs (OSCLK) a mi są potrzebne trzy stopnie filtracyjne działające na 2xFs, 4xFs i 128xFs. Zegar RMCK jest ustawiony na 128xFs więc stwierdziłem, że najłatwiej z niego będzie mi wyciągać wszystkie potrzebne mi częstotliwości (ostateczna częstotliwość danych to właśnie interpolacja 128xFs).

    Cytat:
    ale konieczniosc rysowanie w paint - bez wykresow nie da
    sie przedstawic tego tematu w jasny sposob - zniecheca mnie wyjatkowo
    skutecznie;


    No jest to dość męczące przyznaje, ale jest coś takiego jak Microsoft Office Visio czy jakoś tak gdzie bardzo fajnie robi się właśnie schemaciki, a jak nie to zawsze pozostaje word, albo zeskanowana kartka papieru, na której wszystko rysuje się ręcznie :)

    Griva:

    Cytat:
    Jak masz wieksza ilosc danych to przejscie zrob przez fifo.


    Czyli jednym słowem muszę użyć handshaking'u i synchronizatorów? I o co chodziło Ci jak pisałeś o większej ilości danych? W sensie danych nie jednobitowych, a np. 16-bitowych czy samej ilości danych 16-bitowych?

    Serdecznie pozdrawiam i dziękuję ponownie za pomoc.

    Marcin
  • Poziom 10  
    Witam ponownie.

    Wreszcie dorwałem się do sprzętu i udało mi się uruchomić Signal Tap.

    Poniżej przedstawiam wyniki i działanie takiego projektu:

    FIR Compiler Altera sygnały wejściowe

    Najpierw spradziłem w jakich relacjach do siebie są zegary RMCK, OSCLK i OLRCK:

    FIR Compiler Altera sygnały wejściowe
    FIR Compiler Altera sygnały wejściowe

    Później sprawdziłem jak wyglądają sygnały 44100_enable i 44100_en_sync:

    FIR Compiler Altera sygnały wejściowe

    Potem sprawdziłem jak wyglądają dane po przejściu przez pierwszy moduł odbioru danych szeregowych i konwertowania ich do postaci równoległej (podłączyłem sygnał sinusa do wejścia i pobieram dane tylko z jednego kanału):

    FIR Compiler Altera sygnały wejściowe

    Następnie zacząłem monitorować sygnał data_out[15..0], który działa już zgodnie z zegarem 44100, ale wydzielonym z sygnału RMCK:

    FIR Compiler Altera sygnały wejściowe

    FIR Compiler Altera sygnały wejściowe

    FIR Compiler Altera sygnały wejściowe

    FIR Compiler Altera sygnały wejściowe

    FIR Compiler Altera sygnały wejściowe

    Nie wiem jak bardzo można wierzyć tym przebiegom, ale wygląda na to, że moduł wejściowy działa prawidłowo...chyba?

    Serdecznie pozdrawiam,

    Marcin