Xilinx ISE WebPACK

Xilinx ISE WebPACK to oprogramowanie, umożliwiające tworzenie aplikacji i wgrywanie ich do układów programowalnych. Najnowsze ISE to potężne monstrum, którego plik instalacyjny waży 7,4GB, a po instalacji zajmuje prawie 30GB! Na początek proponuję ściągnąć wersję starszą i prostszą w obsłudze. Ja wybrałem sobie wersję 8.2, ponieważ wcześniejsze nie obsługują programatora na USB, a mój laptop jest już dość wiekowy i najnowsza wersja mogłaby mi się nie zmieścić na dysku :) 

Program ściągamy ze strony producenta. Interesuje nas ISE Foundation - 8.2i Full Product Installation. Trzeba się zarejestrować na stronie i ściągnąć klucz aktywacyjny. Jest to proste i nie będę tego opisywał.

Pierwszy bardzo prosty projekt

menu start wybieramy Xilinx ISE > Project Navigator. Zamykamy poradę dnia i następnie powinniśmy zobaczyć okno, jak na poniższym zdjęciu:

Pusty projekt

Wybieramy File > New Project. Jako nazwę projektu proponuję wpisać po prostu pierwszy, miejsce na dysku C:/CPLD/pierwszy i zaznaczamy, że projekt będziemy tworzyli w języku opisu sprzętu, czyli HDL (Hardware Desciption Language). Klikamy Next.

Nowy projekt

Teraz należy podać, na jakim układzie będziemy pracować. Musisz tutaj sam wpisać odpowiednie dane. Ja mam układ XC9572XL w obudowie PC44, o prędkości 10. Reszta jak na zdjęciu. Można nie wybierać konkretnego modelu układu i pozostawić automatic. Program ISE sam dobierze układ o odpowiednich zasobach logicznych.

Nowy projekt

W następnym kroku musimy utworzyć plik źródłowy, w którym będziemy pisać kod. Klikamy New Source i wybieramy następnie Verilog module, nazywamy go pierwszy i zaznaczamy Add to project. Program zapyta o wejścia i wyjścia z układu. Pomińmy ten krok, zdefiniujemy to samodzielnie. 

Wybór FPGA

Dalej, program umożliwia zaimportowanie istniejących już plików. Nie mamy jeszcze czego importować, klikamy Next. Na zakończenie powinno się pokazać okno jak poniżej. Klikamy Finish.

Xiling ISE

