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

Wszystko o układach programowalnych... podstawowe informacje

marenc 13 Cze 2008 09:58 14364 95
  • #91 13 Cze 2008 09:58
    marenc
    Poziom 24  

    1. Czekają na zbocze linii wejściowej(R) i stan '1' ustawiam wyjście RESET <= '0';(ustawione przy uruchamianiu na '1');
    2. Czekają na zbocze linii wejściowej E i stan '1' wykonuję trochę instrukcji(działa dobrze, więc nie opisuję szczegółowo) - jest tam zapisywanie danych do zmiennych w zależności od sygnałów wejściowych ... np. odbieranie bajtu i zapisywanie go do wektora stanów 7 downto 0.
    3. Tu zapisze symbolicznie...
    if RESET = '0' and ((CLK0'event and ZMIENNA(0) = '1') or (CLK1'event and ZMIENNA(1) = '1') or (CLK2'event and ZMIENNA(2) = '1')) then wykunuje trochę instrukcji, ... np przy określonym zdarzeniu wewnętrznym potrzebuje dać na RESET stan '1'.

    Tak ma działać program ... i ciężko mi to osiągnąć :(

  • Technik Elektryk - Faber CK
  • #92 13 Cze 2008 11:46
    J.A
    Poziom 27  

    mariuszlorenc napisał:
    Czekam na zbocze linii wejściowej(R) i stan '1'ustawiam wyjście RESET <= '0'

    czemu na 'zbocze i stan', nie mozesz po prostu rozpoznawac stanu '1' ?;
    to samo dla E;
    Cytat:
    if RESET = '0' and (CLK0'event and ZMIENNA(0) = '1')/.../

    zmienna(0) jest przesylana synchronicznie z CLK0, zmienna(1) z CLK1 itd ?
    wydaje mi sie, ze CLK0, CLK1 itd. to nie zegary, czyli ciagly sygnal
    prostokatny, ale cos w rodzaju 'data strobe' albo 'dane wazne';

    mialem na mysli opis tego co chcesz zrobic jeszcze troche
    wyzszego poziomu, ale sporobuje popatrzec w krysztalowa kule,
    moze cos z tego bedzie;


    wybierz zegar systemowy, np. system_clk;

    zrob sobie FSM o stanach:
    IDLE
    wait_for_E012,
    execute_E, execute_0, execute_1, execute_2,
    done;


    zrob odpowiednia ilosc przerzutnikow na przechowywanie
    zmienna(0),(1) itd;

    np.
    process (...)
    if rising_edge(system_clk) then
    if CLK0 then ZM0 <= ZMIENNA0;
    itd dla zmienna1 i 2;


    zrob process z jednym jedynym zegarem system_clock,
    w ktorym opiszesz zachowanie FSM, powinno byc jakos
    tak:
    IDLE : if ( R ) then begin RESET <= '0'; FSM <= wait_for_E012; end
    wait_for_E012 : if ( E ) then FSM <= execute_E;
    else if ( ZM0 ) then FSM <= execute_0;
    else if ( ZM1 ) then FSM <= execute_1;
    else if ... ;

    execute_E : if ( <zrobione_E> ) FSM <= done;
    execute_0 : if ( <zrobione_0> ) FSM <= done;
    ...
    done : <tu przywracamy wartosci 'startowe' wszystkim zmiennym,
    np. RESET <= '1';
    FSM <= IDLE

    J.A

    Dodano po 29 [minuty]:

    ===========
    wlasnie wrocilem z palarni i dotarlo do mnie z czym masz
    problem - ty kompletnie nie masz pojecia o wewnetrznej
    strukturze fpga i dlatego nie wiesz, jak dana konstrukcja
    w vhdl przeklada sie na logike;
    musisz spedzic pare dni na zorientowaniu sie, jak fpga
    wyglada w srodku, a potem kilka tygodni na pisaniu bardzo
    prostych kawalkow typu przerzutnik, licznik itd.
    sprawdzajac za kazdym razem po kompilacji schemat tego,
    co wygenerowal kompilator;
    inaczej nie pozbedziesz sie swoich - fatalnych w tym przypadku -
    nawykow z programowania uC;

    J.A

  • Technik Elektryk - Faber CK
  • #93 13 Cze 2008 14:52
    marenc
    Poziom 24  

    1. Na zbocze, ponieważ chcę zareagować impulsowo na zdarzenie(zbocze narastające). Gdybym reagował na stan, to praca z zegarami przy R = '1' była by niemożliwa.

    2. Linia E to potwierdzenie danych, a wszystkie CLK to zegary różniące się od siebie częstotliwością - jest to wymagane przez mój projekt. Nie mogę przyjąć jednego zegara jako głównego, ponieważ pracuje z prawie maksymalną częstotliwością i w dodatku na dwóch zboczach. Pracuję na CPLD, które posiadają FF reagujące na obydwa zbocza.

    3. Podstawowe programy już pisałem i rozpatrywałem ich synteze do układów logicznych ... nawet projektowałem proste układy na schematach.

    Czasem tylko zapominam się, że definiuje prace sprzętu, a nie pracę jak ma być wykonywana praca. Spróbuję wszystko pogrupować i zobaczę co z tego wyjdzie...

    //Witam, troszkę to podzieliłem(napisałem od nowa małą część). Zauważyłem, że wcześniej pakowałem wszystko do jednego procesu. Teraz piszę wiele procesów połączonych ze sobą globalnymi(wewnętrznymi) sygnałami. Komunikat o błędnej synchronizacji się już nie pojawia, więc wiem na czym polegał problem ... robienie wszystkiego na jednym zboczu jest niemożliwe, ale wykonywanie kilku osobnych czynności na tym samym zboczu i kontrola rezultatu na elementach logicznych pozwala rozwiązać ten problem. Nie wiem czy dobrze robię pisząc program w ten sposób, ale zawsze to lepsze wyjście niż rysowanie schematu o który zaczynałem sobie powoli przypominać ;)

    Dla pewności chciałbym spytać, czy wszystko umieszczone w "architecture" bez procesu jest logiką niesynchroniczną, a procesy służą do synchronizacji pewnych zdarzeń?

  • #94 16 Cze 2008 14:38
    pndemon
    Poziom 19  

    wszystkie instrukcje w obrębie architektury są współbieżne, tzn. są wykonywane równocześnie. proces synchroniczny od asynchronicznego, odróżnia to że na liście czułości znajduje się tylko zegar. oczywiście jeśli napiszesz proces synchroniczny w niewłaściwy sposób, to syntezer się nie połapie i tak i siak wstawi ci na listę czułości sygnały stojące z prawej strony przypisania, bądź jako składniki w warunkach 'if'.

  • #95 18 Cze 2008 17:08
    griva
    Poziom 17  

    mariuszlorenc napisał:
    1. Na zbocze, ponieważ chcę zareagować impulsowo na zdarzenie(zbocze narastające). Gdybym reagował na stan, to praca z zegarami przy R = '1' była by niemożliwa.

    proponuje poszukac czegos na temat "detektor zbocza" a potem sie wypowiadac co jest mozliwe a co nie

    mariuszlorenc napisał:

    2. Linia E to potwierdzenie danych, a wszystkie CLK to zegary różniące się od siebie częstotliwością - jest to wymagane przez mój projekt. Nie mogę przyjąć jednego zegara jako głównego, ponieważ pracuje z prawie maksymalną częstotliwością i w dodatku na dwóch zboczach.

    temat drugi to "synchronizator", z takimi rzeczami to w latach 60tych sobie juz radzili

    mariuszlorenc napisał:

    Pracuję na CPLD, które posiadają FF reagujące na obydwa zbocza.


    poczytaj dobrze te noty aplikacyjne nt CPLD bo troche sie dales poniesc haslom marketingu

    mariuszlorenc napisał:

    robienie wszystkiego na jednym zboczu jest niemożliwe, ale wykonywanie kilku osobnych czynności na tym samym zboczu i kontrola rezultatu na elementach logicznych pozwala rozwiązać ten problem.


    dluuuuga droga przed Toba ...

  • #96 15 Sie 2008 12:56
    marenc
    Poziom 24  

    Witam, dawno mnie tu nie było :D Jako początkujący w dziedzinie układów programowalnych radzę sobie już całkiem nieźle ;) Załapałem już o co chodzi i w jaki sposób powinno się pisać kod ... jednak teraz mogę stwierdzić, że pisanie kodu nie jest przyjazne dla projektantów. Wymaga złożonego łączenia modułów programu za pomocą manualnie projektowanych sygnałów - obala to teorię o języku programowania wysokiego poziomu :P

    Utworzyłem już kilka programów i pora na ich sprzętowe realizacje. Mam oczywiście kilka pytań. Usuwając ostrzeżenia podczas syntezy nie mogę sobie poradzić z jednym, a angielskie wytłumaczenie jakoś do mnie nie trafia :/ Poniżej ostrzeżenie:

    Cytat:
    WARNING:Xst:2183 - Unit Main: the following tristate(s) are NOT replaced by logic (Please refer to Answer Record 20048 for more information): CLK, EXIT_CLK_MLTSRCEDGE.


    Chciałbym także, aby ktoś wytłumaczył jak rozumieć wartości z wklejonego kawałka poniżej. Wiem, że dotyczą one reakcji układu na sygnały, ale do końca nie rozumiem jak je rozważać podczas projektowania.
    Cytat:
    Min. Clock Period 7.800 ns.
    Max. Clock Frequency (fSYSTEM) 128.205 MHz.
    Limited by Cycle Time for C_CLKR_MC.Q
    Clock to Setup (tCYC) 7.800 ns.
    Pad to Pad Delay (tPD) 7.900 ns.
    Setup to Clock at the Pad (tSU) 3.000 ns.
    Clock Pad to Output Pad Delay (tCO) 13.600 ns.


    Chciałbym także spytać czy można programowo określić czas propagacji. Chcę obsłużyć zewnętrzny(bo to CPLD Xilinx'a) RAM i prędzej pojawia mi się sygnał zapisu, niż właściwy adres do zapisu.

    Chcę jeszcze sprostować, że układy Xilinx'a CoolRunner2 posiadają przerzutniki D i T z dwu-zboczowym zegarem.

    Przy okazji chciałbym spytać czy projekt dla CPLD i FPGA będzie wyglądał identycznie? A może trzeba będzie uruchomić jakiś dodatkowy program i coś zrobić? Czy projektowanie wygląda w identyczny sposób? Używanie wewnętrznych układów FPGA jest opisane w "Language Templates"?