Jaka jest motywacja korzystania z Verilog lub VHDL nad C?

12

Pochodzę ze środowiska programistycznego i nie przesadzam ze sprzętem lub oprogramowaniem układowym (co najwyżej trochę elektroniki i Arduino).

Jaka jest motywacja do używania języków opisu sprzętu (HDL), takich jak Verilog i VHDL, zamiast języków programowania, takich jak C lub niektóre asemblery?

Czy to w ogóle kwestia wyboru?

Czytałem, że sprzęt, którego oprogramowanie wbudowane jest w HDL, ma wyraźną przewagę w równoległym uruchamianiu instrukcji. Byłem jednak zaskoczony, gdy dyskusje wyrażały wątpliwości, czy napisać oprogramowanie układowe w języku C czy asemblerowym (w jaki sposób zestawienie jest odpowiednie, jeśli niekoniecznie masz procesor?), Ale doszedłem do wniosku, że jest to również opcja.

Dlatego mam kilka pytań (nie wahaj się niczego wyjaśniać):

  1. Oprogramowanie naprawdę można napisać albo w HDL, albo w języku programowania, czy to tylko kolejny sposób na wykonanie tej samej misji? Chciałbym przykłady z prawdziwego świata. Jakie ograniczenia wynikające z każdej opcji?

  2. Wiem, że powszechne użycie oprogramowania układowego nad oprogramowaniem jest w akceleratorach sprzętowych (takich jak procesory graficzne, karty sieciowe, akceleratory SSL itp.). Jak rozumiem, to przyspieszenie nie zawsze jest konieczne, ale tylko zalecane (na przykład w przypadku SSL i przyspieszania złożonych algorytmów). Czy we wszystkich przypadkach można wybrać oprogramowanie wewnętrzne i oprogramowanie? Jeśli nie, chętnie skorzystam z przypadków, w których oprogramowanie układowe jest wyraźnie i jednoznacznie odpowiednie.

  3. Czytałem, że oprogramowanie układowe najczęściej jest nagrywane na ROM lub flash. Jak się tam reprezentuje? W bitach, jak oprogramowanie? Jeśli tak, jaka jest największa różnica? Czy jest to dostępność dostosowanych obwodów w przypadku oprogramowania układowego?

Wydaje mi się, że popełniłem błąd tu i tam w niektórych założeniach, proszę wybacz mi. Dziękuję Ci!

Odbicie
źródło
14
Języki programowania służą do opisywania oprogramowania, języki opisu sprzętu służą do opisywania sprzętu.
Ignacio Vazquez-Abrams,
1
Nie piszesz oprogramowania układowego za pomocą Verilog lub VHDL - używasz Verilog lub VHDL do projektowania układów, programowania FPGA i projektowania płyt głównych. Do pisania oprogramowania układowego używasz C lub zestawu. Możesz także używać C / C ++ do projektowania płyt głównych - istnieje biblioteka o nazwie SystemC, którą można skompilować za pomocą kompilatora C w celu utworzenia programu, który symuluje projekt, ale można go również skompilować za pomocą kompilatora SystemC w układy.
slebetman
FWIW, ponieważ masz doświadczenie w Arduino, pisanie oprogramowania dla Arduino nazywa się pisaniem oprogramowania układowego. Firmware może być kompletnym systemem operacyjnym - na przykład Linux jest używany w oprogramowaniu większości routerów, a Windows jest używany w oprogramowaniu większości bankomatów
slebetman

Odpowiedzi:

28

Jaka jest motywacja do używania języków opisu sprzętu (HDL), takich jak Verilog i VHDL, zamiast języków programowania, takich jak C lub niektóre asemblery?

C i asembler to dobre języki do informowania procesora, co ma robić. Opisują działania, które należy wykonać sekwencyjnie za pomocą pojedynczej maszyny stanów.

HDL to dobre języki do opisywania lub definiowania dowolnej kolekcji obwodów cyfrowych. Mogą wyrażać operacje wykonywane równolegle w sposób, którego nie potrafią języki programowania. Mogą również opisywać ograniczenia czasowe interfejsów między blokami w sposób, którego nie potrafią języki programowania.

