03.03.2014
VERILOG
Modüller
• Devre bileşenleri module içinde tasarlanır.
• Modüller hem yapısal hem de davranışsal
ifadeleri içerebilir.
• Yapısal ifadeler lojik kapılar, sayaçlar ve
mikroişlemciler gibi devre bileşenlerini ifade
eder.
• Davranışsal seviye ifadeleri ise döngüler, ifthen deyimleri gibi devre elemanlarına
doğrudan haritalama yapmayan ifadelerdir.
1
03.03.2014
Modüller-Örnek
• module
• Keyfi bir modül
ismi
• Keyfi bir port
listesi
• endmodule
Assignment İfadeleri ile Yapısal Tasarım
• wire d;
• assign d = a || b; //continuous assignment
• wire d = a || b; //implicit continuous assignment
2
03.03.2014
Initial ve Always Blokları ile Davranışsal Tasarım Örnek
Değişken İsimleri
• {[A-Z], [a-z], [0-9], _, $}, karakterlerini içerebilir,
fakat..
• $ veya [0-9] ile başlayamaz
– myidentifier
– m_y_identifier
– 3my_identifier
– $my_identifier
– _myidentifier$
doğru
doğru
yanlış
yanlış
doğru
• Büyük-küçük harf duyarlılığı
– myid
 Myid
6
3
03.03.2014
Açıklamalar
• // Bu satır bir açıklamadır
• /* Çok satırlı
açıklama */
•
/*
İç içe/* açıklama */ tek açıklama gibi
*/
7
Verilog Değer Seti
• 0 düşük logic seviyesi veya false durumu
• 1 yüksek logic seviyesi veya true durumu
• X bilinmeyen logic seviyesi
• Z yüksek empedans logic seviyesi (çıkışta
hiçbir şey okunamaz)
8
4
03.03.2014
Verilog’da Sayılar (i)
<boyut>’<kök> <değer>
Bit sayısı
Binary
 b or B
Octal
 o or O
Decimal
 d or D
Hexadecimal  h or H
Ardışık karakterler
0-f, x, z
– 8’h ax = 1010xxxx
– 12’o 3zx7 = 011zzzxxx111
9
Verilog’da Sayılar (ii)
• Okunabilir olması açısından “_” kullanılabilir
– 12’b 000_111_010_100
– 12’b 000111010100
Aynı sayıyı gösterirler
– 12’o 07_24
– MS(most significant) bit = 0, x or z 
• 4’b x1 = 4’b xx_x1
– MS bit = 1 
• 4’b 1x = 4’b 00_1x
10
5
03.03.2014
Nets (i)
• kabloların(wires) logic ile sürüldüğü düşünülebilir
• Bağlanmazsa z’ye eşittir
• Nets çeşitleri
– wire
(wired-AND)
wor
(wired-OR)
tri
(tri-state, örn. mikroişlemcide ortak yol
kullanmada faydalı)
supply0 (ground)
supply1 (vcc)
– wand
–
–
–
–
11
Nets (ii)
A
B
Y
en
A
Y
wire Y; // tanımlama
assign Y = A & B;
tri Y; // tanımlama
assign Y = (en) ? A : z; (bufferlanmış çıkış)
12
6
03.03.2014
Register’lar
• Değerleri depolayan değişkenler
• Kartta donanımsal olarak register yoktur, ancak
donanım gibi tanımlanabilir.
• reg
reg A, C; // tanımlama
A = 1;
C = A; // C = 1
A = 0; // C halen 1 değerinde
C = 0; // C artık 0 oldu
13
Vektörler
• Bus’ları gösterirler
wire [3:0] busA;
reg [1:4] busB;
reg [1:0] busC;
• Pay yönetimi
busC[1] = busA[2];
busC = busA[2:1];

busC[0] = busA[1];
• Vektör ataması (konuma göre)
busB[1] = busA[3];
busB = busA;

