Sterownik świateł na skrzyżowaniu APSC

Transkrypt

Sterownik świateł na skrzyżowaniu APSC
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.
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
Sterownik świateł na skrzyżowaniu APSC
Tabela stanów sterownika
Stany
Światła na drodze:
głównej
X=0
bocznej
S0
zielony
czerwony
S1
Żółty
Czerwony
S2
Czerwony
Czerwony
S3
Czerwony
Zielony
S4
Czerwony
Żółty
S0
X=1
S4
S1
X=0
S3
X=1
S2
Sterownik świateł na skrzyżowaniu APSC
`define
`define
`define
`define
`define
TRUE
FALSE
RED
YELLOW
GREEN
1'b1
1'b0
2'd0
2'd1
2'd2
//DG - Droga Glowna
//DB - Droga Boczna
//definicje stanow
`define S0
3'd0
`define S1
3'd1
`define S2
3'd2
`define S3
3'd3
`define S4
3'd4
DG
//GREEN
//YELLOW
//RED
//RED
//RED
DB
RED
RED
RED
GREEN
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
begin
state = `S0;
next_state = `S0;
dg = `GREEN;
db = `RED;
end
//zmiana stanu tylko na narastajacym zboczu zegara
always @(posedge clock)
state = next_state;
Sterownik świateł na skrzyżowaniu APSC
always @(state)
begin
case(state)
`S0: begin
dg =
db =
end
`S1: begin
dg =
db =
end
`S2: begin
dg =
db =
end
`S3: begin
dg =
db =
end
`S4: begin
dg =
db =
end
endcase
end
//obliczanie wartosci swiatel na obu drogach
`GREEN;
`RED;
`YELLOW;
`RED;
`RED;
`RED;
`RED;
`GREEN;
`RED;
`YELLOW;
Sterownik świateł
c.d.
APSC
always @(state or clear or X)
//automat skonczony
begin
if (clear) next_state = `S0;
else
case(state)
`S0: if (X)next_state = `S1;
else next_state = `S0;
`S1: begin
repeat(`Y2RDELAY) @(posedge clock);
next_state = `S2;
end
`S2: begin
repeat(`R2GDELAY) @(posedge clock);
next_state = `S3;
end
`S3: if (X) next_state = `S3;
else next_state = `S4;
`S4: begin
repeat(`Y2RDELAY) @(posedge clock);
next_state = `S0;
end
default: next_state = `S0;
endcase
end
endmodule
Sterownik świateł
module stimulus;
wire [1:0] DG_SIG, DB_SIG;
reg SAM_NA_DB;
reg CLOCK, CLEAR;
c.d.
APSC
//modul testowy
//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
begin
CLOCK = `FALSE;
forever #5 CLOCK = ~CLOCK;
end
initial
//kasowanie
begin
CLEAR = `TRUE;
repeat (5) @(negedge CLOCK);
CLEAR = `FALSE;
end
Sterownik świateł na skrzyżowaniu APSC
initial
//wymuszenie
begin
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;
end
endmodule
Sterownik świateł wyniki
0 Droga Glowna = 10
200 Droga Glowna = 10
205 Droga Glowna = 01
235 Droga Glowna = 00
265 Droga Glowna = 00
300 Droga Glowna = 00
305 Droga Glowna = 00
335 Droga Glowna = 10
500 Droga Glowna = 10
505 Droga Glowna = 01
535 Droga Glowna = 00
565 Droga Glowna = 00
600 Droga Glowna = 00
605 Droga Glowna = 00
635 Droga Glowna = 10
800 Droga Glowna = 10
805 Droga Glowna = 01
835 Droga Glowna = 00
865 Droga Glowna = 00
900 Droga Glowna = 00
905 Droga Glowna = 00
935 Droga Glowna = 10
Droga Boczna = 00
Droga Boczna = 00
Droga Boczna = 00
Droga Boczna = 00
Droga Boczna = 10
Droga Boczna = 10
Droga Boczna = 01
Droga Boczna = 00
Droga Boczna = 00
Droga Boczna = 00
Droga Boczna = 00
Droga Boczna = 10
Droga Boczna = 10
Droga Boczna = 01
Droga Boczna = 00
Droga Boczna = 00
Droga Boczna = 00
Droga Boczna = 00
Droga Boczna = 10
Droga Boczna = 10
Droga Boczna = 01
Droga Boczna = 00
APSC
Samochody na bocznej = 0
Samochody na bocznej = 1
Samochody na bocznej = 1
Samochody na bocznej = 1
Samochody na bocznej = 1
Samochody na bocznej = 0
Samochody na bocznej = 0
Samochody na bocznej = 0
Samochody na bocznej = 1
Samochody na bocznej = 1
Samochody na bocznej = 1
Samochody na bocznej = 1
Samochody na bocznej = 0
Samochody na bocznej = 0
Samochody na bocznej = 0
Samochody na bocznej = 1
Samochody na bocznej = 1
Samochody na bocznej = 1
Samochody na bocznej = 1
Samochody na bocznej = 0
Samochody na bocznej = 0
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
Mogą udostępniać zarówno funkcje jak i
zadania
Zawsze wykonują się w chwili 0
Mogą wykonywać się w dowolnej chwili
Nie mogą zawierać opóźnień ani
sterowania zdarzeniami
Mogą zawierać opóźnienia i sterowanie
zdarzeniami
Muszą posiadać co najmniej jeden
argument wejściowy
Mogą nie mieć argumentów lub ich
dowolną ilość zarówno typu wejściowego,
wyjściowego lub wej-wyj.
Zawsze zwracają pojedynczą wartość (nie
posiadają argumentów typu wyjście 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
module operation;
...
parameter delay = 10;
reg [15:0] A, B;
reg [15:0] AB_AND, AB_OR, AB_XOR;
always @(A or B)
begin
bitwise_oper(AB_AND, AB_OR, AB_XOR, A, B);
end
...
//definicja zadania bitwise_oper
task bitwise_oper;
output [15:0] ab_and, ab_or, ab_xor;
input [15:0] a, b;
begin
#delay ab_end = a & b;
ab_or = a | b;
ab_xor = a ^ b;
end
endtask
...
endmodule
APSC
Zadania
module sequence;
reg clock;
...
initial
init_sequence;
always
asymmetric_sequence;
...
APSC
//wywołanie zadania inicjującego
//wywołanie zadania skwencera
//definicja zadania inicjującego
task init_sequence;
clock = 1’b0;
endtask
//definicja zadania generującego sekwencję zegara
task asymmetric _sequence;
begin
#12 clock = 1’b0;
#5 clock = 1’b1;
#3 clock = 1’b0;
#1 clock = 1’b1;
W tym przykładzie zadania działają
end
bezpośrednio na zmiennej clock
endtask
...
zdefiniowanej w module.
endmodule
Funkcje
APSC
module parity;
reg [31:0] addr;
reg parity;
...
//oblicz nową parzystość zawsze gdy zmieni się wartość adresu
always @(addr)
begin
parity = calc_parity(addr);
//wywołanie funkcji
$display(”obliczoan parzystość = %b”, calc_parity(addr));
end
...
//definicja funkcji obliczającej parzystość
function calc_parity;
input [31:0] address;
calc_parity = ^address; //xor wszystkich bitów w addr
endfunction
...
endmodule
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)
begin
left_addr = shift(addr, ‘LEFT_SHIFT); //wywołanie funkcji
right_addr = shift(addr, ‘RIGHT_SHIFT);
end
...
//definicja funkcji shift – zwraca 32-bitowa wartość
function shift;
input [31:0] address;
input control;
shift = (control == ‘LEFT_SHIFT ?(address<<1):(address>>1);
endfunction
...
endmodule
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
Usługi oferowane przez zadania systemowe SHM
$shm_open
Otwarcie bazy danych
$shm_probe
Specyfikacja sygnałów, których zmiany chcemy notwać w bazie
danych
$shm_close
Zamknięcie połączenia symulacji z bazą danych
$shm_suspend
Czasowe zawieszenie zapisywania wartości do bazy
$shm_resume
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ść
rekomendowana 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
begin
clock = 0; data = 0;
#10000 $shm_close();
//zamknij bazę po czasie 10000
$finish;
end
initial
begin
$shm_open("db1.shm"); //otwarcie bazy SHM o nazwie db1.shm
$shm_probe(clock);
Zadanie $shm_probe specyfikuje, które sygnały
$shm_probe(data,qa,qb);
mają być zapamiętywane w bazie SHM przez
$shm_probe(f1.nt1);
podanie nazw węzłów lub hierarchicznych nazw
end
always #100 clock = ~clock; instansów, które zawierają węzły przeznaczone
do analizy. Argumentami $shm_probe nie mogą
always #300 data = ~data;
być komórki prymitywne.
endmodule
Wyświetlanie sygnałów jako graficznych
przebiegów
//model przerzutnika RS
module mynot (out, in);
module flipflop (clock, data, qa, qb); output out;
input clock,data;
input in;
output qa, qb;
not(out,in);
nand #10 nd1 (a, data, clock),
endmodule // mynot
nd2 (b, ndata, clock),
nd3 (qa, a, qb),
nd4 (qb, b, qa);
Moduł testowany w module
mynot nt1 (ndata, data);
z poprzedniego slajdu
endmodule
% 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