Systemy wbudowane. Projektowanie systemów wbudowanych na bazie układów CPLD/FPGA Język opisu sprzętu Verilog cz.1



Podobne dokumenty
Verilog HDL. Język Opisu Sprzętu Hardware Description Language Część I. Elementy języka. dr inż. Paweł Tomaszewicz H D L

Język HDL - VERILOG. (Syntetyzowalna warstwa języka) Hardware Description Language Krzysztof Jasiński PRUS PRUS

Programowalne układy logiczne kod kursu: ETD Podstawy języka Verilog W

Projektowanie Scalonych Systemów Wbudowanych VERILOG

Projektowanie scalonych systemów wbudowanych VERILOG. VERLIOG - historia

Język HDL - VERILOG. (Syntetyzowalna warstwa języka) Hardware Description Language Krzysztof Jasiński PRUS PRUS

1 Wstęp. 2 Proste przykłady. 3 Podstawowe elementy leksykalne i typy danych. 6 Opis strukturalny. 7 Moduł testowy (testbench)

Przykładowe pytania z części PSPICE. 1. Podaj zasady tworzenia pliku symulacyjnego. 2. Czy składnia PSPICE jest czuła na wielkość liter? 3.

Laboratorium Podstaw Techniki Cyfrowej

Projektowanie Scalonych Systemów Wbudowanych VERILOG

Projektowanie Scalonych Systemów Wbudowanych VERILOG

Język Verilog w projektowaniu układów FPGA

AHDL - Język opisu projektu. Podstawowe struktury języka. Komentarz rozpoczyna znak i kończy znak %. SUBDESIGN

Tranzystor JFET i MOSFET zas. działania

Układy kombinacyjne 1

Wykład 4. Języki Opisu Sprzętu. Prowadzący: dr inż. Andrzej Skoczeń Współrzędne: D , tel. w ,

Wykład 4. Języki Opisu Sprzętu

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

Sumatory H D L. dr inŝ. Paweł Tomaszewicz Instytut Telekomunikacji Politechnika Warszawska

Wykład 2. Języki Opisu Sprzętu. Prowadzący: dr inż. Andrzej Skoczeń Współrzędne: D , tel. w ,

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Bramki logiczne Podstawowe składniki wszystkich układów logicznych

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Algorytmika i Programowanie VBA 1 - podstawy

Wykład 3. Języki Opisu Sprzętu. Prowadzący: dr inż. Andrzej Skoczeń Współrzędne: D , tel. w ,

Konwencje językowe Verilog-a APSC

Stan wysoki (H) i stan niski (L)

Podstawy działania układów cyfrowych...2 Systemy liczbowe...2 Kodowanie informacji...3 Informacja cyfrowa...4 Bramki logiczne...

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 2. Programowanie komputerowe

Pojedyncze wartości zadeklarowanego typu Ustawiane przed rozpoczęciem symulacji bez moŝliwości

Programowalne układy logiczne kod kursu: ETD Układy kombinacyjne, przypisania, blokujące i nieblokujące cz.2 W

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Projektowanie Urządzeń Cyfrowych

Lista tematów na kolokwium z wykładu z Techniki Cyfrowej w roku ak. 2013/2014

Altera Quartus II. Opis niektórych komponentów dostarczanych razem ze środowiskiem. Opracował: mgr inż. Leszek Ciopiński

Podstawy programowania w języku C

Zadania do wykładu 1, Zapisz liczby binarne w kodzie dziesiętnym: ( ) 2 =( ) 10, ( ) 2 =( ) 10, (101001, 10110) 2 =( ) 10

Struktura i działanie jednostki centralnej

Ogólny schemat prostego formularza: A może lepiej zamiast przycisku opartego o input tak:

Synteza logiczna APSC

Arytmetyka liczb binarnych

Układy reprogramowalne i SoC Implementacja w układach FPGA

Podstawy programowania skrót z wykładów:

Mikrokontroler ATmega32. Język symboliczny

1. ISE WebPack i VHDL Xilinx ISE Design Suite 10.1 VHDL Tworzenie projektu Project Navigator Xilinx ISE Design Suite 10.1 File

Wstęp do Techniki Cyfrowej... Synchroniczne układy sekwencyjne

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Specyfika projektowania Mariusz Rawski

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Logika Temporalna i Automaty Czasowe