busB[2] = busA[2];
busB[3] = busA[1];
busB[4] = busA[0];
14
7
03.03.2014
Integer & Real Veri Tipleri
• Tanımlama
integer i, k;
real r;
• register’lar gibi kullanılabilir
i = 1; // atamalar prosedür içinde yapılır
r = 2.9;
k = r; // k integer olduğundan 3’e yuvarlanır
• Integer’lara sistem tarafından ilk değer
atanmaz
• Real’lara sistem tarafından 0.0 ilk değeri atanır
15
Diziler(i)
• Sentaks
integer count[1:5]; // 5 integer
reg var[-15:16]; // 32 -1 bit regs
reg [7:0] mem[0:1023]; // 1024 8-bit regs
• Dizi elemanlarına erişim
– Bütün elemanlara: mem[10] = 8’b 10101010;
– Alt gruplara(geçici depolama alanı gerektirir):
reg [7:0] temp;
..
temp = mem[10];
var[6] = temp[2];
16
8
03.03.2014
Diziler(ii)
• Sınırlama: Dizinin alt grubuna veya tüm diziye
bir kerede ulaşılamaz
var[2:9] = ???; // YANLIŞ!!,teker teker
// yapılacak
var = ???; // YANLIŞ!!
• Çok boyutlu dizi yoktur
reg var[1:10] [1:100]; // YANLIŞ!!
• Real veri tipi için dizi çalışmaz
real r[1:10]; // YANLIŞ!!
17
Örnek
9
03.03.2014
Mantıksal Operatörler
 mantıksal AND
• ||  mantıksal OR
• !  mantıksal NOT
• Operandlar bir bit olabilir: 0, 1 or x
• Sonuç bir bit olabilir: 0, 1 or x
• &&
A = 1;
B = 0;
C = x;
A && B  1 && 0  0
A || !B  1 || 1  1
C || B  x || 0  x
19
Bitsel Operatörler (i)
 bitsel AND
|
 bitsel OR
~
 bitsel NOT
^
 bitsel XOR
~^ veya ^~ bitsel XNOR
• &
•
•
•
•
• Bit bit işlem yapar.
20
10
03.03.2014
Bitsel Operatörler (ii)
c = ~a;
•
c = a & b;
a = 4’b1010;
b = 4’b1100;
c = a ^ b;
•
a = 4’b1010;
b = 2’b11;
21
Operatörleri İndirgemek
•
&
•
|
•
^
•
~&
•
~|
•
~^
 AND
 OR
 XOR
 NAND
 NOR
veya ^~  XNOR
• Bir çoklu-bit operandı  Bir tek-bitlik sonuç
a = 4’b1001;
..
c = |a; // c = 1|0|0|1 = 1
22
11
03.03.2014
Kaydırma Operatörleri
 sağa kaydır
• <<  sola kaydır
•
>>
• Sonuç ilk operand ile aynı boyuttadır, kaydırılan bit her zaman
sıfırla doldurulur
a = 4’b1010;
...
d = a >> 2; // d = 0010
c = a << 1; // c = 0100
23
Birleştirme Operatörü
• {op1, op2, ..}  op1, op2, ..’yi tek bir sayıya birleştirir
• Operandlar boyutlandırılmalıdır
reg a;
reg [2:0] b, c;
..
a = 1’b 1;
b = 3’b 010;
c = 3’b 101;
catx = {a, b, c};
caty = {b, 2’b11, a};
catz = {b, 1};
// catx = 1_010_101
// caty = 010_11_1
// YANLIŞ!!
• Çoğaltma..
catr = {4{a}, b, 2{c}};
// catr = 1111_010_101101
24
12
03.03.2014
İlişkisel Operatörler
 büyüktür
 küçüktür
 büyük eşittir
 küçük eşittir
• >
• <
• >=
• <=
• Sonuç bir bitlik bir değerdir: 0, 1 veya x
1 > 0
’bx
<= 0
1
x
25
Eşitlik Operatörleri
• ==
• !=
• ===
• !==
 mantıksal eşitlik
 mantıksal eşitsizlik
 durum eşitliği
 durum eşitsizliği
