Author(s): Valery Salauyou, Adam Klimowicz, Tomasz Grześ, Irena Bułatowa
Publisher: Oficyna Wydawnicza Politechniki Białostockiej
Year: 2022
Tabela 1.1. Tablica prawdy sumatora jednobitowego
Tabela 1.2. Słowa kluczowe języka Verilog (wersja z 1995 r.)
Tabela 1.3. Słowa kluczowe języka Verilog w wersji z 2001 r. (niezawarte w wersji z 1995 r.)
Tabela 1.4. Poziomy mocy źródeł sygnałów
Tabela 1.5. Przykłady reprezentacji binarnej liczb całkowitych
Tabela 3.1. Bramkowe prymitywy języka Verilog
Tabela 3.2. Przełącznikowe prymitywy języka Verilog
Tabela 4.1. Wartość sygnału w różnych węzłach dla dwóch źródeł sygnałów
Tabela 5.1. Operatory bitowe
Tabela 5.2. Wyniki operacji bitowych
Tabela 5.3. Operatory redukcji
Tabela 5.4. Przykłady wykorzystania operatorów redukcji
Tabela 5.5. Operatory logiczne
Tabela 5.6. Operatory relacji
Tabela 5.7. Operatory arytmetyczne
Tabela 5.8. Operatory różne
Tabela 5.9. Priorytety operatorów
Tabela 5.10. Rozmiary wyrażeń bitowych
Tabela 13.1. Porównanie funkcji i procedur
Tabela 14.1. Lista symboli formatujących dla procedury $display
Tabela 14.2. Wartości parametru type przy otwieraniu plików
Tabela 14.3. Opis dodatkowych funkcji pracy z plikami
Tabela 16.1. Zbiory wartości opóźnień dla różnej liczby przełączeń sygnału
Tabela 18.1. Konstrukcje języka Verilog wspierane przez syntezator
Tabela 18.2. Typy danych
Tabela 18.3. Instrukcje
Tabela 18.4. Operatory przypisania
Tabela 18.5. Prymitywy
Tabela 18.6. Prymitywy definiowane przez użytkownika (UDP)
Tabela 18.7. Proceduralne operatory i bloki
Tabela 18.8. Procedury i funkcje
Tabela 18.9. Struktury hierarchiczne
Tabela 18.10. Bloki specyfikacji
Tabela 18.11. Systemowe procedury i funkcje
Tabela 18.12. Dyrektywy kompilatora
Rys. 1.1. Schemat jednobitowego sumatora na poziomie bramek logicznych
Rys. 1.2. Realizacja modułu add_1_2 z listingu 1.2: przykład opisu sumatora jednobitowego za pomocą równań logicznych
Rys. 1.3. Realizacja modułu add_1_3 na podstawie listingu 1.3: przykład opisu jednobitowego sumatora za pomocą operatorów proceduralnych
Rys. 1.4. Realizacja modułu add_4 na podstawie listingu 1.4: hierarchiczna struktura sumatora 4-bitowego zbudowanego z czterech instancji sumatora jednobitowego
Rys. 1.5. Wynik symulacji sumatora jednobitowego
Rys. 2.1. Realizacja modułu add_2 dwubitowego sumatora z listingu 2.2 stworzonego z dwóch sumatorów jednobitowych
Rys. 2.2. Realizacja modułów reg_4_1 oraz reg_4_2 4-bitowego rejestru z listingów 2.3 i 2.4
Rys. 2.3. Realizacja modułu wor_wand z listingu 2.5: przykład połączenia wyjść inwerterów za pomocą węzłów wor i wand
Rys. 2.4. Realizacja modułu add_N parametryzowanego sumatora z listingu 2.6: przykład wykorzystania funkcji arytmetycznych i operatora konkatenacji w lewej części operatora
Rys. 2.5. Realizacja modułu buf_8_1 z listingu 2.8: przykład budowy 8-bitowego bufora składającego się z ośmiu jednobitowych prymitywów bufif0
Rys. 3.1. Prymitywy logiczne w pakiecie Quartus
Rys. 3.2. Prymitywy buforowe w pakiecie Quartus
Rys. 3.3. Realizacja prymitywu użytkownika my_mux z listingu 3.1
Rys. 3.4. Realizacja prymitywu użytkownika my_dff z listingu 3.2
Rys. 3.5. Realizacja modułu user_primitives z listingu 3.3
Rys. 4.1. Realizacja przykładu połączenia wyjść bramek za pomocą węzłów różnego typu z listingu 4.1: y1 – wire; y2 – wor; y3 – wand; y4 – tri0; y5 – tri1; y6 – trireg; y7 – supply0; y8 – supply1
Rys. 5.1. Realizacja modułu mult_on_10 z listingu 5.1 wykonującego mnożenie liczby A przez 10 za pomocą operatora przesunięcia
Rys. 5.2. Realizacja modułu inputs_test z listingu 5.2: przykład wykorzystania operatorów redukcji do sprawdzenia czy liczba jedynek w słowie jest parzysta oraz czy wszystkie bity mają wartość 1
Rys. 5.3. Realizacja modułu comp_eq z listingu 5.3: przykład wykorzystania operatorów redukcji NOR do realizacji funkcji równości w komparatorze
Rys. 5.4. Realizacja modułu if_subtraction z listingu 5.4: przykład wykorzystania operacji logicznych podczas realizacji urządzenia sterującego mikrokontrolera
Rys. 5.5. Realizacja modułu comparator z listingu 5.5: przykład wykorzystania operatora relacji do stworzenia parametryzowanego komparatora
Rys. 5.6. Realizacja modułu mux_2_1 z listingu 5.6: przykład wykorzystania operatora warunkowego do stworzenia multipleksera
Rys. 6.1. Realizacja modułu sum_1_1 z listingu 6.1
Rys. 6.2. Realizacja modułu sum_1_2 z listingu 6.2
Rys. 6.3. Realizacja modułu sum_8 z listingu 6.3: przykład 8-bitowego sumatora z wykorzystaniem operacji arytmetycznych
Rys. 6.4. Realizacja modułu simple_ALU z listingu 6.4: przykład wielokrotnego wykorzystania operatora assign z różnymi operacjami przy opisie układu kombinacyjnego
Rys. 7.1. Realizacja modułu maj_3 z listingu 7.1: przykład wykorzystania bloku proceduralnego always do realizacji układu kombinacyjnego kontroli większościowej
Rys. 8.1. Realizacja modułu adder_sen_list_1 z listingu 8.1: wykorzystanie bloku proceduralnego always z listą czułości do opisu jednobitowego sumatora
Rys. 8.2. Realizacja modułu circ_latch z listingu 8.2: powstawanie zatrzasku na wyjściu w przypadku błędu opisu schematu kombinacyjnego
Rys. 8.3. Realizacja modułu adder_sen_list_2 z listingu 8.3
Rys. 8.4. Realizacja modułu circ_no_latch z listingu 8.4: rozwiązanie błędu przy opisie układu kombinacyjnego – zatrzask na wyjściu nie występuje
Rys. 8.5. Realizacja modułu my_DFF_no_blocking z listingu 8.5: przykład realizacji przerzutnika D za pomocą nieblokującego operatora przypisania
Rys. 8.6. Realizacja modułu my_DFF_blocking z listingu 8.6: przykład realizacji przerzutnika D za pomocą operatora przypisania blokującego
Rys. 9.1. Realizacja modułu blocking_in_out z listingu 9.1: przykład przypisania sygnałów w bloku always za pomocą operatora przypisania blokującego
Rys. 9.2. Realizacja modułu blocking_st z listingu 9.8: przykład wykorzystania operatora blokującego przypisania wspólnie z operatorami zarządzania czasem
Rys. 9.3. Realizacja modułu blocking_st_intra z listingu 9.9: przykład wykorzystania operatora blokującego przypisania z wewnętrznym opóźnieniem
Rys. 9.4. Realizacja modułu blocking_assignments z listingu 9.10: przykład przypisania sygnałów w bloku always, czułego na zbocze sygnału za pomocą operatorów blokującego przypisania
Rys. 9.5. Realizacja modułu non_blocking_st z listingu 9.12: przykład wykorzystania operatora przypisania nieblokującego razem z operatorami zarządzania czasem
Rys. 9.6. Realizacja modułu non_blocking_st_intra z listingu 9.13: przykład wykorzystania operatora przypisania nieblokującego z wewnętrznym opóźnieniem
Rys. 9.7. Realizacja modułu non_blocking_assignments z listingu 9.14: przykład przypisania sygnałów w bloku always, czułym na zbocze sygnału synchronizacyjnego, za pomocą operatorów przypisania nieblokującego (porównaj dany przykład z rysunkiem 9.4)
Rys. 9.8. Realizacja modułu not_inputs z listingu 9.2: przykład inwersji wejść
Rys. 9.9. Realizacja modułu gating_outputs z listingu 9.3: połączenie wejść za pomocą bramek różnego typu
Rys. 9.10. Realizacja modułu gating_in_out_1 z listingu 9.4: sekwencyjne połączenie wejść za pomocą bramek logicznych
Rys. 9.11. Realizacja modułu gating_in_out_2 z listingu 9.5: sekwencyjne połączenie wejść za pomocą bramek z wykorzystaniem wewnętrznej zmiennej tymczasowej
Rys. 9.12. Realizacja modułu connect_outs z listingu 9.6: połączenie wyjść inwerterów
Rys. 9.13. Realizacja modułu comb_circuit z listingu 9.7: przykład opisu prostego układu kombinacyjnego
Rys. 10.1. Realizacja modułu adder_mult z listingu 10.1: przykład wykorzystania operatora if do opisu ALU realizującego arytmetyczne operacje dodawania lub mnożenia
Rys. 10.2. Realizacja modułu mux_N_if z listingu 10.2: przykład realizacji szynowego multipleksera za pomocą operatora if
Rys. 10.3. Realizacja modułu mux_N_conditional z listingu 10.3: przykład realizacji szynowego multipleksera za pomocą wyrażenia warunkowego
Rys. 10.4. Realizacja modułu latch_1 z listingu 10.4: realizacja zatrzasku za pomocą operatora if
Rys. 10.5. Realizacja modułu latch_2 z listingu 10.5: wynik błędnego opisu układu kombinacyjnego – na wyjściu schematu zostaje ustawiony zatrzask
Rys. 10.6. Realizacja modułów comb_circuit_1-3 z listingów 10.6-10.8
Rys. 10.7. Realizacja modułu sm_IF z listingu 10.9: przykład opisu funkcji boolowskiej za pomocą operatora if
Rys. 10.8. Realizacja modułów sm_Case1-3 z listingów 10.10-10.12: przykład opisu funkcji boolowskiej za pomocą operatorów case
Rys. 10.9. Realizacja modułu sm_Case4 z listingu 10.13: przykład wykorzystania nieokreśloności do nadania wartości wyjścia w operatorze case
Rys. 10.10. Realizacja modułu decoder z listingu 10.14: przykład wykorzystania nieokreślonej wartości wejść w operatorze casex
Rys. 10.11. Realizacja modułu sm_Case5 z listingu 10.15: przykład wykorzystania znaku „?” przy opisie wartości wejść w operatorze casex
Rys. 10.12. Realizacja modułu count_zero1 z listingu 10.16: przykład wykorzystania operatora for do określenia liczby zer w 4-bitowym słowie
Rys. 11.1. Realizacja modułu use_full_case z listingu 11.1: przykład wykorzystania atrybutu full_case przy operatorze case
Rys. 11.2. Realizacja przykładu z listingu 11.1 bez atrybutu full_case
Rys. 11.3. Realizacja modułu one_hot_assign1 z listingu 11.2: przykład wykorzystania atrybutu parallel_case z operatorem case
Rys. 11.4. Realizacja przykładu z listingu 11.2 bez atrybutu parallel_case
Rys. 11.5. Realizacja modułu one_hot_assign2 z listingu 11.3: przykład jednoczesnego wykorzystania atrybutów full_case oraz parallel_case
Rys. 11.6. Realizacja przykładu z listingu 11.3 z pominięciem atrybutów full_case i parallel_case
Rys. 12.1. Realizacja modułu gray_bin z listingu 12.3: przykład wykorzystania bloku generacji i operatora for do opisu przekształcenia kodu Graya do kodu binarnego
Rys. 13.1. Realizacja modułu ram_model z listingu 13.3: przykład jednoportowej synchronicznej pamięci, przy opisie której wykorzystano funkcję stałą clogb2
Wykaz skrótów
Przedmowa
Wstęp
1. Wprowadzenie do języka Verilog
1.1. Historia języka Verilog
1.2. Pierwszy projekt w języku Verilog
1.2.1. Opis projektu
1.2.2. Symulacja projektu
1.3. Podstawowe elementy języka Verilog
1.3.1. Słowa kluczowe
1.3.2. Identyfikatory
1.3.3. Białe znaki
1.3.4. Komentarze
1.4. Sygnały, sieci, sterowniki
1.4.1. Wartości logiczne
1.4.2. Moc logiczna sygnałów
1.5. Liczby
1.5.1. Reprezentacja liczb całkowitych
1.5.2. Reprezentacja liczb rzeczywistych
1.6. Równoległość języka Verilog
2. Moduły
2.1. Definicje modułów
2.2. Elementy modułów
2.3. Deklaracja portów
2.4. Instancje modułów
2.5. Parametry
2.6. Niejawne przekazywanie parametrów
2.7. Tablice instancji modułów
2.8. Hierarchia modułów i zmiennych
2.9. Obszary hierarchii i zakresy widoczności zmiennych
3. Prymitywy i moduły biblioteczne
3.1. Gdzie można znaleźć gotowe rozwiązanie
3.2. Prymitywy języka Verilog
3.3. Prymitywy definiowane przez użytkownika
4. Typy danych
4.1. Dwie klasy typów danych
4.2. Sieciowe typy danych
4.3. Znaczenie sygnałów sieci
4.4. Zmienne typy danych
4.5. Inne typy danych
4.5.1. Parametry
4.5.2. Parametry lokalne
4.5.3. Parametry bloku specyfikacji
4.5.4. Zmienne generacji
4.5.5. Typ danych zdarzenie
4.5.6. Łańcuchy znaków
4.6. Wybór bitów i pól bitowych
4.7. Wybór elementów tablicy i pól bitowych elementów tablicy
4.8. Deklaracja pamięci
5. Operatory
5.1. Operatory języka Verilog
5.2. Operatory bitowe
5.3. Operatory redukcji
5.4. Operatory logiczne
5.5. Operatory relacji
5.6. Operatory identyczności
5.7. Operatory arytmetyczne
5.8. Operatory różne
5.9. Wykonywanie operacji
5.10. Priorytety operatorów
5.11. Rozmiar wyrażeń bitowych
6. Operator przypisania ciągłego assign
6.1. Przypisania w języku Verilog
6.2. Formaty operatora przypisania ciągłego
6.3. Wykorzystanie operatora przypisania ciągłego
7. Operatory i bloki proceduralne
7.1. Operatory proceduralne initial i always, bloki proceduralne
7.2. Operatory begin-end i fork-join
7.3. Nazwane bloki proceduralne
7.4. Format bloków proceduralnych
8. Zarządzanie czasem
8.1. Operator opóźnienia #
8.2. Operator czułości @
8.3. Operator oczekiwania wait
8.4. Lista czułości
8.5. Lista czułości w układach kombinacyjnych
8.6. Lista czułości w układach sekwencyjnych
9. Operatory przypisania
9.1. Cechy wspólne
9.2. Operator przypisania blokującego „=”
9.2.1. Składnia
9.2.2. Zarządzanie czasem
9.2.3. Opóźnienie wewnętrzne
9.2.4. Cechy syntezy
9.3. Operator przypisania nieblokującego „<=”
9.3.1. Składnia
9.3.2. Zarządzanie czasem
9.3.3. Opóźnienie wewnętrzne
9.3.4. Cechy syntezy
9.4. Zarządzanie czasem w operatorach proceduralnych podczas symulacji
9.5. Operatory proceduralne assign i deassign
9.6. Operatory proceduralne force i release
10. Operatory programowania strukturalnego
10.1. Cechy wspólne
10.2. Operator if-else
10.3. Operator case
10.4. Operatory casez i casex
10.5. Operator for
10.6. Operator while
10.7. Operator repeat
10.8. Operator forever
10.9. Operator disable
10.10. Różnice pomiędzy operatorami wait i while
11. Atrybuty
11.1. Atrybuty w języku Verilog
11.2. Atrybut full_case
11.3. Atrybut parallel_case
12. Bloki generacji
12.1. Bloki generacji języka Verilog
12.2. Składnia bloku generacji
12.3. Operatory generacji
12.3.1. Grupa elementów generacji
12.3.2. Operator if-else
12.3.3. Operator case
12.3.4. Operator for
13. Procedury i funkcje
13.1. Procedury i funkcje w języku Verilog
13.2. Dynamiczne i statyczne procedury i funkcje
13.3. Procedury
13.4. Funkcje
13.5. Funkcje stałe
13.6. Porównanie funkcji i procedur
14. Procedury i funkcje systemowe
14.1. Systemowe procedury i funkcje w języku Verilog
14.2. Systemowe procedury do obsługi tekstu
14.3. Systemowe procedury i funkcje do pracy z plikami
14.3.1. Otwieranie i zamykanie plików
14.3.2. Zapis do pliku
14.3.3. Inne funkcje do pracy na plikach
14.4. Inne systemowe procedury i funkcje
14.4.1. Zarządzanie procesem symulacji
14.4.2. Zarządzanie czasem symulacji
14.4.3. Zmiana wielkości ze znakiem i bez znaku
14.4.4. Zapis i odczyt zmiennych z rejestrów
14.4.5. Ładowanie zawartości pamięci
14.4.6. Konwersja zmiennych typu real na wektor 64-bitowy
14.4.7. Funkcje do pracy z wierszem poleceń
15. Dyrektywy kompilatora
15.1. Dyrektywy kompilatora w języku Verilog
15.2. Określenie wartości jednostki czasu
15.3. Makra
15.4. Dyrektywy kompilacji warunkowej
15.5. Załączenie plików
15.6. Określenie domyślnego typu sieciowego
15.7. Określenie wartości logicznych dla niepodłączonych wejść
15.8. Określenie wykorzystywanych bibliotek
16. Bloki specyfikacji
16.1. Bloki specyfikacji w języku Verilog
16.2. Filtrowanie impulsów
16.3. Test ograniczeń czasowych
17. Konfiguracja projektu
17.1. Konfiguracje
17.2. Bloki konfiguracyjne
17.3. Pliki biblioteczne
17.4. Przykłady konfiguracji projektów
17.4.1. Kod źródłowy projektu
17.4.2. Wykorzystanie konfiguracji zawartej w plikach bibliotecznych
17.4.3. Wykorzystanie operatora default
17.4.4. Wykorzystanie operatora cell
17.4.5. Wykorzystanie operatora instance
17.4.6. Wykorzystanie konfiguracji hierarchicznej
18. Syntezowalne konstrukcje języka Verilog
18.1. Cechy wspólne
18.2. Konstrukcje języka Verilog wspierane przez środowisko Quartus
Podsumowanie
Bibliografia
Spis tabel
Spis rysunków
Streszczenie
Abstract
111.pdf
Strona 2
Strona 3
111.pdf
Strona 2
Strona 3