Wstęp do informatyki- wykład 2

Literatura. adów w cyfrowych. Projektowanie układ. Technika cyfrowa. Technika cyfrowa. Bramki logiczne i przerzutniki.

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

Podstawy programowania w języku C i C++

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Język AHDL. Synteza strukturalna. dr inŝ. Paweł Tomaszewicz Instytut Telekomunikacji Politechnika Warszawska H D L

12. Wprowadzenie Sygnały techniki cyfrowej Systemy liczbowe. Matematyka: Elektronika:

Układy cyfrowe. Najczęściej układy cyfrowe służą do przetwarzania sygnałów o dwóch poziomach napięć:

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Kurs Verilog cz.1 wstęp

Zmienne, stałe i operatory

Modelowanie liczników w języku Verilog i ich implementacja w strukturze FPGA

Powtórka algorytmów. Wprowadzenie do języka Java.

Sterowniki Programowalne (SP)

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Układy cyfrowe w Verilog HDL. Elementy języka z przykładami. wersja: cz.3

Sposoby projektowania systemów w cyfrowych

Ćwiczenie 01 - Strona nr 1 ĆWICZENIE 01

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Powtórka algorytmów. Wprowadzenie do języka Java.

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

dr inż. Jarosław Forenc

Układy arytmetyczne. Joanna Ledzińska III rok EiT AGH 2011

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

C++ wprowadzanie zmiennych

MATERIAŁY DO ZAJĘĆ II

Część 2. Funkcje logiczne układy kombinacyjne

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

bocznej Tabela stanów sterownika Światła na drodze:

Krótkie przypomnienie

LEKCJA. TEMAT: Funktory logiczne.

f we DZIELNIKI I PODZIELNIKI CZĘSTOTLIWOŚCI Dzielnik częstotliwości: układ dający impuls na wyjściu co P impulsów na wejściu

Logika Temporalna i Automaty Czasowe

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Cw.12 JAVAScript w dokumentach HTML

1 Wstęp. 2 Operatory. 3 Blok always dla układów kombinacyjnych. 4 Instrukcja IF. 5 Instrukcja CASE. 6 Struktury konstrukcji warunkowych

Pracownia elektryczna i elektroniczna. Elektronika cyfrowa. Ćwiczenie nr 5.

Powtórka algorytmów. Wprowadzenie do języka Java.

Laboratorium 1: Podstawy języka c. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Transkrypt:

Systemy wbudowane Projektowanie systemów wbudowanych na bazie układów CPLD/FPGA Język opisu sprzętu Verilog cz.1

System Quartus II Opis projektu Tekstowy (język opisu sprzętu np. Verilog) Graficzny Wykresy czasowe Kompilacja Symulacja Analiza czasowa Programowanie

Nowy projekt Menu File -> New project Wizard

Nadanie nazwy projektu

Dodawanie plików do projektu

Wybór układu programowalnego Dodatkowo w menu Assignments -> Device: - Configuration nie wybierać żadnego Układu - Unused Pins zaznaczyć Opcję As Input tri stated

Kompilacja projektu Menu Processing -> Start Compilation

Wyniki kompilacji

Przypisanie wyprowadzeń zewnętrznych W menu Assignments -> Assign Pins

Powtórna kompilacja - raport Raport po powtórnej kompilacji pozwala stwierdzić prawidłowe przypisanie wyprowadzeń zewnętrznych

Programowanie układu Menu Tools --> Programmer Dalej : Auto Detect Dodać plik z rozszerzeniem *.sof Zaznaczyć configure I kliknąć Start

Język opisu sprzętu Verilog Opisuje układy cyfrowe (trwają prace nad opisem układów analogowych) Opis układu cyfrowego możliwy na poziomie: funkcjonalnym (behavioral), strukturalnym (przesłań międzyrejestrowych RTL, bramkowym - gate level), DataFlow równania boolowskie Sposób opisu układu w Verilog: Bottom-up tradycyjne hierarchiczne projektowanie Top-down możliwe modelowanie i testowanie układu od najwyższego poziomu