Byłem zaskoczony, gdy dyskusje wyrażały wątpliwości, czy napisać oprogramowanie układowe w języku C czy w asemblerze (w jaki sposób asembler jest odpowiedni, jeśli niekoniecznie masz procesor?)

W tym pytaniu zadawane jest pytanie: „Jeśli piszesz kod dla mikrokontrolera, czy istnieje prawdziwa różnica, jeśli piszesz w asemblerze, C lub innym języku wysokiego poziomu?”.

Ponieważ pyta konkretnie o systemy z mikrokontrolerem (procesor z urządzeniami peryferyjnymi), zarówno C, jak i montaż są rozsądnymi wyborami dla rozwoju oprogramowania typu firwmare, a HDL nie.

Oprogramowanie naprawdę można napisać albo w HDL, albo w języku programowania, czy to tylko kolejny sposób na wykonanie tej samej misji?

To zależy od rodzaju posiadanego sprzętu. Jeśli masz procesor, użyj języka programowania. Jeśli masz układ FPGA lub projektujesz układ ASIC, użyj HDL. Jeśli projektujesz bardzo dużą liczbę logiki cyfrowej, możesz spojrzeć na jeden z pośrednich języków, takich jak SystemVerilog.

Czytałem, że oprogramowanie układowe najczęściej jest nagrywane na ROM lub flash. Jak się tam reprezentuje? W bitach, jak oprogramowanie? Jeśli tak, jaka jest największa różnica? Czy jest to dostępność dostosowanych obwodów w przypadku oprogramowania układowego?

Wydaje mi się, że rozłącza cię termin „oprogramowanie układowe”. Słowo to pierwotnie oznaczało uruchomienie kodu w systemie wbudowanym, który nie był dostępny dla użytkownika końcowego do zmiany. Jeśli sprzedałeś komuś komputer, istnieje bardzo duże prawdopodobieństwo, że użytkownik zmieni oprogramowanie na nim uruchomione. Jeśli sprzedałeś im oscyloskop, nie chciałbyś, aby zmieniali kod uruchamiany na wewnętrznym mikroprocesorze, więc nazwałeś to oprogramowaniem.

Użytkownicy FPGA przywłaszczyli sobie słowo „oprogramowanie układowe” na wyjściu swoich projektów, ponieważ jest ono bardziej zmienne niż sprzęt (rzeczy, które są połączone razem). Ale tak naprawdę „oprogramowanie układowe” konfigurujące układ FPGA różni się od „oprogramowania układowego” działającego na komputerze. Oprogramowanie układowe uC kieruje uC przez szereg stanów, aby wykonać swoją funkcję. Oprogramowanie układowe FPGA definiuje zestaw połączeń między elementami logicznymi i wartościami, które mają być przechowywane w tablicach przeglądowych.

W obu przypadkach oprogramowanie układowe jest zwykle przechowywane w postaci bitów na eepromie (lub na dysku komputera hosta, który załaduje go przy każdym ponownym uruchomieniu systemu osadzonego). Ale to nie czyni ich podobnymi do siebie.

The Photon
źródło
Kiedy piszesz w VHDL / Verilog, łatwiej jest zwizualizować logikę, która zostanie zaimplementowana, a tym samym zoptymalizować. Tego samego nie można powiedzieć o C. Nawet SystemC jest nadal wystarczająco
oddzielony
@JRRB, Jeśli kodujesz dla uC lub uP, tak naprawdę nie wiem, jak to zrobić za pomocą HDL. Zgadzam się, że podczas kodowania logiki SystemVerilog lub SystemC są przeznaczone dla systemów, które są tak duże, że po prostu nie jest praktyczne projektowanie wszystkiego na poziomie pojedynczej bramki.
Photon
2
Pamiętaj, że VHDL i Verilog są również używane, gdy nie masz w ogóle żadnego sprzętu. Mogą być kompilowane bezpośrednio do obwodów zamiast strumienia bitów FPGA. Apple na przykład projektowało płyty główne za pomocą Verilog zamiast przechwytywania schematów GUI, ponieważ jest lepsza obsługa kontroli wersji, grepowania i po prostu parsowania za pomocą skryptów, gdy projekt jest zwykłym tekstem zamiast zastrzeżonych rysunków binarnych.
slebetman
10

