380 likes | 595 Views
VHDL. Today, Verilog HDL is an accepted IEEE standard. In 1995, the original standard IEEE 1364-1995 was approved. IEEE 1364-2001 is the latest Verilog HDL standard that made significant improvements to the original standard. VHDL, Verilog. VHDL – bardziej podobny do ADA, Pascal
E N D
VHDL • Today, Verilog HDL is an accepted IEEE standard. In 1995, the original standard IEEE 1364-1995 was approved. IEEE 1364-2001 is the latest Verilog HDL standard that made significant improvements to the original standard
VHDL, Verilog • VHDL – bardziej podobny do ADA, Pascal • Verilog – bardziej podobny do C • Większość firm US używa Verilog • Większość firm europejskich + Intel + Texas Instruments używa VHDL • VHDL jest lepiej wyposażony do tworzenia złożonych, zmieniających się projektów
Cztery poziomy abstrakcji opisu • Behawioralny (algorytmiczny) • Ścieżka danych • (Strukturalny) Poziom bramek (Gate Level) • Poziom przełącznikowy – zależny od technologii programowalnego układu
RTL, Synteza • Mieszanka stylu behawioralnego i ścieżki danych, to tzw. RTL – Register Transfer Level • W trakcie syntezy następuje Przejście z RTL na Gate Level – poziom bramek • Im wyższy poziom abstrakcji, tym bardziej niezależny od implementacji i elastyczny projekt
Przykład module ripple_carry_counter(q, clk, reset); output [3:0] q; input clk, reset; T_FF tff0(q[0],clk, reset); T_FF tff1(q[1],q[0], reset); T_FF tff2(q[2],q[1], reset); T_FF tff3(q[3],q[2], reset); endmodule
Przykład module T_FF(q, clk, reset); output q; input clk, reset; wire d; D_FF dff0(q, d, clk, reset); not n1(d, q); endmodule
Przykład module D_FF(q, d, clk, reset); output q; input d, clk, reset; reg q; always @(posedge reset or negedge clk) if (reset) q <= 1'b0; else q <= d; endmodule
Test bench module stimulus; reg clk; reg reset; wire[3:0] q; ripple_carry_counter r1(q, clk, reset); initial clk = 1'b0; always #5 clk = ~clk; initial begin reset = 1'b1; #15 reset = 1'b0; #180 reset = 1'b1; #10 reset = 1'b0; #20 $finish; end initial $monitor($time, " Output q = %d", q); endmodule
Notacja • Zapis liczby z rozmiarem: <rozmiar> '<format bazy> <liczba> • Przykłady:4'b1111 12'habc 16'd255
Notacja • Liczby bez rozmiaru: 23456 // domyślnie – 32 bity 'hc3 'o21
Operatory • a = ~ b; // jednoargumentowe • a = b && c; // dwuargumentowe • a = b ? c : d; // trójargumentowe
Operatory • arytmetyczne: + - * / % (mod) • relacyjne: > >= < <= == != • logiczne: && (and) || (or) • bitowe: & (and) | (or) ^ (xor) ^~ (not-xor) • przesunięcia bitowe: << (shl) >> (shr)
Operatory • Warunkowy A ? B : C (jeśli warunek A spełniony, to wartość B, w przeciwnym wypadku – wartość C) • Sklejenie: { A, B, C } • Powtórzenie N razy: { N{A} }
Wartości logiczne • Wartości: 0, 1, x, z • Przykład: strong1, weak0
Wire, reg • W VHDL – signal • W Verilog: • wire – połączenie między blokami w opisie strukturalnym • reg – zmienna (alokacja pamięci do przechowywania jakiejś wartości) • Deklaracje: np. • reg reset; • wire a;
Wektory • W VHDL – tablice bitów • W Verilog – wektory: • wire a; • wire [7:0] bus; • wire [31:0] busA,busB,busC; • reg [0:40] virtual_addr;
Selekcja fragmentu wektora busA[7] • bus[2:0]
Selekcja fragmentu wektora • Normalna: • busA[7] • bus[2:0] • Ze zmienną: [<bit_pocz>{+|-}:<szer>] : • data2[31-:8]; //start=31, szer=8 => data[24:31] • data2[24+:8]; //start=24, szer=8 => data[24:31]
Selekcja fragmentu wektora • Bit startowy może być zmienną: for (j=0; j<=31; j=j+1) byte = data1[(j*8)+:8]; data1[(byteNum*8)+:8] = 8'b0; • Oczywiście możliwe w VHDL: pamiec(conv_integer(addr))
Typy danych • Typy proste: • Integer, • Real, • Time • Tablice: integer count[0:7]; reg bool[31:0]; time chk_point[1:100][0:255];
Stałe • parameter port_id = 5; • parameter cache_line_width = 256;
Stałe • Deklaracja w module: • parameter port_id = 5; • parameter cache_line_width = 256; • Nadanie wartości w instancji modułu: defparam (jak generic map w VHDL) • Parametr, który nie podlega defparam: localparam
Moduł Verilog • Definicja bloku, odpowiada parze entity/architecture • Lista wejść/wyjść – jak deklaracja port w entity • Pozostałe instrukcje – jak wnętrze architekture
Moduł Verilog • Jednak moduł jest jedynie szablonem bloku • Musi nastąpić deklaracja instancji • Musi więc ostatecznie wystąpić strukturalny poziom specyfikacji
Moduł – deklaracja portów • Poza wyliczeniem portów w nagłówku, deklaracja kierunków: module SR_latch(Q, Qbar, Sbar, Rbar); output Q, Qbar; input Sbar, Rbar; //inout xx; nand n1(Q, Sbar, Qbar); nand n2(Qbar, Rbar, Q); endmodule
Opis strukturalny • Lista połączeń: • Wg kolejności: • Z nazwami:
Opis ścieżką danych • Składnia: przypisanie ::= assign [siła] [opóźn] lista_przypisań ; lista_przypisań ::= elem_przyp { , elem_przyp } elem_przyp ::= l_strona = wyrażenie • Przykłady: • assign addr[15:0] = addr1_bits[15:0] ^ addr2_bits[15:0]; • assign {c_out, sum[3:0]} = a[3:0] + b[3:0] + c_in; • wire #10 out = in1 & in2;
Opis behawioralny • Odpowiednik procesu: struktury always, initial • Przykład: module clock_gen (output reg clock); initial clock = 1'b0; always #10 clock = ~clock; initial #1000 $finish; endmodule
Lista czułości always @( reset, clock, d) begin if (reset) q = 1'b0; else if(clock) q = d; end
Egzekucja sekwencyjna i równoległa • Przetwarzanie sekwencyjne: begin .. end • Przetwarzanie równoległe: fork .. join