Nie znam narzędzi Xilinx, ale znam narzędzia Altery, więc opowiem wam o ich narzędziach. Xilinx i inni nie powinni być zbyt różni.
Verilog
Pierwszą rzeczą, którą musisz zrobić, to nauczyć się Verilog . Spowoduje to ból głowy, ponieważ Verilog (i nieco podobny VHDL) został po raz pierwszy zaprojektowany jako język symulacji i wiele konstrukcji (jak #5
co oznacza „poczekaj 5 kroków czasowych”, przy czym krok czasowy to zwykle nanosekunda). Istnieje więc wiele ograniczeń, o których należy pamiętać, aby kod Verilog mógł zostać zsyntetyzowany , tj. Skompilowany do strumienia bitów dla układu FPGA.
Największym szokiem jest to, że to, co piszesz w Verilog (i VHDL), to zachowanie, którego oczekujesz od systemu , a kompilator wyprowadza właściwą logikę z twojego opisu. Jeśli nie jesteś ostrożny, możesz uzyskać wiele nieprzyjemnych błędów.
Na przykład przerzutnik D wygląda następująco:
always @(posedge RESET or posedge CLK)
begin
if(RESET)
Q <= 1'b0;
else if(CLK_ENA)
Q <= D;
end
Opisuje to, w jaki sposób działa DFF, a kompilator musi go przeanalizować i ustalić, czy chcesz mieć DFF. @(...)
Nazywa się listę czułość , która jest listą sygnałów, które wywołują ponowną ocenę bloku kodu; dlatego w tym bloku Q
zmienia się tylko wtedy, gdy występuje zbocze narastające na RESET
lub CLK
(dotyczy to resetu z aktywnym wysokim). Jeśli zapomnisz coś na liście czułości (który powinien zawierać wszystkie zmienne prawo do rąk bez żadnych ubocznych posedge
lub negedge
modyfikatory dla kombinowanych bloku logicznego) kompilator syntezy zatrzaski, ile potrzeba, a nie wywołanie błędu. Szalony, ale tak właśnie jest, ponieważ Verilog był pierwotnie językiem symulacji, który ukrywał (a zatem nie wymagał) szczegółów implementacji. VHDL jest taki sam, ale o wiele bardziej szczegółowy.
W końcu nowa wersja Verilog o nazwie SystemVerilog została wydana kilka lat temu, co znacznie ułatwia pisanie kodu syntezowalnego . Jeśli to w ogóle możliwe, naucz się tego języka, ponieważ Xilinx ISE i Altera Quartus II go obsługują. Głównym problemem jest całkowity brak dobrego materiału referencyjnego.
Wersja DFF SystemVerilog usuwa kilka drobnych rzeczy:
always_ff @(posedge RESET, posedge CLK)
begin
if(RESET)
Q <= '0;
else if(CLK_ENA)
Q <= D;
end
Zauważ, że sygnały na liście czułości są oddzielone przecinkami. Jest tak, ponieważ or
było mylące, ponieważ and
nie mogło tam pracować. Zwróć także uwagę na zastąpienie 1'b0
(pojedynczego 0
bitu) '0
znakiem (symbol, który rozwija się do 0
wymaganej liczby bitów w zależności od tego, do czego jest przypisany; znacznie bardziej elastyczny dzięki parametryzowanym modułom). Na koniec zwróć uwagę na zastąpienie always
(które może być użyte do czegokolwiek; kombinacja logiki, zatrzasków i klapek), always_ff
które wymaga syntezy zawartości do klapek. Istnieje również opcja, always_comb
która eliminuje listę czułości, ponieważ po prostu opracowuje ona czułości od wejść do bloku.
Oprogramowanie do projektowania Altera nazywa się Quartus II i będziesz szukał Web Edition . (Wersje subskrypcyjne są dość drogie i potrzebne tylko w przypadku najszybszych lub najnowszych modeli FPGA).
Smutne jest to, że nie znalazłem dobrej książki na ten temat. Czego się nauczyłem, składając rzeczy z wielu źródeł, takich jak książki Verilog, które nie radzą sobie z mówieniem, co można syntetyzować, a co nie, i przykładowy kod. Quartus II ma polecenie „wstaw szablon”, które wstawia kod szablonu dla kilku popularnych struktur, od D przerzutników do maszyn stanu.
Sprzęt demonstracyjny
Po zaimplementowaniu procesora w Verilog musisz go zbudować. Na razie pozwól, aby Quartus wybrał układ (musisz wybrać rodzinę; polecam Cyclone IV) i pinouty. Gdy to się stanie, będziesz wiedział, ile potrzebujesz chipa. Powie ci ile elementów logicznych, przerzutników, bitów RAM itp. Użyłeś. Upewnij się, że nie masz ponad 50% na żadnym z nich; jeśli tak, spójrz na układ wybrany przez kompilator i ręcznie wybierz następny większy układ (w elementach logicznych), który ma co najmniej tyle pinów, i powtarzaj, aż do wykorzystania poniżej 50%.
Następnie wybierz płytę demonstracyjną, która ma układ co najmniej tak duży, jak ten, który w końcu zbudowałeś. Sprawdź, czy ma potrzebne urządzenia peryferyjne i / lub złącza we / wy. Często zdarza się, że budowana jest karta dodatkowa, która podłącza się do złącza rozszerzającego, aby zapewnić brakujący sprzęt.
Teraz, gdy wybrałeś sprzęt, znajdź prawdziwe wyprowadzenia i użyj narzędzia Pin Planner, aby umieścić odpowiednie sygnały na odpowiednich wyprowadzeniach. Płytka demonstracyjna będzie zawierała instrukcję użytkownika, która informuje, które piny są podłączone do poszczególnych urządzeń lub styków złącza na płycie demo.
Po ustawieniu pinoutów zbuduj go ponownie, aby używał pinów, które chcesz. Należy pamiętać, że niektóre sygnały, takie jak zegary systemowe, będą wymagały dedykowanych pinów wejściowych (więc kierują bezpośrednio do wewnętrznych PLL).
Skorzystaj z programatora, aby pobrać swój projekt bezpośrednio do FPGA (tego rejestru przesuwnego, o którym wspominałem jakiś czas temu). Teraz jesteś w znanym cyklu debugowania edycji i kompilacji. Pobijaj, aż zadziała.
Gdy to zadziała, możesz użyć programatora do pobrania kodu do wbudowanego urządzenia konfiguracyjnego, aby Twój program załadował się i uruchomił po włączeniu.
To było dość długie i mam nadzieję, że trochę pomogło. Jest wiele do nauczenia się; to nie jest tak, jak nauka nowego języka programowania, tak jak nauka nowego paradygmatu programowania, np. przejście z języków proceduralnych na funkcjonalne. Verilog to język symultaniczny; większość kodu jest zawsze wykonywana.
Powodzenia!