Historia Lata '80 potrzeba stworzenia jednego języka do symulacji na rożnych poziomach opisu Język Verilog stworzony przez Phila Moore'a w 1983-4 w Gateway Design Automation wykorzystuje elementy Języków Modula, Stimula, C 1989 Gateway Design Automation (i prawa do Verilog) przejęta przez Cadence rok później język Verilog upubliczniony (public domain) 1992 rozpoczęcie prac nad standaryzowaniem 12.1995 Verilog stał się międzynarodowym standardem IEEE Std.1364-1995 2001 rozszerzenie standardu IEEE Std. 1364-2001 Ostatnie lata Verilog stał się językiem opisu sprzętu HDL SystemVerilog język do opisu i do testowania IEEE Std. 1800-2005

Opis układu cyfrowego Układ cyfrowy może być opisany za pomocą: współbieżnych sygnałów (concurrency) struktury bloków (structure) procedur i komend (procedural statements) zdarzeń w czasie Np sumator 1-bitowy: Równanie boolowskie sumy: s = a xor b xor cin = a b cin Równanie boolowskie przeniesienia: cout = (a and b) or (a and cin) or (b and cin) = (a b) + (a cin) + (b cin)

Opis za pomocą Verilog module suma (a,b,cin,s,cout); // porty wej/wyj input a,b,cin; output s,cout; // ciało funkcji assign s = a ^ b ^ cin; assign cout = (a & b) (a & cin) (b & cin); endmodule

Identyfikatory {[A-Z], [a-z], [0-9], _, $} Nie może zaczynać się od $ lub cyfry [0-9] Przykłady: shiftreg_a busa_index error_condition merge_ab _bus3 n$657 Rozróżnia wielkość liter (case sensitive) myid Myid Nazwa nie może być dłuższa niż 1024 znaki Z przykładu sumatora: a b cin s cout

Komentarze // komentarz do końca linii /* komentarz zamknięty bloku tekstu */ /* Nie można /* zagnieżdżać komentarzy*/ blokowych*/ Białe znaki są ignorowane (znak spacji, tabulacji, nowej linii)

Typy danych W urządzeniach cyfrowych rodzaje danych reprezentują dane zapamiętane oraz przesyłane pomiędzy elementami Wartości sygnałów: 0 wartość logiczna zero lub fałsz 1 wartość logiczna jeden lub prawda x wartość logiczna nieznana z wartość wysokiej impedancji Rozróżnia się dwa rodzaje danych: sieć (net) zmienna (variable) Schemat deklaracji: Type [range] signal_name {,signal_name}

Sieć Sieć (net) reprezentuje fizyczne połączenia pomiędzy elementami Nie jest elementem pamiętającym (wyjątek: trireg) Wartość jest ustalana na podstawie sygnałów zasilających Domyślna wartość portów wej/wyj: wire Jeżeli nie ma połączenia zasilającego, to jest w stanie wysokiej impedancji z (!) Typy sieci: wire, tri węzeł, węzeł trójstanowy supply0, supply1 stała wartość logiczna wand, wor iloczyn, suma na drucie trior, triand, tri0, tri1, trireg module suma (a,b,cin,s,cout); // porty wej/wyj input a,b,cin; output s,cout; wire a,b,c,s,cout; // domyslny typ // ciało funkcji assign s = a ^ b ^ cin; assign cout = (a & b) (a & cin) (b & cin); endmodule

Zmienne Zmienna (variable) jest abstrakcyjnym elementem pamiętającym wartość do czasu następnej zmiany W układzie cyfrowym zmienna realizowana jest jako przerzutnik (ale nie zawsze!) Typy zmiennych: reg (do opisu układów cyfrowych), integer, real, time, realtime (do symulacji) Zmienne inicjowane są wartością nieznaną x (!) Przykład: reg A, C; // deklaracja // przypisania są wewnątrz procesu A = 1; C = A; // C ma wartość logiczną 1 A = 0; // C ma wciąŝ 1 C = 0; // C ma teraz wartość 0

