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

Łączenie schematów w Webpack ISE

04 Lis 2010 17:29 8872 92
  • Poziom 19  
    Witam kolegów.
    Jestem początkującym w tym temacie i utknąłem w jednym miejscu.
    Otóż stworzyłem projekt z dwóch schematów i chcę połączyć wyjścia jednego z wejściami drugiego, jak to wykonać?
    W pierwszym schemacie przykładowo mam licznik 16 bitowy z wyjściem typu BUS a na drugim schemacie multiplexer z 16 wejściami, do którego te wyjścia mają być podłączone.
    Następnie jak to scalić w projekcie w całość, żeby PACE widział wszystkie WE/WY z dwóch schematów?

    Załączam zdjęcia schematów:
    Łączenie schematów w Webpack ISE Łączenie schematów w Webpack ISE
    Zdjęcia zamieszczamy w taki sposób: KLIK.
    Dzięki.
    Bogdan
  • PCBwayPCBway
  • Pomocny post
    Poziom 30  
    Jak rozumiem masz dwa oddzielne schematy? Jeden schemat musi być jako Top Module, inne się pod niego podłączają. Jak to zrobić, bierzesz jeden z schematów i robisz go jako bloczek z wejściami i z wyjściami (takie jak bramki czy przerzutniki). W opcjach Tools wybierasz Symbol Wizard i tworzysz bloczek schematu. Teraz wracasz do pierwszego-głównego schematu i stawiasz tam Twój bloczek, który zawiera w sobie Swoją strukturę. Będzie widziany jako prostokącik z IO. Teraz go podłączasz jak np. zwykłą bramkę AND czy coś takiego (;
  • PCBwayPCBway
  • Poziom 19  
    Wielkie dzięki, zadziałało :)
    to doradź mi jeszcze (jak możesz) jak zrobić magistralę ,taką jak na pierwszym zdjęciu, chciałbym zrobić żeby te 16 wejść z multipleksera zrobić jako jeden przewód jak w liczniku na zdjeciu nr 1. , bo mam 12 multiplekserów i ilość przewodów do rysowania byłaby kosmiczna...
  • Poziom 30  
    mototest napisał:
    ...jak zrobić magistralę ,taką jak na pierwszym zdjęciu, chciałbym zrobić żeby te 16 wejść z multipleksera zrobić jako jeden przewód jak w liczniku na zdjeciu nr 1. , bo mam 12 multiplekserów i ilość przewodów do rysowania byłaby kosmiczna...


    Wystarczy, że zrobisz magistralę w schemacie i po zrobieniu bloczka (Symbol Wizard), sam zadba o zrobieniu "jednego druta"(;
  • Poziom 19  
    no właśnie nie wiem jak zrobic ta magistralę, widzę tylko "add bus tap" i nie wiem co z tym się robi i jak...
  • Poziom 30  
    mototest napisał:
    no właśnie nie wiem jak zrobic ta magistralę, widzę tylko "add bus tap" i nie wiem co z tym się robi i jak...


    1. Rysujesz linię (button: czerwony szlaczek z pisaczkiem).
    2. PPM na linię (Prawy Przycisk Myszy).
    3. Wybierasz Rename Selected Net...
    4. Wpisujesz np. coś takiego:
    Code:
    DIN(15:0)

    5. Masz już magistralę 16-bitową.
    6. Add I/O Marker z lewej strony jeśli to ma być wejście (button: etykiety)
    7. Add Bus Tap podłączasz wybrane wejście/linię z magistralą
    8. Nazywasz linię połączoną z magistralą tak samo jak magistralę, ale wybierasz przypisaną linię, Rename Selected Net... i później np. DIN(0).
  • Poziom 19  
    coś program się pluje że źle wpisałem nazwy wejść (jak chcę wygenerować symbol).
    Wpisuję kolejno DIN(15:0) , DIN(15:1) , DIN(15:2) ....DIN(15:15)
    dla jednego multipleksera, co jest źle w tych nazwach wejść ??

    Dodano po 5 [minuty]:

    teraz myślę,że coś spieprzyłem, bo w multiplexerze zrobiłem osobne wejścia i je przemianowałem na magistrale (każde z osobna), a miałem narysować drut i jego przemianować na magistralę... zaraz sprawdzę

    Dodano po 15 [minuty]:

    no teraz zadziałało pięknie, to narazie wszystko , jeszcze raz dzięki, jak coś jeszcze wyskoczy to sie odezwę, bo nie doszedłem jeszcze do PACE

    Dodano po 28 [minuty]:

    no i pojawił się problem z magistralą
    wyskakuje pełno błędów jak poniżej :

    ERROR:DesignEntry:239 - Incorrect bus tap at (1024 352, 1024 448); destination
    branch "XLXN_171" is not part of the source branch "mux1(15:0)".

    jest ich tyle ile drutów do magistrali , czyli zmieniają się tylko numery XLXN, co spaprałem ??

    Dodano po 5 [minuty]:

    może zobacz na rysunek, czy dobrze zrobiłem tą magistralę
  • Poziom 19  
    normalnie jakbyś mieszkał bliżej to bym ci kilka piw postawił... :)

    Dodano po 1 [godziny] 6 [minuty]:

    no , jak już wszystko zrobiłem to na koniec wywaliło błędy w FIT
    jakby CPLD był za mały albo co ? co to jest ?

    ERROR:Cpld:837 - Insufficient number of macrocells. The design needs at least
    204 but only 144 left after allocating other resources.
    ERROR:Cpld:868 - Cannot fit the design into any of the specified devices with
    the selected implementation options.
  • Poziom 19  
    załączam schematy , jak dałem największy z tych scalaków to wszystko przeszło, czyżby taki żarłoczny był ten schemat ? może jest jakiś prostszy sposób na to, może zaszalałem ?:)

    raport zrobiłem dla większego scalaka, na ktorym nie przechodzi FIT

    Łączenie schematów w Webpack ISE
    Zdjęcia zamieszczamy w taki sposób: KLIK.
  • Poziom 30  
    Za mało zoptymalizowany projekt, zmień koncepcje. Pamiętaj, że do tego samego celu dąży wiele dróg (; Poczytaj o tym: CPLD Fitting, Tips and Tricks.
    Np. licznik 16-bitowy zajmuje minimum 4 rejestry (każdy bajer typu reset, enable +1 makrocelli), u Ciebie jest tych liczników aż 12, co daje już na dobry początek 48- lub więcej (zależy jaki licznik) makrocelli. W dodatku 12 multiplekserów, same też wyjścia mają po jednym makrocellu. Więc projekcik zbyt przekombinowany jak dla mnie.
  • Poziom 19  
    z tymi multiplexerami na wyjściu to trochę przesadziłem, bo liczniki i tak muszą być, chodzi mi o to żeby stan liczników przekazać do świata zewnętrznego wykorzystując 16 wyjść (16 bit) , myślę że może prostszym sposobem będzie szeregowo wysyłać informacje, jakiś rejestr przesuwny do każdego licznika, ale nie wiem czy to pomoże żeby zmieścić się w mniejszej matrycy, może zasugerujesz teoretycznie jakiś optymalniejszy sposób na wysłanie stanu liczników na porty ?

    Dodano po 2 [godziny] 40 [minuty]:

    przekonstruowałem to całkowicie
    1. zmieniłem na 8 bitowe liczniki (będę je częściej odczytywał)
    2. na wyjściach zastosowałem Latche 8 bitowe zamiast multiplekserów

    mam teraz problem ,bo muszę połączyć wszystkie wyjścia "laczy" czyli wszystkie Q1, potem wszystkie Q2 itd ,aby otrzymać 8 bitową magistralę na wyjściu, no i jak to połączę, to program pluje się że za dużo połączonych wyjść, czy jest na to jakiś sposób żeby inaczej połączyć wyjścia tych laczy ? próbowałem dawać bufory zamiast laczy i to samo.
  • Poziom 30  
    mototest napisał:
    mam teraz problem ,bo muszę połączyć wszystkie wyjścia "laczy" czyli wszystkie Q1, potem wszystkie Q2 itd ,aby otrzymać 8 bitową magistralę na wyjściu, no i jak to połączę, to program pluje się że za dużo połączonych wyjść, czy jest na to jakiś sposób żeby inaczej połączyć wyjścia tych laczy ? próbowałem dawać bufory zamiast laczy i to samo.

    Próbowałeś bufor 3 stanowy: OBUFT lub BUFT
    Akurat multipleksery są bezpieczniejsze, bo jak po jedną magistralą będzie aktywnych kilka urządzeń to dojdzie albo do zwarcia, albo co gorsza do przepływu bardzo dużego prądu co doprowadzi do uszkodzenia CPLD. Więc upewnij się, że bufor przepuszcza jedną dana w czasie obsługi magistrali, reszta w trybie Z (wysoko impedancja, magistrala nie będzie ich fizycznie widziała). To cacko znajdziesz w IO lub Buffer. Tu masz podgląd jak to mniej więcej wygląda: Link.
    A i na fizyczne wejścia i wyjścia układu, stosuj odpowiedni też IBUF i OBUF. Na zewnętrzny zegar IBUFG.
  • Poziom 19  
    próbowałem zwykłe bufory, OBUF nie, sprawdzę później bo już to skasowałem, powiedz mi jeszcze taką rzecz jak zmiksować do tego wszystkiego plik z VHDL ,żeby był fragmentem całości, np. chciałby zaimplementować rejestr przesuwny PISO bez schematu (bo ze schematu coś mi nie działa) i chciałbym poznać teorię jak to się robi, na razie VHDL nie znam ale zaczynam wchłaniać :) więc jakieś próby podstawowe chciałbym wykonać, choćby na jednej bramce ,czy jakimkolwiek innym elemencie i podpiąć to do projektu. Jak to potem będzie , czy z opisu VHDL PACE będzie widzieć te wejścia które tam były opisane ?

    Dodano po 22 [minuty]:

    próbowałem włączać te bufory i zawsze to samo, soft nie pozwala ich łączyć równolegle, w takim razie spróbuję przejść na te rejestry przesuwne równoległo/szeregowe i puścić je przez multiplekser , albo wyprowadze każdy osobno do wyjść, tylko na razie nie działają mi one, a w bibliotece nie ma takich, jest niby 74165 ale z końcówką S i nie ma szeregowego wyjścia...

    Dodano po 29 [minuty]:

    ok, już zatrybiłem jak się dołącza VHDL, skopiowałem rejestr przesuwny którego nie miałem (z netu) jako VHDL i wygenerowałem symbol , rewelacja :)
  • Poziom 19  
    dzięki , będę drążył.
    lekko się wkurzyłem, bo jak zaimplementowałem ten plik z VHDL , potem wygenerowałem z programu schemat tego rejestru przesuwnego , następnie z niego (12szt) zrobiłem element i jak umieściłem ten element na schemacie głównym, to teraz pisze że element nie posiada żadnych wejść i wyjść i po kompilacji jest 260 błędów (ostrzeżeń dokładnie) !, więc coś zrobiłem źle , tylko co ?? bez vhdl było ok...
  • Poziom 30  
    Żeby uniknąć nieporozumień, ściągnij tutorial do ISE z strony Xilinx'a: ISE In-Depth Tutorial - strona 70, stworzenie z HDL symbol do schematu.
    Więcej tego tutaj
    Ogólnie sprawdź czy HDL jest syntezowalny, później zakładka Design, Design Utilities -> Create Schematic Symbol. Jak wszystko dobrze poszło, powinieneś mieć teraz razem z resztą bramek, przerzutników Swój symbol do schematu (;
  • Poziom 19  
    właśnie tak zrobiłem jak piszesz , symbol (schemat) się wygenerował bez problemu, potem był w bibliotece i z biblioteki go pobrałem , potem utworzyłem symbol z 12 takich elementów i właśnie nie działa to na głównym schemacie, tzn wyswietla się prawidłowo, połączenia są, ale program ich nie widzi...
  • Poziom 30  
    mototest napisał:
    właśnie tak zrobiłem jak piszesz , symbol (schemat) się wygenerował bez problemu, potem był w bibliotece i z biblioteki go pobrałem , potem utworzyłem symbol z 12 takich elementów i właśnie nie działa to na głównym schemacie, tzn wyswietla się prawidłowo, połączenia są, ale program ich nie widzi...

    Coś z opisem jest nie tak, wrzuć go tutaj jak możesz. Dobry opis HDL nie stwarza takich problemów.
  • Poziom 19  
    Code:

    library IEEE;
    use IEEE.std_logic_1164.all;
    use IEEE.std_logic_arith.all;

    --**************************
    -- piso Entity Description *
    --**************************
    ENTITY piso IS
       GENERIC(x : INTEGER := 8);
       PORt(
          DIN: IN std_ulogic_vector(x-1 DOWNTO 0);
          CLK,LD,R,DIR_R,SE: IN STD_ULOGIC;
          SO: OUT STD_ULOGIC
       );
    END piso;

    -- piso Architecture Description
    ARCHITECTURE rtl of PISO IS
       SIGNAL pre_Q : std_ulogic_vector((x-1) DOWNTO 0) := (OTHERS => 'X');
    BEGIN
       SHIFT_REGISTER_Process: PROCESS(CLK,R)
       BEGIN
          IF (R = '1') THEN
             pre_Q <= (OTHERS => '0');
          ELSIF (CLK'event and (CLK = '1') AND (CLK'last_value = '0')) THEN
             IF (LD = '1') THEN
                pre_Q <= DIN;
             ELSIF (SE = '1') AND (DIR_R = '1') THEN
                pre_Q(x-1) <= '0';
                pre_Q((x-2) DOWNTO 0) <= pre_Q((x-1) DOWNTO 1);
             ELSIF (SE = '1') AND (DIR_R = '0') THEN
                pre_Q((x-1) DOWNTO 1) <= pre_Q((x-2) DOWNTO 0);
                pre_Q(0) <= '0';
             END IF;
          END IF;
       END PROCESS SHIFT_REGISTER_Process;
       SO <= pre_Q(0) WHEN DIR_R = '1' ELSE
             pre_Q(x-1) WHEN DIR_R = '0' ELSE
             'X';
    END rtl;

  • Poziom 19  
    dzisiaj już nie zdążę, jutro sprawdzę na mniejszym układzie i na nowym projekcie, coś chyba skopałem w tym sworzonym symbolu z 12 rejestrów, bo jak skopiowałem go do innego projektu to też tak samo nie działał, a wygląda w nim na wszystko ok. Nie podłączyłem tam jeszcze wejść LD,R i DIR (są w powietrzu bez drutów ,bo nie wiem jeszcze jakie stany tam mają być), ale to chyba nie przeszkadza ??
  • Poziom 30  
    mototest napisał:
    Nie podłączyłem tam jeszcze wejść LD,R i DIR , ale to chyba nie przeszkadza ??

    Właśnie bardzo przeszkadza, bo w standardzie IEEE_1164 to jest X (albo U nie pamiętam dokładnie). A to wprowadza układ w stan nieokreślony, czyli błędnego działania, wszystkie WEJŚCIA podłączaj do GND lub VCC jak nie używasz (general).

    Po opisie można stwierdzić:
    - CLK - zegar
    - LD - load, kiedy '1' ładuj daną do rejestru wewnętrznego, jeśli '0' pomiń i działaj jak rejestr przesuwny.
    - R - Reset asynchroniczny układu, kiedy R='1'
    - SE i DIR_R - kierunek przesuwania, SE='1' i DIR_R='1' w prawo i wychodzi najmłodszym bitem, SE='1' i DIR_R='0' na odwrót
  • Poziom 19  
    Mam ciągle problem jak stosuję ten rejestr.
    Załączam projekt, jest tam tylko licznik i ten rejestr, program wywala błedy że wejścia są nie podłączone i inne jak poniżej . Spróbuj uruchomić to u siebie i zobacz ,czy to coś w ustawieniach programu jest nie tak, czy w projekcie

    błędy:
    Code:

    WARNING:Xst:753 - "E:/CPLD/test_piso/schemat.vhf" line 276: Unconnected output port 'CEO' of component 'CB4CE_MXILINX_schemat'.
    WARNING:Xst:753 - "E:/CPLD/test_piso/schemat.vhf" line 276: Unconnected output port 'TC' of component 'CB4CE_MXILINX_schemat'.
    WARNING:Xst:1710 - FF/Latch <pre_Q_5> (without init value) has a constant value of 0 in block <XLXII>. This FF/Latch will be trimmed during the optimization process.
    WARNING:Xst:1710 - FF/Latch <pre_Q_4> (without init value) has a constant value of 0 in block <XLXII>. This FF/Latch will be trimmed during the optimization process.
    WARNING:Xst:1710 - FF/Latch <pre_Q_3> (without init value) has a constant value of 0 in block <XLXII>. This FF/Latch will be trimmed during the optimization process.
    WARNING:Xst:1710 - FF/Latch <pre_Q_2> (without init value) has a constant value of 0 in block <XLXII>. This FF/Latch will be trimmed during the optimization process.
    WARNING:Xst:1710 - FF/Latch <pre_Q_1> (without init value) has a constant value of 0 in block <XLXII>. This FF/Latch will be trimmed during the optimization process.
    WARNING:Xst:1710 - FF/Latch <pre_Q_0> (without init value) has a constant value of 0 in block <XLXII>. This FF/Latch will be trimmed during the optimization process.
    WARNING:Xst:1710 - FF/Latch <pre_Q_7> (without init value) has a constant value of 0 in block <XLXII>. This FF/Latch will be trimmed during the optimization process.
    WARNING:Xst:1710 - FF/Latch <pre_Q_6> (without init value) has a constant value of 0 in block <XLXII>. This FF/Latch will be trimmed during the optimization process.
    WARNING:Cpld - Unable to retrieve the path to the iSE Project Repository. Will
       use the default filename of 'schemat.ise'.
    WARNING:Cpld:945 - The component 'XLXI_4' has no outputs and will be deleted.
    WARNING:Cpld:945 - The component 'XLXI_5' has no outputs and will be deleted.
    WARNING:Cpld:945 - The component 'XLXI_6' has no outputs and will be deleted.
    WARNING:Cpld:945 - The component 'XLXI_7' has no outputs and will be deleted.
    WARNING:Cpld:1007 - Removing unused input(s) 'SW1'.  The input(s) are unused
       after optimization. Please verify functionality via simulation.
    WARNING:Cpld:1007 - Removing unused input(s) 'SW2'.  The input(s) are unused
       after optimization. Please verify functionality via simulation.
    WARNING:Cpld:1006 - Design 'schemat' has no inputs.


    schemat:
    Łączenie schematów w Webpack ISE
  • Poziom 19  
    jeszcze zauważyłem,że ty masz dwa pliki vhd a ja jeden, skąd się więły dwa ?
  • Poziom 30  
    Trzymaj majster, wystarczyło inaczej przeprowadzić sygnały na schemacie. Będziesz się trzymał zasady jeden zegar do układu, i reset i będzie dobrze.

    Ten warning:
    Code:
    WARNING:Xst:753 - "E:/Projekty/FPGA/forum/mototest/test_piso/test_piso/schemat.vhf" line 301: Unconnected output port 'CEO' of component 'CB4CE_MXILINX_schemat'.
    
    WARNING:Xst:753 - "E:/Projekty/FPGA/forum/mototest/test_piso/test_piso/schemat.vhf" line 301: Unconnected output port 'TC' of component 'CB4CE_MXILINX_schemat'.

    Można Sobie wsadzić głęboko... gdzieś (; Nie wpłynie to na działanie układu. Napisałem bardzo prymitywny testbench'a, czasem optymalizacja się na nim opiera, więc bardzo dobrze jest przed implementacją go zrobić.
    Plik piso.vhd został troszkę zmieniony, dodano:
    Code:
    USE ieee.std_logic_unsigned.all;

    I zmieniono:
    Code:
    std_ulogic_vector

    na:
    Code:
    std_logic_vector

    Żeby zachować zgodność wektorów. Domyślnie wszędzie się używa std_logic_vector. Wszystkie wartości typu 'X' zmieniłem na wartość określoną '1' lub '0'. Dodałem buffory na zegar, wyjście oraz wejście. Dobrą praktyką jest ich wstawianie w schemacie. Zmieniono połączenie, aby układ miał ręce i nogi, znaczy się w ogóle zadziałał (; Dodałem SW3 do ładowania, który musisz uwzględnić w *.ucf. Nie wiem jak będziesz miał buttony skonfigurowane, czy do masy czy do zasilania, więc w razie czego dodaj INV. Ja bym jeszcze dodał na wejścia mały układ na 3 przerzutnikach typu debouncer. Jak masz zegar zewnętrzny dołącz go do SW1 z jakimś preskalerem, żeby dostać mały czas zmian, żeby na diodzie LED mógł cokolwiek zauważył. Bo zegar wprowadzany z buttona są nieeleganckie (;

    Aha, jeszcze dodałem sygnały inicjalizujące, PPM na drut lub kompont, Object Properties, NEW, Atrribute Name = INIT, np. VALUE = 0. Więcej o tym tu: INIT

    mototest napisał:
    jeszcze zauważyłem,że ty masz dwa pliki vhd a ja jeden, skąd się więły dwa ?

    Uruchomiłem jakiś projekcik, bo mi nie chciało rysować schematu od nowa, nie przejmuj się nim (;
  • Poziom 19  
    zaraz będę to oglądał, jeszcze nie ściągnąłem.
    zegar z buttona zrobiłem ,żeby ustalić sobie stan na liczniku ręcznie, żeby było widać efekt na wyjściu w postaci migającej diody LED, bo jak generator będzie podawał, to nie sprawdzę efektu na LEDzie bo nie nadążę patrzeć,
    mam taką płytkę testową z trzema buttonami i pięcioma ledami, generatory też są , wolne i szybkie.

    Dodano po 19 [minuty]:

    czyli w zasadzie opis vhdl był winny że nie widział wejść ? bo poza buforami i wspólnymi R i CLK nic nie zmieniałeś.
    Z tym wspólnym zegarem w tym przypadku to chyba nie wypali, bo ja chcę żeby zewnętrzny procek podawał zegar do odczytu liczby z tego rejestru,wtedy kiedy potrzebuję, a potem resetuję licznik , natomiast CLK od licznika liczy impulsy z zewnątrz, czy dobrze rozumuję ?
  • Poziom 30  
    mototest napisał:
    Z tym wspólnym zegarem w tym przypadku to chyba nie wypali, bo ja chcę żeby zewnętrzny procek podawał zegar do odczytu liczby z tego rejestru,wtedy kiedy potrzebuję, a potem resetuję licznik , natomiast CLK od licznika liczy impulsy z zewnątrz, czy dobrze rozumuję ?

    Rozumiesz dobrze. Można rozdzielić zegary, tylko dobrym zwyczajem jest trzymanie się zasady jeden globalny zegar i reset.

    Ja bym jeszcze wyprowadził na wyjściu magistralę licznik, podłączyć diody lub miernikiem zbadać stany. Bo musisz widzieć jaka wartość zostanie załadowana do PISO, kiedy LD='1'. W tedy powinieneś zobaczyć "prawie" takie same stany na diodzie LED. "Prawie" dlatego, że nie masz eliminacji drgań zestyków, więc będzie Ci przeskakiwało.
  • Poziom 19  
    jeszcze jedno, czy pin LD działa na takiej zasadzie, że rejestr otrzyma dane z licznika dopiero po naciśnięciu SW3 ? bo jeśli tak to jest mi to niepotrzebne, wystarczy mi jak dane z licznika są ciągle na wejściach rejestru , a odczytam ich kiedy potrzebuję za pomocą CLK , Reset z PISO teżby nie był potrzebny, bo po skasowaniu licznika i tak otrzyma daną zero. Co o tym myślisz ?

    Dodano po 2 [minuty]:

    na magistrali licznik mam LEDy, tylko je skasowałem przed wysyłką pliku na elektrodę, żeby jak najmniej bruździło.