Program automatycznie utworzył szablon, w którym możemy pisać kod. Poniżej znajdziesz prosty przykład z bramką AND i OR.

 
`timescale 1ns / 1ps

module pierwszy(
    input wejscie1, wejscie2,
    output wyjscie_and, wyjscie_or
);

    assign wyjscie_and = wejscie1 & wejscie2;
    assign wyjscie_or  = wejscie1 | wejscie2;

endmodule 
 

Po lewej stronie znajduje się okienko Process. Znajdują się w niej procesy dostępne dla pliku, zaznaczonego w okienku powyżej, w Sources. Wybierz pierwszy.v, a następnie dwukrotnie kliknij na Synthesize. Jeżeli wszystko pójdzie dobrze, to przy Synthesize pojawi się zielona ikonka, a w konsoli na dole ekranu pokaże się mnóstwo różnych komunikatów.

Synteza

Dla kontroli, rozwiń menu Synthesize i dwukrotnie kliknij View RTL Schematic. Pojawi się schemat, który program wygenerował na podstawie opisu HDL. Opisaliśmy w nim bramkę AND i OR, co zostało zinterpretowane zgodnie z oczekiwaniami. 

Schemat FPGA

W okienku Sources, tam gdzie były pliki źródłowe, obecnie jest tylko "pierwszy". Zwróć uwagę, że trochę poniżej znajdują się cztery zakładki: Sources, Snapshoots, Libraries, Design. Wybierz Sources i pliki projektowe znów się pokażą. 

Przypiszemy teraz abstrakcyjne nazwy wejść i wyjść do rzeczywistych pinów w obudowie układu scalonego. W procesach rozwiń menu User Constraints, a następnie dwukrotnie kliknij Assign Package Pins. Program zapyta czy dodać plik UCF, klikamy Yes

Assign pin

Pojawia się edytor pinów Xilinx PACE. Widać obudowę układu scalonego XC9572XL w PLCC44. Niektóre nóżki zostały zaznaczone kolorami, które są wyjaśnione w legendzie. Są to linie zasilające, JTAG, albo piny ogólnego przeznaczenia, wyposażone dodatkowo w specjalne funkcje. 

Pace

Po lewej stronie ekranu mamy tabelkę z wypisanymi wszystkimi wejściami i wyjściami. W kolumnie Loc musimy podać numer nóżki, która ma być powiązana z danym sygnałem. I tak: jako wejścia wybrałem P1, P2, a na wyjścia dałem P35, P36. W dalszych kolumnach mamy dostępne różne opcje dotyczące nóżek. W XC9572XL są one bardzo skąpe i jedyne co można wybrać to Slew Rate, czyli szybkość narastania zbocza. Wybrałem SLOW, aby zminimalizować emisję zakłóceń. Bardziej zaawansowane układy, jak Cool Runner mają do dyspozycji wejścia np. z przerzutnikiem Schmitta, a inne mogą mieć różne standardy napięciowe, wejścia różnicowe, rezystory podciągające oraz całą masę innych funkcji.Proszę pamiętać, że XC9572XL nie ma rezystorów podciągających i trzeba je dołączyć samodzielnie!

Pace przypisanie pinów

Zapisujemy plik klikając na ikonę dyskietki (czy ktoś jeszcze używa dyskietek?). Program zapyta nas o IO Bus Delimiter. Nie wchodząc w szczegóły klikamy OK i wychodzimy z PACE.

Mając skonfigurowane nóżki układu można przejść do kolejnych etapów syntezy (uwaga! nie trzeba konfigurować pinów, a wtedy ISE zrobi to samodzielnie, co czasami daje lepsze rezultaty, jeśli projekt zużywa sporo zasobów logicznych). Wracamy z powrotem do procesów, gdzie dwukrotnie klikamy Fit. Program umiejscowi nasz opis w Verilogu do rzeczywistych bramek i przerzutników, znajdujących się w CPLD. Po zakończeniu tego procesu pojawi się raport.

I co my tu widzimy? Zużyliśmy tylko dwie makrocele (ponieważ potrzebujemy dwóch pinów wyjściowych). Dwa pterms i ani jednego przerzutnika. W raportach można wyczytać, czy rzeczywiście otrzymaliśmy to co chcemy. Np. czy pamięć RAM została umiejscowiona w odpowiednich komórkach blokowych (BRAM), czy może w uniwersalnych komórkach logicznych LUT. Nie będziemy wchodzić w te szczegóły. Jeżeli pozostawiliśmy programowi automatyczny dobór układu lub pinów, wyczytamy je również w tym raporcie.

Raport z syntezy

Przygotujmy teraz plik do zaprogramowania układu. Kliknij dwukrotnie Generate Programming File w oknie Process. Następnie rozwiń Generate Programming File i otwórz Configure Device (iMPACT). Uruchomi się program obsługujący programator. Należy włączyć układ do zasilania, podłączyć programator. 

Konfiguracja

W pierwszej kolejności musimy ustawić, jakie układy chcemy programować. Może być tak, że w łańcuchu JTAG mamy kilka scalaków, niekoniecznie od Xilinxa, różne pamięci lub mikrokontrolery. W oknie, które się pojawiło, możemy wybrać różne tryby programowania i generowania plików konfiguracyjnych. Pozostańmy przy pierwszej opcji, czyli automatyczne skanowanie układów w JTAG oraz programowanie.

Config

Jeżeli iMPACT prawidłowo wykryje programator i układy, wówczas zapyta o plik programujący. Wybieramy pierwszy.jed. Jeżeli coś poszło nie tak, kliknij Debug > Cable Setup. Poniżej zamieszczam prawidłową konfigurację dla programatora Platform Cable USB DLC9G.

Daisy chain

Powinien się pojawić łańcuch, złożony ze wszystkich układów wykrytych przez programator. W moim przypadku jest to tylko jeden XC9572XL. Klikamy na niego. Po lewej stronie pojawiły się różne czynności, jakie możemy wykonać. Nie zastanawiając się dłużej, dwukrotnie kliknij Program.

Programowanie

Pojawi się okno z dodatkowymi opcjami programowania. Przed załadowaniem nowego wsadu, trzeba najpierw skasować stary, więc zaznaczamy Erase before programming. Opcje te zmieniają się w zależności od programowanego układu. Dostępne też są różne zabezpieczenia przez kradzieżą naszej pracy, ale (uwaga!) nonszalanckie podejście do tych opcji może spowodować blokadę układu, podbnie jak błędne ustawienie fuse-bitów w AVR-ach. Klikamy ok i to wszystko!

Gotowe!

Planuję też drugi tutorial, w którym opiszę trochę więcej opcji Xilinx ISE WebPACK. Jak pisałem, jest to potężna kobyła, która potrafi sporo, ale można się w niej łatwo pogubić. Samo pisanie kodów w Verilogu czy VHDL to dopiero połowa sukcesu. ISE oferuje całą gamę narzędzi, jak symulator, oglądanie połączeń wewnątrz układu, obliczanie poboru mocy, generator IPcorów, itp, itd...