W pierwszej części pytania dotyczącego motywacji korzystania z jednej lub drugiej: istnieje zasadnicza różnica między C i HDL (VHDL / Verilog) . C jest językiem programowania oprogramowania (jako asembler), VHDL / Verilog są językami opisu sprzętu . Nie są przeznaczone do tego samego celu.

Po kompilacji C jest tłumaczone na kod asemblera (w postaci binarnej, tj. Języka maszynowego) . Ten kod jest serią instrukcji, które każą CPU wykonać szereg podstawowych operacji (zmienić wartość rejestru, wykonać dodanie itp.).

Z drugiej strony HDL jest syntetyzowany na sprzęcie. W VHDL możesz na przykład napisać coś takiego:

output <= input1 + input2;

(patrz także pełniejszy przykład tutaj ). Byłoby to zsyntetyzowane w adderze (sprzętowym). Jeśli kod zostanie zsyntetyzowany dla FPGA , oznaczałoby to strumień bitów, który może skonfigurować konkretny FPGA do implementacji sumatora (jako logika kombinacyjna ).

W rzeczywistości możesz zaprojektować procesor w VHDL (patrz Soft Core Processors VS Hard core Processors ) i napisać dla niego oprogramowanie w C ...

Informacje o oprogramowaniu układowym: wszystko zależy od tego, jak zdefiniujesz słowo. Firmware może być program (software), która przebiega w mikrokontroler (a więc na przykład napisany w C lub asemblerze), lub może to być bitstream skonfigurować programowalne urządzenie (hardware) logika (CPLD lub FPGA). Czasami może to być pakiet zawierający oba elementy: jeśli weźmiesz oprogramowanie dla niektórych modeli FritzBox (modem ADSL), faktycznie zawierają one cały system Linux (napisany w asemblerze, C i wielu innych językach programowania) i strumień bitów do skonfiguruj układ FPGA (prawdopodobnie zsyntetyzowany z VHDL lub Verilog).

Ale
źródło
3
  1. To zależy od twojej architektury. Jeśli masz procesor (lub zazwyczaj mikrokontroler), musisz napisać oprogramowanie układowe w zwykłym języku programowania (łącznie z asemblerem). Jeśli masz coś takiego jak FPGA, twoje oprogramowanie układowe musi być zapisane w HDL. Według mojej wiedzy HDL nie mogą (o ile wiem) generować programów, które mogą być wydajnie wykonywane przez konwencjonalny procesor, a układ FPGA nie wykonuje konwencjonalnych programów po wyjęciu z pudełka. Możesz jednak skonfigurować FPGA jako procesor, a następnie uruchomić z nim konwencjonalny program. Wymagałoby to dwóch warstw oprogramowania układowego, dolnej warstwy napisanej w HDL do zbudowania procesora, a wyższej warstwy napisanej w tradycyjnym języku programowania do wykonania na tym procesorze.
  2. Nie ma wyraźnego rozróżnienia między oprogramowaniem układowym a oprogramowaniem. Na wielu urządzeniach oprogramowanie układowe byłoby przechowywane np. W pamięci flash, ale w nowoczesnym telefonie prawie wszystko jest przechowywane w pamięci flash, a rozróżnienie między oprogramowaniem układowym a oprogramowaniem jest niejasne (większość osób prawdopodobnie uważa kod do programowania oprogramowania procesora pasma podstawowego , i większość ludzi zastanawia się nad oprogramowaniem aplikacji, ale gdzie jest dokładna granica?).
  3. Jak powiedziałem w 2, nie ma wyraźnego rozróżnienia, poza tym, że oprogramowanie układowe jest trochę bardziej trwałe.
mikrotherion
źródło
3

Główną motywacją jest współbieżność sprzętowa .

Elektrony mogą płynąć w tym samym czasie w równoległych drutach, dlatego chcemy wziąć to pod uwagę przy projektowaniu sprzętu.

W VHDL, jeśli napiszesz coś takiego:

x <= a or b;
y <= a and b;
z <= x xor y;

(poza processlub function, które jednoznacznie oznaczają go jako sekwencyjne), to zakodowałeś fakt, że:

  • x, y, z, aI bsą przewody
  • ai bsą sygnałami wejściowymi
  • xjest podłączony do wyjścia orobwodu, który przyjmuje ai bjako wejście
  • i tak dalej dla innych linii