–
4’b 1z0x == 4’b 1z0x
–
–
–
4’b 1z0x != 4’b 1z0x
4’b 1z0x === 4’b 1z0x
4’b 1z0x !== 4’b 1z0x
0, 1 veya x döndürür
0 veya 1 döndürür
x
x
1
0
26
13
03.03.2014
Şart Operatörü
• cond_expr ? true_expr : false_expr
• 2x1 mux gibi ..
A
1
B
Y
Y = (sel)? A : B;
0
sel
27
Aritmetik Operatörler
• +, -, *, /, %
• Herhangi bir operand x olursa sonuç da x olur
28
14
03.03.2014
Operatör Öncelikleri
Öncelikleri istenilen
Şekilde yapmak
İçin parantez kullanılır
29
Kombinasyonel Lojiğin Yapısal
Modelleri
•
•
Verilog Primitive’leri ve Tasarım
– Primitive’ler : Kombinasyonel lojik kapıların önceden tanımlı 26 adet modeli
– (örn.) and, nand, or, nor, xor, xnor, buf, not, bufif0, bufif1 …
Örnek : 1-bit half adder
– Half adder için verilog tanımlaması ve şeması
module Add_Half(sum,c_out,a,b);
input
a,b;
output c_out,sum;
xor
(sum,a,b);
and
(c_out,a,b);
endmodule
*Tips: The output port of primitives must be first in the list of ports.
15
03.03.2014
Module Port’ları / Bazı Dil Kuralları
• Port’un modu yönünü belirtir
– input , output , inout
• output’lar primitive’lerde en solda belirtilir
– xor (sum,a,b);
•
•
•
•
Değişkenler sayı veya $ ile başlayamaz
Değişkenler 1024 karakter uzunluğunda olabilir
Tanımlamalarda boşluk kullanılamaz
endmodule hariç her satır “;” ile biter
Tasarım ve İç İçe Module’ler
• Örnek : 1-bit full adder
module Add_full_0_delay (sum, c_out, a, b, c_in);
input
a, b, c_in;
output
sum, c_out;
wire
w1, w2, w3;
Add_Half M1 (w1, w2, a, b);
Add_Half M2 (sum, w3, c_in, w1);
or (c_out, w2, w3);
endmodule
16
03.03.2014
Doğruluk Tabloları
•
•
•
UDP : user defined primitive
Sıklıkla kullanılır, çünkü module’lerden daha hızlıdır ve daha az depolama
alanı gerektirir
user-defined primitive çıkışı sayısal olmalıdır
primitive mux_prim (mux_out, select, a, b)
output mux_out;
input select, a, b;
table
//
select
0
0
0
0
0
0
...
endtable
endprimitive
a
0
0
0
1
1
1
b
0
1
x
0
1
x
:
:
:
:
:
:
:
mux_out
0;
0;
0;
1;
1;
1;
User-Defined Primitives (UDP)
primitive AOI_UDP (y, x_in1, x_in2, x_in3, x_in4, x_in5);
output y;
input x_in1, x_in2, x_in3, x_in4, x_in5;
table
// x1 x2 x3 x4 x5 : y
0 0 0 0 0 : 1;
0 0 0 0 1 : 1;
0 0 0 1 0 : 1;
0 0 0 1 1 : 1;
0 0 1 0 0 : 1;
……
1 1 0 1 1 : 0;
1 1 1 0 0 : 0;
1 1 1 0 1 : 0;
1 1 1 1 0 : 0;
1 1 1 1 1 : 0;
endtable
endprimitive
34
17
03.03.2014
Yapısal Model (Gate Level)
• Built-in gate primitives:
and, nand, nor, or, xor, xnor, buf, not, bufif0,
bufif1, notif0, notif1
• Kullanım:
nand and1(out, in1, in2); 2 girişli NAND, gecikme yok
and #2 and1(out, in1, in2, in3); 3 girişli AND, 2 ns gecikme
• module içine, prosedür dışına yazılırlar
35
Davranışsal Model – Procedure’ler (i)
• Procedures = Sırayla çalışan kod bölümleri
• Prosedür ifadeleri prosedür içinde
tanımlanırlar ve sırayla çalışırlar
• örn. 2x1 mux :
İcra
Akışı
begin
if (sel == 0)
Y = B;
else
Y = A;
end
Prosedürsel atamalar:
Y, reg olmalıdır !!
36
18
03.03.2014
Davranışsal Model – Procedure’ler (ii)
• Module’lerde istenildiği kadar procedure
kullanılabilir
• Procedure’ler birbirleriyle paralel çalışırlar
• İki tipte tanımlanabilirler:
– initial  sadece bir kere çalışır
– always  sürekli çalışır (simülasyon bitene kadar)
37
“Initial” Blokları
• Sim’in 0.anında başlar ve son ifadesi
çalışınca sona erer
module nothing;
initial
$display(“I’m first”);
initial begin
#50;
$display(“Really?”);
end
sim time 0’da
görüntülenir
sim time 50’de
görüntülenir
endmodule
38
19
03.03.2014
“Always” Blokları
• sim time 0’da başlar ve sim bitene kadar
devam eder
39
• @
Olaylar(i)
always @(signal1 or signal2 or ..) begin
..
Her sinyal değişiminde
end
tetiklenir
always @(posedge clk) begin
..
end
always @(negedge clk) begin
..
end
clk 0’dan 1’e
değiştiğinde
tetiklenir
clk 1’den 0’a
değiştiğinde
tetiklenir
40
20
03.03.2014
Örnek
res
a
b
Y
c
W
clk
always @(res or posedge clk) begin
if (res) begin
Y = 0;
W = 0;
end
else begin
Y = a & b;
W = ~c;
end
end
41
Zamanlama(i)
d
initial begin
#5 c = 1;
#5 b = 0;
#5 d = c;
end
c
b
0
5
10
15
Time
Her atama bir önceki
tarafından geciktirilir
42
21
03.03.2014
Prosedürel İfadeler: if
Örn. 4x1 mux:
if (expr1)
true_stmt1;
else if (expr2)
true_stmt2;
..
else
def_stmt;
module mux4_1(out, in, sel);
output out;
input [3:0] in;
input [1:0] sel;
reg out;
wire [3:0] in;
wire [1:0] sel;
always @(in or sel)
if (sel == 0)
out = in[0];
else if (sel == 1)
out = in[1];
else if (sel == 2)
out = in[2];
else
out = in[3];
endmodule
43
Prosedürel İfadeler : case
Örn. 4x1 mux:
case (expr)
item_1, .., item_n:
stmt1;
item_n+1, .., item_m: stmt2;
..
default: def_stmt;
endcase
module mux4_1(out, in, sel);
output out;
input [3:0] in;
input [1:0] sel;
reg out;
wire [3:0] in;
wire [1:0] sel;
always @(in or sel)
case (sel)
0: out = in[0];
1: out = in[1];
2: out = in[2];
3: out = in[3];
endcase
endmodule
44
22
03.03.2014
Prosedürel İfadeler : for
for (init_assignment; Cond;step_assignment)
stmt;
Örn.
module count(Y, start);
output [3:0] Y;
input start;
reg [3:0] Y;
wire start;
integer i;
initial
Y = 0;
always @(posedge start)
for (i = 0; i < 3; i = i + 1)
#10 Y = Y + 1;
endmodule
45
Prosedürel İfadeler : while
Örn.
module count(Y, start);
output [3:0] Y;
input start;
while (expr) stmt;
reg [3:0] Y;
wire start;
integer i;
initial
Y = 0;
always @(posedge start) begin
i = 0;
while (i < 3) begin
#10 Y = Y + 1;
i = i + 1;
end
end
endmodule
46
23
03.03.2014
Prosedürel İfadeler : repeat
Örn.
module count(Y, start);
output [3:0] Y;
input start;
repeat (times) stmt;
reg [3:0] Y;
wire start;
initial
Integer veya
değişken olabilir
Y = 0;
always @(posedge start)
repeat (4) #10 Y = Y + 1;
endmodule
47
Prosedürel İfadeler : forever
Tipik örnek:
test module’lerinde clock üretimi
module test;
reg clk;
forever stmt;
Sim bitene kadar
çalışır
initial begin
clk = 0;
forever #10 clk = ~clk;
end
other_module1 o1(clk, ..);
other_module2 o2(.., clk, ..);
endmodule
48
24
03.03.2014
ÖRNEKLER
module smpl_circuit(A,B,C,x,y);
input A,B,C;
output x,y;
wire e;
and g1(e,A,B);
not g2(y, C);
or g3(x,e,y);
endmodule
module stimcrct;
reg A,B,C;
wire x,y;
circuit_with_delay cwd(A,B,C,x,y);
initial
begin
A = 1'b0; B = 1'b0; C = 1'b0;
#100
A = 1'b1; B = 1'b1; C = 1'b1;
#100 $finish;
end
endmodule
module circuit_with_delay (A,B,C,x,y);
input A,B,C;
output x,y;
wire e;
and #(30) g1(e,A,B);
or #(20) g3(x,e,y);
not #(10) g2(y,C);
endmodule
//Description of circuit with delay
module circuit_with_delay (A,B,C,x,y);
input A,B,C;
output x,y;
wire e;
and #(30) g1(e,A,B);
or #(20) g3(x,e,y);
not #(10) g2(y,C);
endmodule
25
03.03.2014
module circuit_bln (x,y,A,B,C,D);
input A,B,C,D;
output x,y;
assign x = A | (B & C) | (~B & C);
assign y = (~B & C) | (B & ~C & ~D);
endmodule
//User defined primitive(UDP)
primitive crctp (x,A,B,C);
output x;
input A,B,C;
//Truth table for x(A,B,C) = Minterms (0,2,4,6,7)
table
// A B C : x (Note that this is only a comment)
0 0 0 : 1;
0 0 1 : 0;
0 1 0 : 1;
0 1 1 : 0;
1 0 0 : 1;
1 0 1 : 0;
1 1 0 : 1;
1 1 1 : 1;
endtable
endprimitive
26
Download

Dönemin İlk Dersinde Yapılan Sunum