Stratix II Architecture

Download Report

Transcript Stratix II Architecture

Język HDL - VERILOG
Hardware Description Language
(Syntetyzowalna warstwa języka)
Krzysztof Jasiński
2009 PRUSn_W7
Język VERILOG
w praktyce
Krzysztof Jasiński
2009 PRUSn_W7
VERILOG
Specyfikacja układów
kombinacyjnych
Krzysztof Jasiński
2009 PRUSn_W7
Operator warunkowy
Conditional_expression ? True_ expression : false_ expression
A = (B < C) ? (D + 5) : (D + 2)
module mux2to1 (w0, w1, s, f);
input w0, w1, s;
output f;
assign f = s ? w1 : w0; // przypisanie ciągłe
endmodule
I
T
P
W
Rys 6.27. Multiplekser 2-do-1 opisany operatorem warunkowym.
Krzysztof Jasiński
2009 PRUSn_W7
4
Operator warunkowy
module mux2to1 (w0, w1, s, f);
input w0, w1, s;
output f;
reg f;
always @(w0 or w1 or s)
f = s ? w1 : w0; // instrukcja proceduralna
endmodule
I
T
P
W
Rys 6.28. Multiplekser 2-do-1 – inny opis z użyciem operatora
warunkowego
Krzysztof Jasiński
2009 PRUSn_W7
5
Operator warunkowy
module mux4to1 (w0, w1, w2, w3, S, f);
input w0, w1, w2, w3;
input [1:0] S;
output f;
assign f = S[1] ? (S[0] ? w3 : w2) : (S[0] ? w1 : w0);
endmodule
Rys 6.29. Multiplekser 4-do-1 z użyciem operatora warunkowego
I
T
P
W
Krzysztof Jasiński
2009 PRUSn_W7
6
Instrukcja IF-ELSE
I
T
P
W
if (wyrażenie1)
begin
dyrektywa; // wielokrotna dyrektywa - w bloku begin-end
end
else if (wyrażenie2) // else if i else są opcjonalne
begin
dyrektywa;
end
else
begin
dyrektywa;
end
Rys. A.8. Budowa instrukcji if-else
Krzysztof Jasiński
2009 PRUSn_W7
7
Instrukcja IF-ELSE
module mux2to1 (w0, w1, s, f);
input w0, w1, s;
output f;
reg f;
always @(w0 or w1 or s)
if (s==0)
f = w0;
else
f = w1;
endmodule
I
T
P
W
Rys. 6.30. Multiplekser 2-do-1 przy użyciu instrukcji if-else.
Krzysztof Jasiński
2009 PRUSn_W7
8
Instrukcja IF-ELSE
module mux4to1 (w0, w1, w2, w3, S, f);
input w0, w1, w2, w3;
input [1:0] S;
output f;
reg f;
always @(w0 or w1 or w2 or w3 or S)
if (S == 2'b00)
f = w0;
else if (S == 2'b01)
f = w1;
else if (S == 2'b10)
f = w2;
else if (S == 2'b11)
f = w3;
I
T
P
W
endmodule
Krzysztof Jasiński
Rys. 6.31. Multiplekser 4-do-1 przy użyciu instrukcji if-else.
2009 PRUSn_W7
9
Instrukcja IF-ELSE
module mux4to1 (W, S, f);
input [0:3] W;
input [1:0] S;
output f;
reg f;
always @(W or S)
if (S == 0)
f = W[0];
else if (S == 1)
f = W[1];
else if (S == 2)
f = W[2];
else if (S == 3)
f = W[3];
I
T
P
W
endmodule
Krzysztof Jasiński
Rys. 6.32. Alternatywna specyfikacja
multipleksera 4-do-1 przy użyciu instrukcji if-else.
2009 PRUSn_W7
10
Instrukcja IF-ELSE
s0
s1
w0
w3
w4
w7
s2
s3
M[0]
M[1]
M[2]
M[3]
f
w8
w11
I
T
P
W
w12
Krzysztof Jasiński
w15
Rys. 6.32. Schemat multipleksera 16-do-1
2009 PRUSn_W7
11
Instrukcja IF-ELSE
module mux16to1 (W, S16, f);
input [0:15] W;
input [3:0] S16;
output f;
wire [0:3] M;
// module mux4to1 w tym samym pliku!
mux4to1 Mux1 (W[0:3], S16[1:0], M[0]);
mux4to1 Mux2 (W[4:7], S16[1:0], M[1]);
mux4to1 Mux3 (W[8:11], S16[1:0], M[2]);
mux4to1 Mux4 (W[12:15], S16[1:0], M[3]);
mux4to1 Mux5 (M[0:3], S16[3:2], f);
endmodule
I
T
P
W
Rys. 6.32. Hierachiczna specyfikacja multipleksera 16-do-1
Krzysztof Jasiński
2009 PRUSn_W7
12
Instrukcja IF-ELSE
Szczególny przypadek instrukcji if-else:
Pamięć niejawna (implied) – istota opisu
układów sekwencyjnych
always @(w0 or w1 or s)
begin
if (s = = 1)
f = w1;
// jeśli dla s = 0 f nie jest określona
to „zapamiętana” zostaje ostatnia wartość
end
I
T
P
W
Krzysztof Jasiński
2009 PRUSn_W7
13
Instrukcja CASE
case (wyrażenie) // wyrażenie sterujące
alternatywa1: begin
dyrektywa;
end
alternatywa2: begin
dyrektywa;
end
[default :
begin
dyrektywa;
end]
endcase
I
T
P
W
Rys. A.10. Budowa instrukcji case
Krzysztof Jasiński
2009 PRUSn_W7
14
Instrukcja CASE
module mux4to1 (W, S, f);
input [0:3] W;
input [1:0] S;
output f;
reg f;
always @(W or S)
case (S)
0: f = W[0];
1: f = W[1];
2: f = W[2];
3: f = W[3];
endcase
I
T
P
W
endmodule
Krzysztof Jasiński
Rys. 6.31. Multiplekser 4-do-1 opisany
przy użyciu instrukcji case.
2009 PRUSn_W7
15
Instrukcja CASE
En w1 w0
1
1
1
1
0
0
0
1
1
x
0
1
0
1
x
y0 y1 y2 y3
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
(a) Tablica prawdy
0
0
0
1
0
w0
w1
En
y0
y1
y2
y3
(b) Symbol graficzny
Rys. 6.16. Dekoder 2-do-4 .
I
T
P
W
Krzysztof Jasiński
2009 PRUSn_W7
16
Instrukcja CASE
module dec2to4 (W, Y, En);
input [1:0] W;
input En;
output [0:3] Y;
reg [0:3] Y;
always @(W or En)
case ({En, W})
3'b100: Y = 4'b1000;
3'b101: Y = 4'b0100;
3'b110: Y = 4'b0010;
3'b111: Y = 4'b0001;
default: Y = 4'b0000; // dla En = 0 wartość
domyślna Y = 4'b0000
endcase
endmodule
I
T
P
W
Krzysztof Jasiński
Rys. 6.35. Opis dekodera 2-do-4 (rys. 6.16)
przy użyciu instrukcji case .
2009 PRUSn_W7
17
Instrukcja CASE
module dec2to4 (W, Y, En);
input [1:0] W;
input En;
output [0:3] Y;
reg [0:3] Y;
always @(W or En)
begin
if (En == 0)
Y = 4'b0000;
else
case (W)
0: Y = 4'b1000;
1: Y = 4'b0100;
2: Y = 4'b0010;
3: Y = 4'b0001;
endcase
end
Rys. 6.3. Alternatywny opis dekodera
I
T
P
W
endmodule
Krzysztof Jasiński
2-do-4 przy użyciu instrukcji case .
2009 PRUSn_W7
18
Instrukcja CASE
w0
w1
y0
y1
y2
y3
y0
y1
y2
y3
y0
y1
y2
y3
y4
y5
y6
y7
y0
y1
y2
y3
y8
y9
y10
y11
y0
y1
y2
M[3]
y3
En
2009 PRUSn_W7
y12
y13
y14
y15
w0
w1
M[0]
En
w0
w1
w2
M[1]
w3
w0
w1
En
En
y0
y1
y2
y3
En
w0
w1
M[2]
I
T
P
W
Rys. 6.18. Dekoder 4-to-16
Krzysztof Jasiński
En
w0
w1
19
Instrukcja CASE
module dec4to16 (W, Y, En);
input [3:0] W;
input En;
output [0:15] Y;
wire [0:3] M;
dec2to4 Dec1 (W[3:2], M[0:3], En);
dec2to4 Dec2 (W[1:0], Y[0:3], M[0]);
dec2to4 Dec3 (W[1:0], Y[4:7], M[1]);
dec2to4 Dec4 (W[1:0], Y[8:11], M[2]);
dec2to4 Dec5 (W[1:0], Y[12:15], M[3]);
endmodule
I
T
P
W
Rys. 6.37. Hierachiczna specyfikacja dekodera 4-na-16
Krzysztof Jasiński
2009 PRUSn_W7
20
Instrukcja CASE
module seg7 (bcd, leds);
input [3:0] bcd;
output [1:7] leds;
reg [1:7] leds;
I
T
P
W
always @(bcd)
case (bcd)
//abcdefg
0: leds = 7'b1111110;
1: leds = 7'b0110000;
2: leds = 7'b1101101;
3: leds = 7'b1111001;
4: leds = 7'b0110011;
5: leds = 7'b1011011;
6: leds = 7'b1011111;
7: leds = 7'b1110000;
8: leds = 7'b1111111;
Rys. 6.18. Dekoder kodu BCD
9: leds = 7'b1111011;
default: leds = 7'bx;
na 7-segmentowy
endcase
Krzysztof Jasiński
endmodule
2009 PRUSn_W7
21
Instrukcja CASE
// ALU 74381
module alu(s, A, B, F);
input [2:0] s;
input [3:0] A, B;
output [3:0] F;
reg [3:0] F;
I
T
P
W
Rys. 6.39. Specyfikacja
jednostki ALU 74381
Krzysztof Jasiński
always @(s or A or B)
case (s)
0: F = 4'b0000;
1: F = B - A;
2: F = A - B;
3: F = A + B;
4: F = A ^ B;
5: F = A | B;
6: F = A & B;
7: F = 4'b1111;
endcase
endmodule
2009 PRUSn_W7
22
Instrukcja Casex
traktuje wszystkie wartości z i x jako don’t cares
module priority (W, Y, z);
input [3:0] W;
output [1:0] Y;
output z;
reg [1:0] Y;
reg z;
Rys. 6. 41. Specyfikacja
kodera priorytetu
I
T
P
W
always @(W)
begin
z = 1; // oznacza niezerowe wejście W[i]
casex(W)
4'b1xxx: Y = 3;
4'b01xx: Y = 2;
4'b001x: Y = 1;
4'b0001: Y = 0;
default: begin
z = 0;
Y = 2'bx;
end
endcase
end
Krzysztof Jasiński
2009 PRUSn_W7
endmodule
23
Instrukcje pętli w Verilogu:
for, while, repeat i forever
Instrukcja pętli for
for (początkowy_ indeks; końcowy_indeks; inkrementacja)
begin
dyrektywa; // oddzielenie begin-end gdy jest kilka dyrektyw
end
Instrukcja pętli for nie określa zmian podczas kolejnych iteracji
pętli, jak w językach programowania, ale może definiować różne
podukłady np. kolejne stopnie n-bitowego sumatora
I
T
P
W
Krzysztof Jasiński
2009 PRUSn_W7
24
Instrukcje pętli FOR
module dec2to4 (W, Y, En);
input [1:0] W;
input En;
output [0:3] Y;
reg [0:3] Y;
integer k;
always @(W or En)
for (k = 0; k <= 3; k = k+1)
if ((W == k) && (En == 1))
Y[k] = 1;
else
Y[k] = 0;
endmodule
I
T
P
W
Rys. 6. 42. Specyfikacja dekodera 2-na-4
przy użyciu pętli for
Krzysztof Jasiński
2009 PRUSn_W7
25
Instrukcje pętli FOR
module priority (W, Y, z);
input [3:0] W;
output [1:0] Y;
output z;
reg [1:0] Y;
reg z;
integer k;
I
T
P
W
always @(W)
begin
Y = 2'bx;
z = 0;
for (k = 0; k < 4; k = k+1)
if (W[k]) // badanie warunku od pozycji
najmniej znaczącej
begin
Y = k; // kolejna iteracja zwiększa priorytet!
z = 1;
end
Rys. 6. 43. Specyfikacja kodera
end
Krzysztof Jasiński
priorytetu przy użyciu pętli for
endmodule
2009 PRUSn_W7
26
Operatory w VERILOGu
Operatory bitowe
Wektory: A[2:0], B[2:0], C[2:0]
Skalary: f, w
Operator uzupełnienia „”
_ C = _A
_
c2 = a2, c1 = a1, c0 = a0
ai , ci - bity wektorów A i C
I
T
P
W
Krzysztof Jasiński
2009 PRUSn_W7
27
Operatory w VERILOGu
Operatory bitowe
Wektory: A[2:0], B[2:0], C[2:0]
Skalary: f, w
Operator „&” - AND na bitach
C=A&B
c2 = a2 • b2 , c1 = a1 • b1 , c0 = a0 • b0
I
T
P
W
Krzysztof Jasiński
2009 PRUSn_W7
28
Operatory w VERILOGu
Operatory bitowe
Wektory: A[2:0], B[2:0], C[2:0]
Skalary: f, w
Operator „|” - OR na bitach
C=A|B
c2 = a2 + b2 , c1 = a1 + b1 , c0 = a0 + b0
I
T
P
W
Krzysztof Jasiński
2009 PRUSn_W7
29
Operatory w VERILOGu
Kategoria
Przykłady
Bitowe
~A, +A, –A
A & B, A | B, A ~ ^ B, A ^ ~ B
Logiczne
!A, A && B, A || B
1 bit
Redukcji
&A, ~&A, |A, ~ | A, ^ ~ A, ~ ^ A
1 bit
Relacyjne
A = = B, A != B, A > B, A < B
A >= B, A <= B
A = = = B, A != = B
1 bit
Liczba bitów = długość
Arytmetyczne A + B, A – B, A * B, A / B
A%B
Przesunięcia
A << B, A >> B
Konkatenacji {A,…, B}
I
T
P
W
Replikacji
{B{A}}
Warunku
A ? B :C
Krzysztof Jasiński
L(A)
MAX (L(A), L(B))
MAX (L(A), L(B))
L(A)
L(A) + ... + L(B)
B * L(A)
MAX (L(B), L(C))
2009 PRUSn_W7
30
Operatory w VERILOGu
module compare (A, B, AeqB, AgtB, AltB);
input [3:0] A, B;
output AeqB, AgtB, AltB;
reg AeqB, AgtB, AltB;
always @(A or B)
begin
AeqB = 0;
AgtB = 0;
AltB = 0;
if (A == B) // operator relacyjny
AeqB = 1;
else if (A > B) // operator relacyjny
AgtB = 1;
else
AltB = 1;
end
I
T
P
W
endmodule
Krzysztof Jasiński
Rys. 6. 43. Specyfikacja 4-bitowego komparatora
2009 PRUSn_W7
31
VERILOG – elementy pamięciowe
module D_latch (D, Clk, Q);
input D, Clk;
output Q;
reg Q;
always @(D or Clk)
if (Clk)
//zależność od wartości
Q = D;
//podtrzymanie stanu
endmodule
I
T
P
W
Rys. 7.35. Opis przerzutnika typu D-latch
Krzysztof Jasiński
2009 PRUSn_W7
32
VERILOG – elementy pamięciowe
module flipflop (D, Clock, Q);
input D, Clock;
output Q;
reg Q;
always @(posedge Clock)
Q = D;
//zależność od zmiany!
// przypisanie w danej chwili
endmodule
I
T
P
W
Rys. 7.36. Opis przerzutnika typu D-flip-flop,
synchronizowanego dodatnim zboczem
Krzysztof Jasiński
2009 PRUSn_W7
33
Przypisania typu blocking i non-blocking
module example7_3 (D, Clock, Q1, Q2);
input D, Clock;
output Q1, Q2;
reg Q1, Q2;
always @(posedge Clock)
begin
Q1 = D;
// przypisania blocking (=) są wykonywane
Q2 = Q1;
// sekwencyjnie
end
Endmodule
I
T
P
W
Rys. 7.37. Niepoprawny opis łańcucha przerzutników
Krzysztof Jasiński
2009 PRUSn_W7
34
Przypisania typu blocking i non-blocking
D
D
Clock
Q
Q1
Q
D
Q
Q2
Q
I
T
P
W
Rys. 7.38. Ilustracja do przykładu z rys. 7.37
Krzysztof Jasiński
2009 PRUSn_W7
35
VERILOG – elementy pamięciowe
module example7_4 (D, Clock, Q1, Q2);
input D, Clock;
output Q1, Q2;
reg Q1, Q2;
always @(posedge Clock)
begin
Q1 <= D;
// przypisanie non-blocking (<=)
Q2 <= Q1;
// równoczesne (współbieżne)
end
endmodule
I
T
P
W
Rys. 7.39. Poprawny opis łańcucha przerzutników
Krzysztof Jasiński
2009 PRUSn_W7
36
VERILOG – elementy pamięciowe
module example7_5 (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
I
T
P
W
Rys. 7.41. Przykład użycia przypisania typu blocking
Krzysztof Jasiński
2009 PRUSn_W7
37
VERILOG – elementy pamięciowe
x3
x1
D
Q
g
x2
Q
D
f
Q
Clock
I
T
P
W
Q
Rys. 7.42. Schemat układu z rys. 7.41
Krzysztof Jasiński
2009 PRUSn_W7
38
VERILOG – elementy pamięciowe
module example7_6 (x1, x2, x3, Clock, f, g);
input x1, x2, x3, Clock;
output f, g;
reg f, g;
always @(posedge Clock)
begin
f <= x1 & x2; // kolejność przypisań nie ma znaczenia!
g <= f | x3;
end
endmodule
I
T
P
W
Rys. 7.43. Przykład - użycie przypisania typu non-blocking
zamiast blocking zmienia realizowaną funkcję!
Krzysztof Jasiński
2009 PRUSn_W7
39
VERILOG – elementy pamięciowe
x3
D
Q
g
Q
x1
D
x2
f
Q
Clock
I
T
P
W
Q
Rys. 7.44. Schemat układ z rys.7.43
Krzysztof Jasiński
2009 PRUSn_W7
40
VERILOG – elementy pamięciowe
module flipflop (D, Clock, Resetn, Q);
input D, Clock, Resetn;
output Q;
reg Q;
always @(negedge Resetn or posedge Clock)
if (!Resetn)
Q <= 0;
else
Q <= D;
endmodule
I
T
P
W
Rys. 7.45. Opis przerzutnika D-flip-flop
z asynchronicznym resetem
Krzysztof Jasiński
2009 PRUSn_W7
41
VERILOG – elementy pamięciowe
module flipflop (D, Clock, Resetn, Q);
input D, Clock, Resetn;
output Q;
reg Q;
always @(posedge Clock)
if (!Resetn)
Q <= 0;
else
Q <= D;
endmodule
I
T
P
W
Rys. 7.46. Opis przerzutnika D-flip-flop
z synchronicznym resetem
Krzysztof Jasiński
2009 PRUSn_W7
42
VERILOG – rejestry i liczniki
module regn (D, Clock, Resetn, Q);
parameter n = 16;
input [n-1:0] D;
input Clock, Resetn;
output [n-1:0] Q;
reg [n-1:0] Q; // n - niezależnych przerzutników
always @(negedge Resetn or posedge Clock)
if (!Resetn)
Q <= 0;
else
Q <= D;
I
T
P
W
endmodule
Krzysztof Jasiński
Rys. 7.51. Opis n-bitowego rejestru
z asynchronicznym
resetem
2009 PRUSn_W7
43
VERILOG – rejestry i liczniki
module muxdff (D0, D1, Sel, Clock, Q);
input D0, D1, Sel, Clock;
output Q;
reg Q;
always @(posedge Clock)
if (!Sel)
Q <= D0;
else
Q <= D1;
endmodule
I
T
P
W
Rys. 7.52. Opis przerzutnika D flip-flop z multiplekserem 2-do-1 na wejściu D
Krzysztof Jasiński
2009 PRUSn_W7
44
VERILOG – rejestry i liczniki
module shift4 (R, L, w, Clock, Q);
input [3:0] R;
input L, w, Clock;
output [3:0] Q;
wire [3:0] Q;
muxdff Stage3 (w, R[3], L, Clock, Q[3]);
muxdff Stage2 (Q[3], R[2], L, Clock, Q[2]);
muxdff Stage1 (Q[2], R[1], L, Clock, Q[1]);
muxdff Stage0 (Q[1], R[0], L, Clock, Q[0]);
endmodule
I
T
P
W
Krzysztof Jasiński
Rys. 7.53. Opis hierarchiczny 4-bitowego rejestru
przesuwającego z wykorzystaniem muxdff
2009 PRUSn_W7
45
VERILOG – rejestry i liczniki
module shift4 (R, L, w, Clock, Q);
input [3:0] R;
input L, w, Clock;
output [3:0] Q;
reg [3:0] Q;
always @(posedge Clock)
if (L)
Q <= R;
else
begin
Q[0] <= Q[1];
Q[1] <= Q[2];
Q[2] <= Q[3];
Q[3] <= w;
end
I
T
P
W
endmodule
Krzysztof Jasiński
Rys. 7.54. Alternatywny opis 4-bitowego
rejestru z przypisaniem non-blocking
2009 PRUSn_W7
46
VERILOG – rejestry i liczniki
module shiftn (R, L, w, Clock, Q);
parameter n = 16;
input [n-1:0] R;
input L, w, Clock;
output [n-1:0] Q;
reg [n-1:0] Q;
integer k;
always @(posedge Clock)
if (L)
Q <= R;
else
begin
for (k = 0; k < n-1; k = k+1)
Q[k] <= Q[k+1];
Q[n-1] <= w;
end
I
T
P
W
endmodule
Krzysztof Jasiński
Rys. 7.55. Opis n-bitowego rejestru
przesuwającego
z pętlą for
2009 PRUSn_W7
47
VERILOG – rejestry i liczniki
module upcount (Resetn, Clock, E, Q);
input Resetn, Clock, E;
output [3:0] Q;
reg [3:0] Q;
always @(negedge Resetn or posedge Clock)
if (!Resetn)
Q <= 0;
else if (E)
Q <= Q + 1;
endmodule
I
T
P
W
Rys. 7.56. Opis 4-bitowego licznika zliczającego w górę
Krzysztof Jasiński
2009 PRUSn_W7
48
VERILOG – rejestry i liczniki
module upcount (R, Resetn, Clock, E, L, Q);
input [3:0] R;
input Resetn, Clock, E, L;
output [3:0] Q;
reg [3:0] Q;
always @(negedge Resetn or posedge Clock)
if (!Resetn)
Q <= 0;
else if (L)
Q <= R;
else if (E)
Q <= Q + 1;
I
T
P
W
endmodule
Krzysztof Jasiński
Rys. 7.57. Opis 4-bitowego licznika
zliczającego w górę z wpisem równoległym
2009 PRUSn_W7
49
VERILOG – rejestry i liczniki
module downcount (R, Clock, E, L, Q);
parameter n = 8;
input [n-1:0] R;
input Clock, L, E;
output [n-1:0] Q;
reg [n-1:0] Q;
always @(posedge Clock)
if (L)
Q <= R;
else if (E)
Q <= Q - 1;
I
T
P
W
endmodule
Krzysztof Jasiński
Rys. 7.58. Opis 4-bitowego licznika
zliczającego w dół z wpisem równoległym
2009 PRUSn_W7
50
VERILOG – rejestry i liczniki
module updowncount (R, Clock, L, E, up_down, Q);
parameter n = 8;
input [n-1:0] R;
input Clock, L, E, up_down;
output [n-1:0] Q;
reg [n-1:0] Q;
integer direction;
I
T
P
W
always @(posedge Clock)
begin
if (up_down)
direction = 1;
else
direction = --1;
if (L)
Rys. 7.59. Opis n-bitowego licznika
Q <= R;
zliczającego w górę/dół
else if (E)
Q <= Q + direction;
end
Krzysztof Jasiński
endmodule
2009 PRUSn_W7
51