Sterownik świateł na skrzyżowaniu APSC Specyfikacja: Sygnały świetne dla drogi głównej mają wyższy priorytet tzn. światła dla drogi głównej są domyślnie zielone Od czasu do czasu pojazdy z drogi bocznej nadjeżdżają. Światła musza zmienić się na zielone tylko na czas potrzebny na przejechanie skrzyżowania przez samochody z drogi bocznej. Jak już nie ma samochodów na drodze bocznej to światła dla tej drogi zmieniają się na żółte a potem czerwone przywracając zielone światło na drodze głównej. Istnieje czujnik wykrywający oczekujące samochody na drodze bocznej, który daje sygnał X=1 gdy samochody czekają, X=0 gdy nie ma samochodów. Pomiędzy kolejnymi stanami są opóźnienia, które trzeba dostrajać do potrzeb. S0 S1 S2 S3 S4 Stany Tabela stanów sterownika Zielony Żółty Światła na drodze: głównej Czerwony Czerwony Czerwony bocznej Czerwony Czerwony Czerwony Zielony Żółty
Sterownik świateł na skrzyżowaniu APSC Tabela stanów sterownika Stany Światła na drodze: głównej bocznej S0 zielony czerwony S1 Żółty Czerwony S2 Czerwony Czerwony S3 Czerwony Zielony S4 Czerwony Żółty X=0 S0 X=1 S4 S1 X=0 S3 S2 X=1
Sterownik świateł na skrzyżowaniu APSC `define TRUE 1'b1 `define FALSE 1'b0 `define RED 2'd0 `define YELLOW 2'd1 `define GREEN 2'd2 //DG - Droga Glowna //DB - Droga Boczna //definicje stanow DG DB `define S0 3'd0 //GREEN RED `define S1 3'd1 //YELLOW RED `define S2 3'd2 //RED RED `define S3 3'd3 //RED GREEN `define S4 3'd4 //RED YELLOW //opoznienia `define Y2RDELAY 3 //z zoltego do czerwonego `define R2GDELAY 2 //z czerwonego do zielonego
Sterownik świateł na skrzyżowaniu APSC module sig_control (dg, db, X, clock, clear); //porty output [1:0] dg, db; //2-bitowe wyjscie dla trojstanowych swiatel reg [1:0] dg, db; //deklaracja rejestrow input X; //X=1 oznacza, ze samochody czekaja na drodze bocznej input clock, clear; //zmienne wewnetrzne reg [2:0] state; reg [2:0] next_state; //stan poczatkowy to S0 initial state = `S0; next_state = `S0; dg = `GREEN; db = `RED; //zmiana stanu tylko na narastajacym zboczu zegara always @(posedge clock) state = next_state;
Sterownik świateł na skrzyżowaniu APSC always @(state) //obliczanie wartosci swiatel na obu drogach case(state) `S0: dg = `GREEN; db = `RED; `S1: dg = `YELLOW; db = `RED; `S2: dg = `RED; db = `RED; `S3: dg = `RED; db = `GREEN; `S4: dg = `RED; db = `YELLOW; case
Sterownik świateł c.d. APSC always @(state or clear or X) //automat skonczony if (clear) next_state = `S0; else case(state) `S0: if (X)next_state = `S1; else next_state = `S0; `S1: repeat(`y2rdelay) @(posedge clock); next_state = `S2; `S2: repeat(`r2gdelay) @(posedge clock); next_state = `S3; `S3: if (X) next_state = `S3; else next_state = `S4; `S4: repeat(`y2rdelay) @(posedge clock); next_state = `S0; default: next_state = `S0; case module
Sterownik świateł c.d. APSC module stimulus; //modul testowy wire [1:0] DG_SIG, DB_SIG; reg SAM_NA_DB; reg CLOCK, CLEAR; //konkretyzacja sterownika swiatel sig_control SC(DG_SIG, DB_SIG, SAM_NA_DB, CLOCK, CLEAR); initial //monitoring $monitor($time, "Droga Glowna = %b Droga Boczna = %b Samochody na bocznej = %b", DG_SIG, DB_SIG, SAM_NA_DB); initial //zegar CLOCK = `FALSE; forever #5 CLOCK = ~CLOCK; initial //kasowanie CLEAR = `TRUE; repeat (5) @(negedge CLOCK); CLEAR = `FALSE;
Sterownik świateł na skrzyżowaniu APSC initial //wymuszenie SAM_NA_DB = `FALSE; //na początku nie ma samochodów na bocznej #200 SAM_NA_DB = `TRUE; //w czasie 200 pojawiły się samochody #100 SAM_NA_DB = `FALSE; //po 100 jed. czasu odjechały #200 SAM_NA_DB = `TRUE; //w czasie 500 pojawiły się samochody #100 SAM_NA_DB = `FALSE; //w chwili 600 już odjechały #200 SAM_NA_DB = `TRUE; //w czasie 800 pojawiły się znów samochody #100 SAM_NA_DB = `FALSE; //w chwili 800 już odjechały #100 $stop; module
Sterownik świateł wyniki APSC 0 Droga Glowna = 10 Droga Boczna = 00 Samochody na bocznej = 0 200 Droga Glowna = 10 Droga Boczna = 00 Samochody na bocznej = 1 205 Droga Glowna = 01 Droga Boczna = 00 Samochody na bocznej = 1 235 Droga Glowna = 00 Droga Boczna = 00 Samochody na bocznej = 1 265 Droga Glowna = 00 Droga Boczna = 10 Samochody na bocznej = 1 300 Droga Glowna = 00 Droga Boczna = 10 Samochody na bocznej = 0 305 Droga Glowna = 00 Droga Boczna = 01 Samochody na bocznej = 0 335 Droga Glowna = 10 Droga Boczna = 00 Samochody na bocznej = 0 500 Droga Glowna = 10 Droga Boczna = 00 Samochody na bocznej = 1 505 Droga Glowna = 01 Droga Boczna = 00 Samochody na bocznej = 1 535 Droga Glowna = 00 Droga Boczna = 00 Samochody na bocznej = 1 565 Droga Glowna = 00 Droga Boczna = 10 Samochody na bocznej = 1 600 Droga Glowna = 00 Droga Boczna = 10 Samochody na bocznej = 0 605 Droga Glowna = 00 Droga Boczna = 01 Samochody na bocznej = 0 635 Droga Glowna = 10 Droga Boczna = 00 Samochody na bocznej = 0 800 Droga Glowna = 10 Droga Boczna = 00 Samochody na bocznej = 1 805 Droga Glowna = 01 Droga Boczna = 00 Samochody na bocznej = 1 835 Droga Glowna = 00 Droga Boczna = 00 Samochody na bocznej = 1 865 Droga Glowna = 00 Droga Boczna = 10 Samochody na bocznej = 1 900 Droga Glowna = 00 Droga Boczna = 10 Samochody na bocznej = 0 905 Droga Glowna = 00 Droga Boczna = 01 Samochody na bocznej = 0 935 Droga Glowna = 10 Droga Boczna = 00 Samochody na bocznej = 0
Zadania i funkcje APSC Zadania (tasks) i funkcje to mechanizmy umożliwiające podzielenie dużych behawioralnych projektów na mniejsze kawałki - podprogramy, które mogą być wywoływane w różnych miejscach zamiast powtarzać fragmenty kodu. Funkcje Zadania Mogą udostępniać inne funkcje Zawsze wykonują się w chwili 0 Nie mogą zawierać opóźnień ani sterowania zdarzeniami Muszą posiadać co najmniej jeden argument wejściowy Zawsze zwracają pojedynczą wartość (nie posiadają argumentów typu wyjście lub wej-wyj) Mogą udostępniać zarówno funkcje jak i zadania Mogą wykonywać się w dowolnej chwili Mogą zawierać opóźnienia i sterowanie zdarzeniami Mogą nie mieć argumentów lub ich dowolną ilość zarówno typu wejściowego, wyjściowego lub wej-wyj. Nie zwracają wartości ale dostarczają wartości argumentów typu wyjście lub wej-wyj Funkcje i zadania nie mogą używać zmiennych typów węzłowych ani instrukcji initial i always.
Zadania APSC module operation; parameter delay = 10; reg [15:0] A, B; reg [15:0] AB_AND, AB_OR, AB_XOR; always @(A or B) bitwise_oper(ab_and, AB_OR, AB_XOR, A, B); //definicja zadania bitwise_oper task bitwise_oper; output [15:0] ab_and, ab_or, ab_xor; input [15:0] a, b; #delay ab_ = a & b; ab_or = a b; ab_xor = a ^ b; task module
Zadania APSC module sequence; reg clock; initial init_sequence; always asymmetric_sequence; //definicja zadania inicjującego task init_sequence; clock = 1 b0; task //wywołanie zadania inicjującego //wywołanie zadania skwencera //definicja zadania generującego sekwencję zegara task asymmetric _sequence; #12 clock = 1 b0; #5 clock = 1 b1; #3 clock = 1 b0; #1 clock = 1 b1; task module W tym przykładzie zadania działają bezpośrednio na zmiennej clock zdefiniowanej w module.
Funkcje APSC module parity; reg [31:0] addr; reg parity; //oblicz nową parzystość zawsze gdy zmieni się wartość adresu always @(addr) parity = calc_parity(addr); //wywołanie funkcji $display( obliczoan parzystość = %b, calc_parity(addr)); //definicja funkcji obliczającej parzystość function calc_parity; input [31:0] address; calc_parity = ^address; //xor wszystkich bitów w addr function module
Funkcje APSC module shifter; reg [31:0] addr; reg parity; `define LEFT_SHIFT 1 b0 `define RIGHT_ SHIFT 1 b1 reg [31:0] addr, left_addr, right_addr; reg control; //oblicz wartości przesunięte w prawo i w lewo //zawsze gdy zmieni się wartość adresu always @(addr) left_addr = shift(addr, LEFT_SHIFT); //wywołanie funkcji right_addr = shift(addr, RIGHT_SHIFT); //definicja funkcji shift zwraca 32-bitowa wartość function shift; input [31:0] address; input control; shift = (control == LEFT_SHIFT?(address<<1):(address>>1); function module
Obserwacja przebiegów czasowych Wynikiem symulacji są przebiegi czasowe. Obserwacja i analiza przebiegów czasowych wymaga użycia programu wyświetlającego je. W pakiecie LDV firmy Cadence jest nim Wyświetlacz Przebiegów (Waveform Viewer) stanowiący część większego środowiska analitycznego o nazwie SimVision. Zadania programu przygotowania danych SHM Program zarządzający wynikami z symulacji SHM (Simulation History Manager) jest grupą zadań systemowych służących do sterowania komunikacją między symulacjami Verilog-XL i bazą danych przechowującą dane dla programu wyświetlającego przebiegi czasowe, którym jest SimVision. Oznacza to,że musimy używać SHM jeśli chcemy przygotować wyniki symulacji do oglądania w postaci grafiki. Mamy do dyspozycji następujące zadania systemowe SHM: Zadania SHM $shm_open $shm_probe $shm_close $shm_susp $shm_resume Usługi oferowane przez zadania systemowe SHM Otwarcie bazy danych Specyfikacja sygnałów, których zmiany chcemy notwać w bazie danych Zamknięcie połączenia symulacji z bazą danych Czasowe zawieszenie zapisywania wartości do bazy Wznowienie zapisywania wartości do bazy danych
Zadania systemowe SHM $shm_open Otwarcie bazy danych za pomocą $shm_open $shm_open (["db_name"], [<is_sequence_time>], [<database_size>], [<is_compression>]) Argumenty: "db_name" Nazwa pliku z bazą danych. Jeśli ta nazwa nie jest podana przyjmowana jest domyślna waves.shm w bieżącym katalogu <is_sequence_time> Wyświetlaj wszystkie zdarzenia i przejścia sygnałów zachodzące w tym samy okresie czasu. Wartość 1 włącza tę cechę, 0 (domyslne) wyłącza. <database_size> Specyfikacja maksymalnej wielkości pliku przejść.trn (w bajtach) generowanego przez Verilog-XL. Co najmniej 2MB Wartość rekomowana to 10MB. Jeśli mu braknie to nadpisuje plik przejść. <is_compression> Wartość jeden powoduje kompresowanie pliku.trn generowanego przez Verilog-XL. Wartość domyślna 0 brak kompresji.
Zadania systemowe SHM $shm_probe Wybieranie sygnałów za pomocą $shm_probe $shm_probe( [scope1, "node_specifier1", scope2, "node_specifier2", ] ) Argumenty są nie obowiązkowe, ale nawiasy są konieczne. Brak argumentów oznacza, że notowane będą zmiany wszystkich zmiennych typu input, output i inout w bieżącym module. Argumentami mogą być: scope1, scope2, określenie zakresów (poziomów hierarchii lub urealnień), z których sygnały mają być zapamietywane. Domyślny jest zakres bieżący czuli moduł w którym zanjaduje się zadanie SHM. "node_specifier1", "node_specifier2", Jeden z pięciu znaczników, określających węzły, w których zmiany wartości są odnotowywane w SHM: A All nodes (including inputs, outputs and inouts) of the specified scope. S Inputs, outputs, and inouts of the specified scope, and in all instantiations below it, except inside library cells. C Inputs, outputs, and inouts of the specified scope, and in all instantiations below it, including inside library cells. AS All nodes (including inputs, outputs and inouts) of the specified scope, and in all instantiations below it, except inside library cells. AC All nodes (including inputs, outputs and inouts) in the specified scope and in all instantiations below it, even inside library cells.
Zadania systemowe SHM $shm_probe Zapisywanie zmian wartości wszystkich zmiennych typu input, output, i inout w bieżącym zakresie: $shm_probe(); Zapisywanie zmian wartości we wszystkich węzłach w bieżącym zakresie: $shm_probe( A ); Zapisywanie zmian wartości wszystkich zmiennych typu input, output, i inout w bieżącym zakresie alu i adder: $shm_probe(alu, adder); Zapisywanie zmian wartości wszystkich zmiennych typu input, output, i inout w bieżącym zakresie i poniżej wykluczając komórki biblioteczne. Dodatkowo zapamiętuj zmian wartości we wszystkich węzłach w zakresie top.alu i poniżej, włączając w to biblioteki: $shm_probe( S, top.alu, AC );
Wyświetlanie sygnałów jako graficznych przebiegów Analiza wejściowych i wyjściowych sygnałów w formie graficznej Przykład demonstruje jak stworzyć bazę SHM i wybrane sygnały zapisywać do niej w celu późniejszego analizowania za pomocą przeglądarki przebiegów z pakietu Simvision module test_flop; //moduł testowy dla przerzutnika reg data, clock; flipflop f1 (clock, data, qa, qb); initial clock = 0; data = 0; #10000 $shm_close(); //zamknij bazę po czasie 10000 $finish; initial $shm_open("db1.shm"); //otwarcie bazy SHM o nazwie db1.shm $shm_probe(clock); $shm_probe(data,qa,qb); $shm_probe(f1.nt1); always #100 clock = ~clock; always #300 data = ~data; module Zadanie $shm_probe specyfikuje, które sygnały mają być zapamiętywane w bazie SHM przez podanie nazw węzłów lub hierarchicznych nazw instansów, które zawierają węzły przeznaczone do analizy. Argumentami $shm_probe nie mogą być komórki prymitywne.
Wyświetlanie sygnałów jako graficznych przebiegów //model przerzutnika RS module flipflop (clock, data, qa, qb); input clock,data; output qa, qb; nand #10 nd1 (a, data, clock), nd2 (b, ndata, clock), nd3 (qa, a, qb), nd4 (qb, b, qa); mynot nt1 (ndata, data); module module mynot (out, in); output out; input in; not(out,in); module // mynot Moduł testowany w module z poprzedniego slajdu % verilog test_flop.v flipflop.v //symulacja % ls db1.shm //sprawdzenie czy baza SHM powstała db1.trn db1.dsn % simvision -waves db1.shm //wywołanie przeglądarki i //załadowanie bazy SHM