Łatwo jest zobaczyć, jak to będzie syntetyzowany do rzeczywistego sprzętu, a że xi yoceniane są w tym samym czasie.

        +-----+
A--+----+     |  X
   |    | OR  +-----+
B----+--+     |     |  +-----+
   | |  +-----+     +--+     |
   | |                 | XOR +-- Z
   | |  +-----+     +--+     |
   | +--+     |  Y  |  +-----+
   |    | AND +-----+
   +----+     |
        +-----+

Następnie, gdy nadszedł czas, aby zasymulować obwód, symulator (który jest zwykle programem sekwencyjnym) symuluje więc fizykę obwodu w następujący sposób:

  • ma alub bzmienione? Tak? Hej, xzależy od a. Zaktualizujmy x.
  • yzależy również od a. Zaktualizuj to również.
  • zzależy od x. Zaktualizuj, ponieważ xzostał zaktualizowany.
  • czy coś, co xzależy od ( alub b) zostało zaktualizowane? Nie? To samo dotyczy yi z. OK, skończyliśmy z tym krokiem.

Prowadzi to do „interesujących” możliwych wyników, które nie mają sekwencyjnego analogu, ale które reprezentują możliwe sytuacje fizyczne:

  • x <= not xdoprowadziłoby do nieskończonej rekurencji symulacji. Symulatory można po prostu odciąć po określonej głębokości.
  • x <= 0; x <= 1prowadzi do błędu (zwarcie). Jest to jeden z powodów, dla których std_logicistnieje.

Mimo to, mimo że VHDL modeluje sprzęt bliżej niż C, nie jest to sam jego szczegółowy opis:

W końcu VHDL zapewnia dobrą równowagę między funkcjonalnością obwodu zrozumiałego dla człowieka na wyższym poziomie, a możliwościami syntezy niższego poziomu.

Z drugiej strony C jest bardziej skoncentrowany na sekwencyjnym rozmowie z CPU.

Możesz oczywiście zakodować obwód za pomocą struktur C, wyliczeń i tablic C, a następnie zasymulować go tak, jak robi to VHDL (wygląda to mniej więcej tak, jak działa System C , ale nigdy go nie próbowałem).

Ale w zasadzie powinieneś ponownie wdrożyć symulator VHDL, używając bardziej pełnego języka. Chyba właściwe narzędzie do właściwej pracy.

Istnieją również narzędzia, które konwertują C na VHDL /programming/8988629/can-you-program-fpgas-in-c-like-languages, ale oczekują niższej wydajności, ponieważ są to ciężkie konwersje wyższego poziomu.

Ciro Santilli
źródło
0

HDL są używane do opisywania (syntezy) sprzętu, w którym jako język programowania służy do programowania sprzętu zsyntetyzowanego, tj. Procesora.

Możesz pobrać wersje soft core cpus jako VHDL lub strumień bitów, aby zsyntetyzować ten procesor na FPGA.

chintu
źródło
-1

Procesor wykorzystuje niewielką liczbę obwodów do wykonywania dużej liczby operacji kolejno, umożliwiając użycie większości komponentów do wykonywania różnych operacji w różnych momentach.

Układ FPGA zawiera wiele obwodów, które nie mogą - przynajmniej indywidualnie - wykonywać szczególnie skomplikowanych operacji, ale wszystkie są w stanie działać jednocześnie i niezależnie.

Załóżmy, że ktoś chce mieć układ wykonujący wiele zadań, w tym monitorowanie 15 wejść i:

  • Ustawienie wysokiej wartości wyjściowej za każdym razem, gdy wszystkie wejścia były stabilne przez co najmniej 21 ms, a liczba wejść, które są wysokie, jest wielokrotnością trzech
  • Ustawienie niskiego poziomu wyjściowego za każdym razem, gdy wszystkie wejścia były stabilne przez co najmniej 21 ms, a liczba wejść, które są wysokie, nie jest wielokrotnością trzech
  • Zmiana wyjścia w dowolny sposób między momentem zmiany danych wejściowych a czasem, gdy wszystkie wejścia były stabilne przez co najmniej 20 ms.

