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ć):
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?
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.
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!
Odpowiedzi:
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.
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.
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.
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.
źródło
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:
(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).
źródło
źródło
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:
(poza
process
lubfunction
, które jednoznacznie oznaczają go jako sekwencyjne), to zakodowałeś fakt, że:x
,y
,z
,a
Ib
są przewodya
ib
są sygnałami wejściowymix
jest podłączony do wyjściaor
obwodu, który przyjmujea
ib
jako wejścieŁatwo jest zobaczyć, jak to będzie syntetyzowany do rzeczywistego sprzętu, a że
x
iy
oceniane są w tym samym czasie.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:
a
lubb
zmienione? Tak? Hej,x
zależy oda
. Zaktualizujmyx
.y
zależy również oda
. Zaktualizuj to również.z
zależy odx
. Zaktualizuj, ponieważx
został zaktualizowany.x
zależy od (a
lubb
) zostało zaktualizowane? Nie? To samo dotyczyy
iz
. 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 x
doprowadziłoby do nieskończonej rekurencji symulacji. Symulatory można po prostu odciąć po określonej głębokości.x <= 0; x <= 1
prowadzi do błędu (zwarcie). Jest to jeden z powodów, dla którychstd_logic
istnieje.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.
źródło
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.
źródło
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:
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.
źródło