TC Moduł 13: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 132: | Linia 132: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd19.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd19.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Zmienne rejestrowe w języku VHDL opisują zmianę sygnału, czyli zazwyczaj realizują funkcję przerzutnika typu zatrzask (latch). Z tego powodu, nie trzeba, jak to było w AHDL, podtrzymywać zawartości rejestrów ''lda'' i ''ldb''. | ||
|} | |} | ||
Linia 139: | Linia 139: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd20.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd20.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Analogicznie opisane są poszczególne moduły w realizacji strukturalnej. | ||
|} | |} | ||
Linia 146: | Linia 146: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd21.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd21.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Pokazano niektóre przykładowe moduły. | ||
|} | |} | ||
Linia 153: | Linia 153: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd22.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd22.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Obiekty definiowane przez użytkownika czyli komponenty COMPONENT (stałe, typy, podtypy, sygnały, zmienne, funkcje, procedury) umieszcza się w modułach zwanych pakietami PACKAGE. Aby skorzystać z takiego pakietu, należy go zadeklarować. Specjalna biblioteka WORK stanowi zbiór obiektów użytkownika i umieszcza się ją w katalogu bieżącym projektu. W jednostce architektury umieszczone są konkretyzacje zadeklarowanych komponentów (tutaj zadeklarowanych w pakiecie ''my_package''). Przekazywanie sygnałów w komponentach jest poprzez nazwy portów. Możliwe jest też przekazywanie sygnałów przez pozycję w liście sygnałów. | ||
|} | |} | ||
Linia 160: | Linia 160: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd23.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd23.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Moduł pakietu ''my_packege'' zawiera deklaracje komponentów. Jak można zauważyć, instrukcja COMPONENT jest przepisaną jednostką deklaracji ENTITY. | ||
|} | |} | ||
Linia 167: | Linia 167: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd24.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd24.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Automat w układzie sterującym specyfikuje się przez zadeklarowanie typu i wypisaniu wartości, a następnie zadeklarowaniu sygnału o podanym typie. W języku VHDL sposób kodowania stanów automatu można określić na poziomie ustawień kompilatora. Na slajdzie mamy dwie instrukcje współbieżne PROCESS. Pierwsza opisuje przejścia automatu, druga opisuje wyjścia automatu. | ||
|} | |} | ||
Linia 174: | Linia 174: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd25.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd25.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Na tej planszy można zobaczyć inna metodę deklaracji komponentów. Komponenty umieszczane są w jednostce architektury w części deklaracyjnej. | ||
|} | |} | ||
Linia 181: | Linia 181: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd26.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd26.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Język Verilog powstał w latach 80. Jest językiem standardowym, coraz chętniej wykorzystywanym do opisu układów cyfrowych, ponieważ jego składnia jest oparta na elementach najbardziej popularnego języka programowania – języka C. Jest też językiem bardziej elastycznym w porównaniu z językiem VHDL. W przykładach pokazane będą elementy języka Verilog wykorzystane do specyfikacji konwertera bin2bcd. Interfejs układu cyfrowego opisuje moduł module z listą sygnałów wejścia, wyjścia i dwukierukowych. Poniżej występują deklaracje sygnałów wejścia i wyjścia. Na przykład, sygnały ''zegar'' i ''start'' są tego samego typu, a już sygnał ''lb'' jest innego typu, ponieważ dwa pierwsze sygnały są skalarami, a trzeci jest wektorem ośmiobitowym. Dalej deklarowane są zmienne typu ''reg'', czyli zmienne mogące zapamiętać wartość sygnału. Należy zwrócić uwagę, że typ ''reg'' nie jest deklaracją typu przerzutnika, ale w układzie cyfrowym jest realizowany na przerzutnikach. Język Verilog rozróżnia wielkość liter. | ||
|} | |} | ||
Linia 188: | Linia 188: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd27.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd27.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Odpowiednikiem instrukcji PROCESS, w języku Verilog jest instrukcja ''always''. W nawiasie wymieniona jest lista wrażliwości. Atrybut ''posedge'' określa zbocze narastające sygnału. W języku Verilog zmienne należy inicjować. Instrukcja przypisania ''lda = 4'd0''; określa 4-bitową liczbę w systemie dziesiętnym o wartości 0 wpisaną do zmiennej ''lda''. | ||
|} | |} | ||
Linia 195: | Linia 195: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd28.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd28.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Instrukcja łączenia wektorów jest realizowana za pomocą nawiasów {}. Znana z języka C instrukcja przesunięcia << realizuje w przykładzie ''lb_r = lb_r << 1'' operację przesunięcia logicznego w lewo o jeden bit. | ||
|} | |} | ||
Linia 202: | Linia 202: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd29.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd29.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Podobnie jak w języku VHDL, zmienne reagują na zmianę sygnału, czyli realizują funkcję zatrzasku ''latch''. Stąd, nie ma potrzeby podtrzymywania wartości zmiennych. | ||
|} | |} | ||
Linia 209: | Linia 209: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd30.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd30.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Każdy projekt po udanej kompilacji, czyli po usunięciu błędów składni języka, należy zweryfikować. Weryfikację poprawności realizacji dokonuje się na drodze symulacji: funkcjonalnej bądź czasowej. Symulacja czasowa rożni się od funkcjonalnej tym, że na przebiegach odpowiedzi sygnałów uwzględnia się model opóźnieniowy układu dla którego przeprowadzono kompilację. | ||
|} | |} | ||
Linia 216: | Linia 216: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd31.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd31.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Przykładowe specyfikacje składowych modułów w realizacji strukturalnej konwertera bin2bcd. W module multipleksera użyto operatora trójargumentowego ?:, realizującego operację warunkową. W module komparatora pokazano użycie instrukcji ''always'' dla specyfikacji układu kombinacyjnego. | ||
|} | |} | ||
Linia 223: | Linia 223: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd32.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd32.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Przykładowe specyfikacje wielofunkcyjnych rejestrów z wykorzystaniem instrukcji ''cas''e oraz ''if...else''. | ||
|} | |} | ||
Linia 230: | Linia 230: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd33.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd33.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Jak w każdym języku wysokiego poziomu, jedynie podzbiór standardu języka Verilog jest syntetyzowany. W tym przykładzie, kompilator Quartus nie obsługuje dyrektywy ''include''. Pliki wchodzące w skład projektu muszą być w tym samym katalogu. Aby połączyć moduły, należy zadeklarować sygnały typu ''wire''. Typ ''wire'' nie jest elementem pamiętającym, reprezentuje fizyczne połączenia pomiędzy elementami, wartość jest ustalana na podstawie sygnałów zasilających. Konkretyzacje modułów są poprzez zadeklarowane typy modułów, a sygnały przekazywane przez nazwy portów. Na przykład, w instrukcji ''k komp(.a(mu_y), .y(k))''; jest zadeklarowany moduł komp typu ''k'' i do portu a podawany jest sygnał ''mu_y'', a do portu ''y'' – sygnał ''k''. | ||
|} | |} | ||
Linia 237: | Linia 237: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd34.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd34.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|W module sterującym automat zdefiniowany jest za pomocą zmiennej typu ''reg'', a poszczególne stany automatu zadeklarowane są parametrem ''parameter''. | ||
|} | |} | ||
Linia 244: | Linia 244: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd35.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd35.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Automat jest wyspecyfikowany dwoma konstrukcjami ''always''. Jedna opisuje przejścia automatu, jest to część sekwencyjna. Druga opisuje wyjścia, czyli część kombinacyjną. | ||
|} | |} | ||
Linia 251: | Linia 251: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd36.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd36.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Najwyższy w hierarchii moduł ''bin2bcd.v'' łączy układ operacyjny i układ sterujący. | ||
|} | |} | ||
Linia 258: | Linia 258: | ||
{| border="0" cellpadding="4" width="100%" | {| border="0" cellpadding="4" width="100%" | ||
|width="500px" valign="top"|[[Grafika:TC_M13_Slajd37.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:TC_M13_Slajd37.png|thumb|500px]] | ||
|valign="top"| | |valign="top"|Przykładowy ekran pokazujący wynik symulacji konwersji liczby binarnej o wartości 99 na liczbę BCD. Każda cyfra BCD ma wartość równą 9 co daje się łatwo reprezentować za pomocą liczby szesnastkowej. | ||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> |
Aktualna wersja na dzień 01:54, 15 wrz 2006
![]() |
Główna pętla algorytmu jest zrealizowana analogicznie jak w AHDL. Należy zwrócić uwagę, że instrukcja „&” służy do łączenia sygnałów (konkatenacji), a nie jest to operator typu AND. |
![]() |
Analogicznie opisane są poszczególne moduły w realizacji strukturalnej. |
![]() |
Pokazano niektóre przykładowe moduły. |
![]() |
Moduł pakietu my_packege zawiera deklaracje komponentów. Jak można zauważyć, instrukcja COMPONENT jest przepisaną jednostką deklaracji ENTITY. |
![]() |
Na tej planszy można zobaczyć inna metodę deklaracji komponentów. Komponenty umieszczane są w jednostce architektury w części deklaracyjnej. |
![]() |
Podobnie jak w języku VHDL, zmienne reagują na zmianę sygnału, czyli realizują funkcję zatrzasku latch. Stąd, nie ma potrzeby podtrzymywania wartości zmiennych. |
![]() |
Przykładowe specyfikacje wielofunkcyjnych rejestrów z wykorzystaniem instrukcji case oraz if...else. |
![]() |
W module sterującym automat zdefiniowany jest za pomocą zmiennej typu reg, a poszczególne stany automatu zadeklarowane są parametrem parameter. |
![]() |
Automat jest wyspecyfikowany dwoma konstrukcjami always. Jedna opisuje przejścia automatu, jest to część sekwencyjna. Druga opisuje wyjścia, czyli część kombinacyjną. |
![]() |
Najwyższy w hierarchii moduł bin2bcd.v łączy układ operacyjny i układ sterujący. |
![]() |
Przykładowy ekran pokazujący wynik symulacji konwersji liczby binarnej o wartości 99 na liczbę BCD. Każda cyfra BCD ma wartość równą 9 co daje się łatwo reprezentować za pomocą liczby szesnastkowej. |