Jeśli ktoś ma mikrokontroler, który robi inne rzeczy, ale może zaoszczędzić kilka mikrosekund co 20 ms, aby sprawdzić te dane wejściowe i ustawić wyjście, wówczas większość obwodów używanych przez ten mikrokontroler do wykonywania innych zadań będzie również użyteczna do wykonania wskazanego zadania powyżej, więc bardzo mało obwodów (innych niż niektóre ROM i może RAM) trzeba będzie poświęcić temu zadaniu. Z drugiej strony może upłynąć trochę czasu między zmianą danych wejściowych a czasem, gdy dane wyjściowe odpowiednio je odzwierciedlają.

Za pomocą Verilog lub VHDL można zbudować obwód sprzętowy, który mógłby stale monitorować 15 wejść i wykonać wskazane obliczenia. Takie urządzenie prawdopodobnie byłoby w stanie uzyskać na wyjściu prawidłowe wskazanie w ciągu 100ns - rzędu wielkości szybciej niż mikrokontroler - ale ilość obwodów przeznaczonych do tego zadania i nieużytecznych do żadnego innego celu byłaby znacznie większa.

supercat
źródło
Nie wydaje się to szczególnie wyraźnym przykładem ilustrującym to rozróżnienie - w jego szczegółach jest wystarczająco dużo kwestii dyskusyjnych, które mogą nie pomóc w zapoznaniu się z kimś, kogo jeszcze nie znają. Ktoś realistycznie zmagający się z tym problemem prawdopodobnie wybrałby nowoczesną MCU z szerokim słowem danych i dobrymi przerwaniami na zmianę pinów. Decyzja, które rozwiązanie pochłania więcej logiki, wymagałaby następnie podjęcia decyzji, jeśli policzysz liczne nieużywane urządzenia peryferyjne na MCU lub nietknięte wycinki na FPGA. Ten pierwszy będzie nieco tańszy.
Chris Stratton,
@ChrisStratton: Być może powinienem był zasugerować, że sytuacja może się zmienić, jeśli wymagania dotyczące czasu ulegną zaostrzeniu? Wymaganie, aby procesor miał kilka mikrosekund dostępnych co 20 ms, może nie wymagać żadnych zmian w systemie bazowym, ale jeśli czas reakcji musiałby wynosić 200us, takie wymaganie może wymagać szybszego procesora niż byłby potrzebny, gdyby musiał być poniżej 20us, może być konieczne dodanie dodatkowego procesora, aby go obsłużyć, a jeśli poniżej 200ns może nie być w stanie osiągnąć w ogóle za pomocą procesora.
supercat
To dlatego, że nie wykorzystujesz możliwości MCU. W przerwie zmiany pinów uruchom blok sprzętowy, który ustawi wyjście 20 sekund później. Następnie w wolnym czasie zdecyduj, czy jest to rzeczywiście uzasadnione, a jeśli nie, anuluj je. Nie jest to naprawdę świetny przykład na uczynienie punktu FPGA, ponieważ istnieje tak wiele współzależności - jedyną częścią, która naprawdę działa równolegle, jest wykrywanie zdarzeń, a nowoczesny MCU już to zapewnia w dużej mierze równoległym sprzęcie. Tymczasem reszta jest efektywna sekwencyjnie, więc budujesz ultraszybką maszynę stanów, która obserwuje bardzo wolny zegar?
Chris Stratton,
@ChrisStratton: Jeśli istnieje odpowiednia funkcja przerwania zmiany pinów i nie jest ona już używana do czegoś innego, może to uniknąć konieczności ciągłego odpytywania, ale jeśli wiele rzeczy dzieje się jednocześnie, trzeba będzie je przetwarzać sekwencyjnie w dowolnej częstotliwości CPU może je obsłużyć.
supercat
Przetwarzanie sekwencyjne nie stanowi problemu, biorąc pod uwagę ogromne opóźnienie, jakie oświadczenie o problemie nakłada między wejściem a odpowiedzią. I nawet jeśli obecny MCU byłby zbyt zajęty, dodanie jednego do tego celu byłoby ułamkiem kosztów dodania FPGA. Realistycznie jedynym sposobem rozwiązania tego problemu w układzie FPGA jest albo fakt, że jest już taki z zapasowymi wycinkami i kierowanymi do niego sygnałami, albo jako sztuczny projekt w kontekście edukacyjnym lub hobbystycznym.
Chris Stratton