Liczby [sign][size][ radix] value [sign] znak + - [size] liczba bitów zapisana liczbą dziesiętną ['radix] podstawa systemu liczbowego b B liczba dwójkowa o O liczba ósemkowa d D liczba dziesiętna system domyślny h H liczba szesnastkowa value znaki określające wartość 0..9 a..f A..F x X z Z? Liczby bez określonej długości bitowej są zapisywane na 32 bitach 659 // liczba dziesiętna h 837FF // liczba szesnastkowa o7460 // liczba ósemkowa Liczba bez określonej podstawy jest liczbą dziesiętną Nie może być znaku spacji między znakiem apostrofu i podstawy Liczby o określonej długości bitowej: 4'b101, 5'D 3, 3'b01x, 16'hz Liczby ujemne są kodowane w U2

Parametry Parametry przypisują nazwom określone wartości Używa się do pisania kodu bardziej czytelnego, łatwiejszego w modyfikacji, dostosowania do innego projektu Za pomocą parametrów koduje się stany automatu Przykłady: parameter e = 25, f = 9; //stałe 32-bitowe parameter r = 5.7; //stała typu real parameter byte_size = 8, byte_mask = byte_size - 1; parameter average_delay = (r + f) / 2; parameter signed [3:0] mux_selector = 0; // stany automatu parameter [2:0] idle = 3'd0, init = 3'd1, store = 3'd5; Stałe localparam N=4

Wektory Zmienna lub sieć bez zadeklarowanego zakresu range jest skalarem wektorem o długości jednego bitu Zakres range jest częścią typu nie można w jednej deklaracji podać rożnych zakresów Deklaracja szyny danych wire [3:0] busa; reg [1:4] busb; reg [1:0] busc; Liczba po lewej stronie zakresu określa najbardziej znaczący bit MSB Wektor traktowany jako wartość bez znaku Ze znakiem, jeżeli zadeklarowany typu signed lub dołączony do sygnału ze znakiem

Macierze Macierz może składać się z elementów sieci (net) lub zmiennych (variable) typu skalar lub wektor Przykłady deklaracji: reg x[11:0]; // macierz 12 skalarow typu reg wire [0:7] y[5:0]; // macierz 6 wektorow 8-bitowych typu wire reg [31:0] x [127:0]; // macierz 128 wektorow 32 bitowych typu reg reg [7:0] x [127:0], y [63:0]; // dwie macierze wektorow 8-bitowych typu reg Jednowymiarowa macierz z elementami typu reg to jest pamięć (ROM, RAM) Można przypisać wartość dowolnemu n-bitowemu elementowi macierzy (słowu) Nie można przypisać wartości całej lub części pamięci

Operatory Jednoargumentowe (unary) arytmetyczne: +, - redukcji: &, ~&,, ~, ^, ~^ (^~) negacja logiczna:! negacja bitowa: ~ Dwuargumentowe (binary) arytmetyczne: +, -, *, /, % relacyjne: <, >, <=, >=, ==,!=, ===,!=== logiczne: &&, bitowe: &,, ^, ~^ Trojargumentowe (ternary) Warunkowy:?:

Operatory przesunięcia << >> przesunięcie logiczne <<< >>> przesunięcie arytmetyczne W operacji przesunięcia logicznego i arytmetycznego w lewo (<<, <<<) bity uzupełnione są zerami W operacji przesunięcia logicznego w prawo (>>) bity uzupełnione są zerami W operacji przesunięcia arytmetycznego w prawo (>>>) bity uzupełnione są bitem znaku reg [3:0] start, result; reg signed [3:0] start, result; start = 1; start = 4 b1000; result = (start << 2); result = (start >>> 2); //start=0001, result=0100 //start=1000, result=1110

Operatory relacji > większy niż < mniejszy niż >= większy lub równy <= mniejszy lub równy Wynikiem operacji jest skalar Jeżeli w jednym z operatorów jest x lub z to wynikiem jest 1-bitowy skalar x Przykład: 1 > 0 // wynikiem jest 1 b1x1 <= 0 // wynikiem jest x 10 < z // wynikiem jest x

Operatory porównania == równość logiczna wynikiem jest 0, 1 lub x!= nierówność logiczna === równość stanów bitów wynikiem jest 0 lub 1!== nierówność stanów bitów Wynikiem operacji jest skalar W porównaniu logicznym jeżeli występuje x lub z to wynikiem jest 1-bitowy skalar x Przykład: 4 b 1z0x == 4 b 1z0x // wynikiem jest x 4 b 1z0x!= 4 b 1z0x // wynikiem jest x 4 b 1z0x === 4 b 1z0x // wynikiem jest 1 4 b 1z0x!== 4 b 1z0x // wynikiem jest 0

Operatory bitowe & AND OR ^ XOR ^~ ~^ XNOR ~ NOT Jeżeli jeden z operatorów jest krótszy to jest on uzupełniony zerami na najstarszych pozycjach Przykład: a = 4'b1010 d = ~a // 0101 b = 4'b1100 e = a & b // 1000 c = 2'b11 f = b ^ c // 1100 XOR 0011 = 1111

Operatory logiczne && logiczny AND logiczny OR! logiczna negacja Przykład 1: alfa = 237, beta = 0 rega = alpha && beta; // (true AND false) rega jest 0 regb = alpha beta; // (true OR false) regb jest 1 Przykład 2: Użycie nawiasów dla lepszej czytelności a < size-1 && b!= c && index!= lastone (a < size-1) && (b!= c) && (index!= lastone) Przykład 3: Użycie operatora! if (!inword) // częściej używane... if (inword == 0)

Operator warunkowy cond_expr? true_expr : false_expr Przykład mux 4-1: o = (s == 2'b00)? I0 : ((s == 2'b01)? I1 : (s == 2'b10)? I2 : I3 ); Przykład ALU: d = (f==add)? (a+b) : ((f==substract)? (a-b) : ((f==compl)? ~a : ~b));

Operatory łączenia (konkatenacji) { } Łączy dwa lub więcej wektorów Każdy z wektorów musi mieć określoną długość Przykład: {a, b[3:0], w, 3 b101} // odpowiada kolejnej linii {a, b[3], b[2], b[1], b[0], w, 1 b1, 1 b0, 1 b1} Zły {a, 1} // Liczba 1 nie ma określonej długości Przykład powielania: {4{w}} // odpowiada {w, w, w, w} {b, {3{a, b}}} // odpowiada {b, a, b, a, b, a, b} nie może być zerem, x lub z

Specyfikacja układu module module name [(port name{, port name})]; [parameter declarations] [input declarations] [output declarations] [inout declarations] interfejs [wire or tri declarations] [reg or integer declarations] [function or task declarations] [assign continuous assignments] [initial block] [always blocks] [gate instantiations] [module instantiations] endmodule Logika ciało funkcji

Cechy modułu Wszystkie sygnały muszą być zadeklarowane jako: input, output lub inout Domyślnie porty są typu wire nie trzeba dodatkowej deklaracji Wyjście można zadeklarować jako reg Przykłady: module uklad1(we1, we2, wy1, wy2); input [3..0] we1; input we2; output wy1, wy2; reg wy1; module uklad1 ( input [3..0] we1, input we2, output reg wy1, output wy2 );

Równoległość Dwa typy przypisań: Przypisania ciągłe assign identyfikator = wyrazenie; assign s = a ^ b ^ cin; assign cout = (a & b) (a & cin) (b & cin); Przypisanie jest wykonywane, gdy wyrażenie zmieni swoją wartość, niezależnie od kolejności umieszczenia przypisania Przypisanie proceduralne w bloku always s = a ^ b ^ cin; cout = (a & b) (a & cin) (b & cin); Kolejność wykonane zależna od kolejności zapisu, podobnie jak w języku C.

Przypisanie ciągłe Opis układu na poziomie strukturalnym (bramkowym) lub funkcjonalnym Przykładem wyrażeń równoległych są instancje bramek lub tranzystorów, które opisują strukturę układu. W przypadku opisu układu za pomocą sieci bramek o jednym wyjściu (and, or, xor, nand, nor, xnor), pierwszym argumentem na liście jest wyjście bramki, natomiast drugim i ewentualnie kolejnymi argumentami są wejścia. Bramką o jednym wejściu i wielu wyjściach jest bramka not i buf.

Opis funkcjonalny module suma (a,b,cin,s,cout); // porty wej/wyj input a,b,cin; output s,cout; // sygnały // cialo funkcji assign s = a ^ b ^ cin; assign t1 = a & b; // deklaracja niejawna assign t2 = a & cin; assign t3 = b & cin; assign cout = t1 t2 t3; endmodule module suma (a,b,cin,s,cout); input a,b,cin; output s,cout; // sygnały wire t1, t2, t3; // deklaracja jawna // ciało funkcji assign s = a ^ b ^ cin; assign t1 = a & b; assign t2 = a & cin; assign t3 = b & cin; assign cout = t1 t2 t3; endmodule module suma (a,b,cin,s,cout); input a,b,cin; output s,cout; assign s = a ^ b ^ cin, // przypisania t1 = a & b, // tego t2 = a & cin, // samego t3 = b & cin, // typu cout = t1 t2 t3; endmodule

Opis strukturalny module suma (a,b,cin,s,cout); // porty wej/wyj input a,b,cin; output s,cout; // ciało funkcji xor(s, a, b, cin); and(t1, a, b); // deklaracja niejawna and(t2, a, cin); // dla t1, t2 i t3 and(t3, b, cin); or(cout, t1, t2, t3); endmodule module suma (a,b,cin,s,cout); // porty wej/wyj input a,b,cin; output s,cout; // ciało funkcji xor(s, a, b, cin); and(t1, a, b), // deklaracja tego (t2, a, cin), // samego (t3, b, cin); // typu or(cout, t1, t2, t3); endmodule

Przypisania proceduralne Przypisania proceduralne są wykonywane sekwencyjnie w kolejności umieszczenia ich w kodzie (w odróżnieniu od równoległego wykonywania przypisań ciągłych), podobnie jak ma to miejsce w językach programowania, na przykład w języku C. Przypisania proceduralne muszą być umieszczone wewnątrz instrukcji always lub initial. Za pomocą przypisań proceduralnych możemy opisać działanie układu cyfrowego na poziomie funkcjonalnym korzystając z instrukcji sterujących jak case czy if.

Przypisanie proceduralne opis funkcjonalny module suma (a,b,cin,s,cout); // porty wej/wyj input a,b,cin; output reg s,cout; // przypisania proceduralne always@* begin s = a ^ b ^ cin; cout = (a & b) (a & cin) (b & cin); end endmodule

Bloki proceduralne Verilog ma dwa typy bloków proceduralnych Instrukcja always Służy do opisu układu Jest syntetyzowalna Posiadać listę zmiennych (czułości), której zmiana wartości aktywuje wykonanie bloku Lista czułości może być pominięta Instrukcja initial - Służy do inicjacji zmiennych w programach testujących - Nie jest syntetyzowalna

Instrukcja always Instrukcja always rozpoczyna się w czasie = 0 Może być wykonywana wielokrotnie Przykład always begin // begin/end do wykonania grupy instrukcji instrukcja_1; instrukcja_2; // wykonana po instrukcja_1 end

Zdarzenia Służą do kontroli/wykrycia zdarzeń w czasie Używane np. w instrukcji always @ <zdarzenie> @(a or b) // reaguje na zmiany sygnału a lub b (lista czułości) @(a, b) @(posedge clk) // reaguje zboczem narastającym @(negedge clk) // reaguje zboczem opadającym @* // Verilog-2001 : lista czułości wszystkich sygnałów układu kombinacyjnego

Przypisania proceduralne Przypisanie blokujące, jak zmienna w języku C [variable_name] = [expresion] Przypisanie nieblokujące [variable_name] <= [expresion] Zasady użycia: Blokujące dla opisu układów kombinacyjnych Nieblokujące dla układów sekwencyjnych W jednym bloku always nie umieszczamy obu typów przypisań

Przypisanie blokujące i nieblokujące module block (x1, x2, x3, clock, f, g); input x1, x2, x3, clock; output f, g; reg f, g; always @(posedge clock) begin f = x1 & x2; g = f x3; end endmodule module nonblock (x1, x2, x3, clock, f, g); input x1, x2, x3, clock; output f, g; reg f, g; always @(posedge clock) begin f <= x1 & x2; g <= f x3; end endmodule

Przypisania blokujące i nieblokujące dla układów kombinacyjnych always@(*) begin f = a1 & a0; f = f (a2 & a1); end otrzymujemy równanie f=a1a0 + a2a1 always@(*) begin f <= a1 & a0; f <= f (a2 & a1); end ostatnie przypisanie nadpisuje poprzednie otrzymujemy f = f +a2a1 funkcja kombinacyjna ma sprzężenie zwrotne! brak realizacji!

Przypisania proceduralne i ciągłe dla układów kombinacyjnych Przykład: a & b & c module funkcja_and(a,b,c,y); input a,b,c; output reg y; always@* begin y = a; y = y & b; y = y & c; end endmodule Poprawna realizacja w sprzęcie module funkcja_and(a,b,c,y); input a,b,c; output reg y; assign y = a; assign y = y & b; assign y = y & c; endmodule Brak realizacji w sprzęcie sprzężenie zwrotne w układzie kombinacyjnym!