Transcript Stratix II Architecture
Język HDL - VERILOG
Hardware Description Language
(Syntetyzowalna
warstwa języka)
Krzysztof Jasiński 2009 PRUSn_W6
VERILOG Przegląd zagadnień
Krzysztof Jasiński 2009 PRUSn_W6
Wprowadzenie do języka
Reprezentacja układu cyfrowego w Verilogu
opis strukturalny elementy + połączenia opis behawioralny – funkcja jako zachowanie
Podstawowe elementy i konstrukcje języka
moduł, instrukcje współbieżne i proceduralne instancja (powielanie), struktura hierachiczna wartości sygnałów, węzły i typy węzłów zapis wektorowy, parametry, sieci i zmienne operacje arytmetyczne i reprezentacja liczb operatory w VERILOGu
I T P W Krzysztof Jasiński 2009 PRUSn_W6 3
Opis strukturalny
I T P W
Elementy konstrukcji: Zbiór prymitywów, odpowiadających typowym bramkom logicznym bramka => nazwy funkcji, wyjścia i wejść np. 2-we AND and (y, x1, x2) // y – wyjście, x1, x2 - wejścia 4-we OR NOT or (y, x1, x2, x3, x4) not (y, x) Specyfikacja (forma opisu): moduł – zawiera instrukcje i wyrażenia definiujące układ, wejścia i wyjścia (porty), sygnały, połączenia jawne i ukryte; nazwy modułów i sygnałów muszą zaczynać się literą i mogą zawierać dowolną literę lub liczbę plus znaki „_” i $ VERILOG rozróżnia wielkość liter znak „ // ” poprzedza komentarz (do końca linii)
Krzysztof Jasiński 2009 PRUSn_W6 4
Opis strukturalny
Przykład:
x
1
x
2
f x
3
Rys. 2.30. Prosta funkcja logiczna (mux2-1) I T P W Krzysztof Jasiński 2009 PRUSn_W6 5
Opis strukturalny
module
example1 (x1, x2, x3, f);
input
x1, x2, x3;
output
f;
and
(g, x1, x2);
not
(k, x2);
and
(h, k, x3);
or
(f, g, h);
endmodule I T P W Krzysztof Jasiński
Rys. 2. 31. Opis w Verilog’u układu z rys. 2.30.
2009 PRUSn_W6 6
Opis strukturalny
module
example2 (x1, x2, x3, x4, f, g, h);
input
x1, x2, x3, x4;
output
f, g, h;
and
(z1, x1, x3);
and
(z2, x2, x4);
or
(g, z1, z2);
or
(z3, x1, ~x3);
or
(z4, ~x2, x4);
and
(h, z3, z4);
or
(f, g, h);
I T P W endmodule
Rys. 2.32. Opis w VERILOGu układu o 4-wejściach
Krzysztof Jasiński 2009 PRUSn_W6 7
Opis strukturalny
g f h
I T P W Rys. 2.33. Schemat układu opisanego kodem z rys. 2.32
Krzysztof Jasiński 2009 PRUSn_W6 8
Opis behawioralny
Opis strukturalny przy użyciu prymitywów nieefektywny dla dużych układów!
alternatywa – bardziej abstrakcyjny opis za pomocą wyrażeń logicznych i konstrukcji programowych (instrukcji i przypisań) definicja funkcji za pomocą równań – słowo kluczowe assign określa przypisania ciągłe (typ instrukcji współbieżnej), które są realizowane równolegle, bez względu na porządek występowania zachowanie układu może być zdefiniowane za pomocą instrukcji if-else (typ instrukcji proceduralnej), której konstrukcja znajduje się wewnątrz bloku always blok ten może zawierać wiele instrukcji, przy czym są one realizowane ściśle w kolejności występowania I T P W w bloku always po symbolu @ w nawiasach znajduje się ciąg sygnałów (lista wrażliwości): instrukcje wewnątrz bloku są wykonywane tylko wtedy, gdy zmienia się sygnał z tej listy Krzysztof Jasiński 2009 PRUSn_W6 9
Opis behawioralny
module
example3 (x1, x2, x3, f);
input
x1, x2, x3;
output
f ;
assign
f = (x1 & x2) | (~x2 & x3); // symbol ~ (tylda) oznacza negację
endmodule Rys. 2.34. Specyfikacja układu z rys. 2.30 z użyciem przypisania ciągłego I T P W Krzysztof Jasiński 2009 PRUSn_W6 10
Opis behawioralny
module
example4 (x1, x2, x3, x4, f, g, h);
input
x1, x2, x3, x4;
output
f, g, h;
assign
g = (x1 & x3) | (x2 & x4);
assign
h = (x1 | ~x3) & (~x2 | x4);
assign
f = g | h;
endmodule Rys. 2.35. Specyfikacja układu z rys. 2.33 z użyciem przypisania ciągłego I T P W Krzysztof Jasiński 2009 PRUSn_W6 11
Opis behawioralny
// Specyfikacja behawioralna module
example5 (x1, x2, x3, f);
input
x1, x2, x3;
output
f ;
reg
f ;
// zmienna dla przypisań w instrukcjach proceduralnych always
@(x1 or x2 or x3)
if
(x2 == 1) f = x1;
else
f = x3;
endmodule Rys. 2.36. Opis układu z rys. 2.30 z użyciem instrukcji if-else I T P W Krzysztof Jasiński 2009 PRUSn_W6 12
Elementy języka
Sygnały
– deklarowane jako typ
net
lub
variable
odnosi się do połączeń punktów układu; , termin
net
Identyfikatory
– nazwy zmiennych i innych elementów języka, mogą się składać z dowolnych liter lub cyfr i znaków „ _ ” i $;
Wartości sygnałów, liczby i parametry
– pojedyncze sygnały mogą przyjmować cztery wartości:
0
– wartość logiczna 0
1
– wartość logiczna 1
z
– tri-state (stan wysokiej impedancji)
x
– wartość nieznana
I T
Wartości zmiennych wektorowych są określone za pomocą stałych o postaci: [
size
][‘
radix
]
constant
, gdzie
size
jest liczbą bitów stałej, a
radix
podstawą systemu liczbowego
P W Krzysztof Jasiński 2009 PRUSn_W6 13
Elementy języka
Radix
– podstawa może być: d = dziesiętna b = binarna h = heksadecymalna o = oktalna Jeśli podstawa nie jest określona, to domyślnie jest dziesiętna
I T P W
Gdy
size
określa większą liczbę bitów niż potrzebna do reprezentacji stałej, to uzupełnia się ją zerami
Przykłady: 0
liczba 0
10
‘b10 ‘h10 4’b100 dziesiętna liczba 10 binarna liczba 10 = (2) 10 heksadecymalna liczba 10 = (16) binarna liczba 0100 = (4) 10 10 4’bx nieznana 4-bitowa liczba xxxx
Krzysztof Jasiński 2009 PRUSn_W6 14
Elementy języka
Parametr
wiąże nazwę identyfikatora ze stałą Przykłady deklaracji:
parameter
n = 4;
parameter
S0 = 2’b00, S1 = 2’b01, S3 = 2’b11; Identyfikator n może być użyty w miejsce liczby 4, nazwę S0 można podstawić w miejsce wartości 2’b00 itd..
Ważnym zastosowaniem parametrów jest jest parametryzowanie podukładów
I T P W Krzysztof Jasiński 2009 PRUSn_W6 15
Elementy języka
Typy sieci i zmiennych Sieć (Net)
reprezentuje węzeł w układzie, do syntezy stosuje się dwa typy:
wire
i
tri
Typ
wire
stosuje się do połączeń wyjść jednego elementu logicznego z wejściami innego Przykład deklaracji typu skalar
wire
(dla pojedynczych węzłów):
wire
x;
I T P W
wire
Cin, AddSub; Oraz wektor
wire
(dla grupy węzłów):
wire
[3:0] S
Krzysztof Jasiński 2009 PRUSn_W6 16
Elementy języka
I T P W Typy zmiennych Zmienna (Variable)
sieci reprezentują połączenia między elementami logicznymi nie oddając istoty zachowania; do tego celu używa się zmiennych, którym w jednej instrukcji przypisuje się pewną wartość do czasu wykonania następnej instrukcji, Rozróżnia się dwa typy zmiennych:
reg
i
integer
Przykład: Count = 0; //
reg
[2:0] Count;
for
(k = 0; k < 4; k = k +1) //
integer k
;
if
(S[k])
Krzysztof Jasiński
Count = Count + 1;
2009 PRUSn_W6 17
Elementy języka
I T P W Moduł – podstawowa konstrukcja języka
Opisuje układ lub podukład; w 1 ej linii deklaracji modułu znajduje się jego nazwa np. identyfikator, w następnych liniach lista portów; typy portów –
input
,
output
skalarne i wektorowe, i
inout
(dwukierunkowe) oraz przykłady portów:
input
Cin, x, y;
input
[3:0] X, Y;
inout
[7:0] Bus;
output
Cout, s;
Krzysztof Jasiński 2009 PRUSn_W6 18
Elementy języka
I T P W module
module name [(port name{, port name})]; [
parameter
declarations] [
input
declarations] [
output
declarations] [
inout
declarations] [
wire
[
reg
or or
tri
declarations]
integer
declarations] [
function
[
assign
or
task
declarations] continuous assignmen ts] [
initial
block] [
always
blocks] [gate instantiations] [module instantiations]
Endmodule
Rys. A.1. Ogólna deklaracja modułu
Krzysztof Jasiński 2009 PRUSn_W6 19
Język VERILOG w praktyce
Krzysztof Jasiński 2009 PRUSn_W6
Specyfikacja układów arytmetycznych
c i x i y i
0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1
c
i
+ 1
0 0 0 1 0 1 1 1
s i
0 1 1 0 1 0 0 1 (a) Truth table
c i x i y i
00 0 1 1 01 1 11 10 1 1
s i
=
x i
y i
c i c i x i y i
00 0 01 11 1 10 1 1 1 1
c i
+ 1 =
x i y i
+
x i c i
+
y i c i
(b) Karnaugh maps
x i y i c i s i
I T P W Krzysztof Jasiński
c i
+ 1 (c) Circuit
Rys. 5.4. Pełny sumator
.
2009 PRUSn_W6 21
Specyfikacja układów arytmetycznych
module
fulladd (Cin, x, y, s, Cout);
input
Cin, x, y;
output
s, Cout;
xor
(s, x, y, Cin);
and and and
(z1, x, y); (z2, x, Cin); (z3, y, Cin); // instancje (kopie) bramki AND // symbol
and
można pominąć // symbol
and
można pominąć
or
(Cout, z1, z2, z3);
endmodule Rys. 5.23. Opis pełnego sumatora z użyciem bramek.
I T P W Krzysztof Jasiński 2009 PRUSn_W6 22
Specyfikacja układów arytmetycznych
module
fulladd (Cin, x, y, s, Cout);
input
Cin, x, y;
output
s, Cout;
assign
s = x ^ y ^ Cin; // równania logiczne ^ = XOR
assign
Cout = (x & y) | (x & Cin) | (y & Cin); // symbol
assign endmodule Rys. 5.23. Opis pełnego sumatora z użyciem przypisania ciągłego.
I T P W Krzysztof Jasiński 2009 PRUSn_W6 23
Specyfikacja układów arytmetycznych
module
adder4 (carryin, x3, x2, x1, x0, y3, y2, y1, y0, s3, s2, s1, s0, carryout);
input
carryin, x3, x2, x1, x0, y3, y2, y1, y0;
output
s3, s2, s1, s0, carryout; fulladd fulladd fulladd stage0 (carryin, x0, y0, s0, c1); // instancja modułu
fulladd
stage1 (c1, x1, y1, s1, c2); // każda instancja musi mieć unikalną nazwę stage2 (c2, x2, y2, s2, c3); // połączenia między instancjami są niejawne fulladd stage3 (c3, x3, y3, s3, carryout);
endmodule module
fulladd (Cin, x, y, s, Cout);
input
Cin, x, y;
output
s, Cout; // oryginał modułu
fulladd assign
s = x ^ y ^ Cin,
assign
Cout = (x & y) | (x & Cin) | (y & Cin);
I T P W endmodule Krzysztof Jasiński Rys. 5.27. Opis 4-bitowego sumatora 2009 PRUSn_W6 24
Specyfikacja układów arytmetycznych
wykorzystanie notacji wektorowej module
adder4 (carryin, X, Y, S, carryout);
input
carryin;
input
[3:0] X, Y;
output
[3:0] S;
output wire
carryout; [3:1] C; // połączenia jawne fulladd stage0 (carryin, X[0], Y[0], S[0], C[1]); fulladd stage1 (C[1], X[1], Y[1], S[1], C[2]); fulladd stage2 (C[2], X[2], Y[2], S[2], C[3]); fulladd stage3 (C[3], X[3], Y[3], S[3], carryout);
I T P W endmodule Rys. 5.28. Opis cztero-bitowego sumatora z użyciem notacji wektorowej Krzysztof Jasiński 2009 PRUSn_W6 25
Specyfikacja układów arytmetycznych
iteracja zamiast kopiowania
x n –
1
y n
– 1
x
1
y
1
x
0
y
0
c n
FA
c n
” 1
c
2 FA
c
1 FA
c
0
s n
– 1 MSB pozycja
s
1 LSB pozycja
Rys 5.6. N-bitowy sumator kaskadowy I T P W Krzysztof Jasiński 2009 PRUSn_W6 26
I T P W
Specyfikacja układów arytmetycznych
iteracja zamiast kopiowania module
addern (carryin, X, Y, S, carryout);
parameter
n=32;
input
carryin;
input
[n-1:0] X, Y;
output
[n-1:0] S;
output
carryout;
reg
[n-1:0] S;
reg
carryout;
reg
[n:0] C;
integer
k;
Krzysztof Jasiński always
@(X or Y or carryin)
begin
C[0] = carryin;
for
(k = 0; k < n; k = k+1)
begin
// pętla
for
powtarza n razy // funkcje sumy i przeniesienia S[k] = X[k] ^ Y[k] ^ C[k]; C[k+1] = (X[k] & Y[k]) | (X[k] & C[k]) | (Y[k] & C[k]);
end end
carryout = C[n];
Rys 5.29. 32-bitowy sumator kaskadowy 2009 PRUSn_W6 27 endmodule
Specyfikacja układów arytmetycznych
użycie operacji arytmetycznych module
addern (carryin, X, Y, S);
parameter
n = 32;
input
carryin;
input
[n-1:0] X, Y;
output
[n-1:0] S;
reg
[n-1:0] S;
always
@(X or Y or carryin) S = X + Y + carryin; // bez wyjścia przeniesienia
endmodule I T P W Rys 5. 30. Specyfikacja n-bitowego sumatora przy użyciu operacji arytmetycznych
.
Krzysztof Jasiński 2009 PRUSn_W6 28
Specyfikacja układów arytmetycznych
użycie operacji arytmetycznych module
addern (carryin, X, Y, S, carryout, overflow);
parameter
n = 32;
input
carryin;
input
[n-1:0] X, Y;
output
[n-1:0] S;
output
carryout, overflow;
reg
[n-1:0] S;
reg
carryout, overflow;
I T P W always
@(X or Y or carryin)
begin
S = X + Y + carryin; carryout = (X[n-1] & Y[n-1]) | (X[n-1] & ~S[n-1]) | (Y[n-1] & ~S[n-1]); overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1];
end endmodule Krzysztof Jasiński Rys 5. 31. Specyfikacja n-bitowego sumatora z wyjściami przeniesienia i przepełnienia 2009 PRUSn_W6 29
I T P W
Specyfikacja układów arytmetycznych
użycie operacji arytmetycznych module
addern (carryin, X, Y, S, carryout, overflow);
parameter
n = 32;
input
carryin;
input
[n-1:0] X, Y;
output
[n-1:0] S;
output
carryout, overflow;
reg
[n-1:0] S;
reg
carryout, overflow;
reg
[n:0] Sum;
always
@(X or Y or carryin)
begin
Sum = {1'b0,X} + {1'b0,Y} + carryin;
end
S = Sum[n-1:0]; carryout = Sum[n]; // Suma
Sum
rozszerzona o jeden bit =
0
overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1];
endmodule Rys 5. 32. Alternatywna specyfikacja n-bitowego sumatora z wyjściami przeniesienia i przepełnienia Krzysztof Jasiński 2009 PRUSn_W6 30
Specyfikacja układów arytmetycznych
użycie operacji arytmetycznych module
addern (carryin, X, Y, S, carryout, overflow);
parameter
n = 32;
input
carryin;
input
[n-1:0] X, Y;
output
[n-1:0] S;
output
carryout, overflow;
reg
[n-1:0] S;
reg
carryout, overflow;
always
@(X or Y or carryin)
begin
{carryout, S} = X + Y + carryin; // konkatenacja przeniesienia i sumy
end
overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1];
I T P W endmodule Krzysztof Jasiński Rys 5. 33. Uproszczona specyfikacja pełnego n-bitowego sumatora 2009 PRUSn_W6 31
Specyfikacja układów arytmetycznych
użycie operacji arytmetycznych
+ X Y + 0 1 1 1 0 1 0 1 + 7 5 Z carry + 1 1 0 0 0 1 1 0 1 0 0 1 0 12 S = 2
I T P W
+ X Y Z carry
Krzysztof Jasiński
+ 1 0 0 0 1 0 0 1 + 1 0 0 0 1 0 1 1 0 1 0 1 1 1 S = 7 + 8 9 17
Rys 5. 39. Sumator liczb w kodzie BCD 2009 PRUSn_W6 32
Specyfikacja układów arytmetycznych
użycie operacji arytmetycznych
X Y
c in
carry-out 4-bit adder Z Detect if sum
>
9 6 0 MUX Adjust
c out
4-bit adder 0
I T P W
S
Rys 5. 40. Schemat blokowy sumatora w kodzie BCD Krzysztof Jasiński 2009 PRUSn_W6 33
I T P W
Specyfikacja układów arytmetycznych
użycie operacji arytmetycznych module
bcdadd (Cin, X, Y, S, Cout);
input input
Cin; [3:0] X, Y;
output
[3:0] S;
output reg
Cout; [3:0] S;
reg
Cout;
reg
[4:0] Z;
Krzysztof Jasiński always
@ (X or Y or Cin)
begin
Z = X + Y + Cin;
if
(Z < 10)
end else
{Cout, S} = Z; {Cout, S} = Z + 6;
Rys 5. 41. Specyfikacja sumatora endmodule w kodzie BCD 2009 PRUSn_W6 34
Specyfikacja układów arytmetycznych
użycie operacji arytmetycznych
x
3
x
2
x
1
x
0
y
3
y
2
y
1
y
0
c in z
3 Four-bit adder
z
2
z
1
z
0
I T P W
c out
Krzysztof Jasiński
s
3 Two-bit adder
Rys 5. 43. Uproszczony układ sumatora w kodzie BCD
s
2
s
1
s
0
2009 PRUSn_W6 35