Verilog HDL(Hardware Description Language) bir donanım tanımlama dilidir. Bu
dil ile bir bilgisayar, bir bilgisayar bileşeni veya dijital sistemi tasarlamak
mümkündür.
Verilog HDL Soyutlama Seviyeleri
(Abstraction Levels)
Verilog HDL birçok farklı seviyedeki soyutlamayı
desteklemektedir. Bunlardan 3'ü önemlidir:
• Davranışsal Seviye (Behavioral Level)
• Yazmaç Transfer Seviyesi(Register Transfer
Level (RTL))
• Kapı Seviyesi (Gate Level)
Davranışsal Seviye (Behavioral Level)
Bu seviye aynı zamanda algoritmalar ile bir sistemi tanımlar. Her bir algoritma sıralı bir şekilde yürütülür, bunun nedeni ise birbiri ardına gerçekleşen komutlar kümesini içermektedir. Fonksiyonlar, görevler ve always blokları temel elemanlarıdır.
Tasarımın yapısal olarak gerçekleşmesinin bu seviyeyle bağlantısı yoktur.
Yazmaç Transfer Seviyesi (Register Transfer
Level)
RTL kullanarak tasarlama, bir
devrenin işlemlerini ve yazmaçlar arasındaki verilerin transferinin
karakteristiğini belirtir. Harici bir saat kullanılır. RTL işlemler kesin bir zamanda gerçekleştirilecek şekilde
planlanmıştır. Modern bir RTL kodun tanımı ise sentezlenebilen herhangi bir koda denir.
Kapı Seviyesi (Gate Level)
Lojik seviyesi içerisinde bir sistemin
karakteristiği mantıksal bağlantılarla ve onların zamanlama özellikleriyle
tanımlanmıştır. Tüm sinyaller ayrık sinyallerdir. Sadece belirli
mantıksal değerlere sahip olabilirler. Kullanılabilir
işlemler ilkel veri tipleri ile (AND, OR, NOT vb. ) önceden tanımlanmıştır. Kapı
seviyesinde modelleme kullanma, mantıksal tasarımın herhangi bir seviyesi için kullanışlı değildir. Kapı seviyesi kodu, sentez araçlarına benzer araçlarla
üretilirler ve netlist kapı seviyesi simülasyonu ve arka uç için
kullanılırlar.
VHDL
|
Verilog HDL
|
‘V’ açılımı Çok Very High Speed Integrated Circuits’dir. ABD
Savunma Bakanlığı tarafından desteklenen topluluk (1981-1985) tarafından
tasarlanmıştır.
|
Gateway
Design System Corporation tarafından 1985 yılında tanıtıldı.
|
Sözdizimi Ada programlama dili
tabanlıdır.
|
Sözdizimi C programlama dili tabanlıdır.
|
1987 yılında IEEE Standardı oluşturulmuştur. |
1995 yılında IEEE Standardı (1364
IEEE) oluşturulmuştur.
|
VHDL ve Verilog HDL Çalışma Simülasyonu |
1. Değişken isimleri büyük ve küçük harf duyarlılığına sahip değildir. Ayrıca (0,1, ... 0,9),’_’, ve ‘$’ karakterleriyle
başlayamaz.
2. Tek satır açıklamalar ‘//’ ile başlar.
3. Çok satır açıklamalar ‘/*’ ile başlar ve ‘*/’ ile sonlanır.
4. Değeri simülasyon içerisinde hiç değişmeyecek yani sabit değişkenler için ‘parameter’ anahtar kelimesi kullanılır.
Modüller (Modules)
Modüller Verilog HDL tasarımının temelidir ve dijital sistem modülünden oluşan bir diziyi ifade eder. Tasarım hiyerarşisini diğer modüllerdeki, modülleri örnekleyerek oluşturulabilir. Başka bir veya daha üst seviyedeki modüldeki, modül kullanıldığında o modül örneklenmiş olur. Modüller genellikle paralel olarak çalışır ancak genellikle test verileri ve donanım modelleri içeren kapalı bir sistem belirlemek için bir üst düzey modül kullanılabilir.
Modüller davranışsal, yapısal veya ikisinin bir kombinasyonu yani hibrit olabilir. Bir davranış özellikleri, geleneksel programlama dili yapıları kullanarak dijital bir sistemin davranışını tanımlar. Bir yapısal özellikleri alt modüllerin hiyerarşi içeren bir ara bağlantı olarak dijital bir sistem davranışını ifade eder.
Modül Yapısı (Modul Structure)
module <module name> (<port list>);
<declares>
<module items>
endmodule
<modul name>: Modülü tanımlayıcı isimdir.
<port list>: Diğer modüllerle de bağlamak için kullanılan giriş, çıkış ve giriş bağlantı noktalarının listesidir.
<declares>: net ve reg değişkenleri veya wire değişken tiplerinin tanımlandığı bloktur.
<modul items>: Bu bloğa diğer modül kodları yazılır.
Sayılar (Numbers)
<size><base
format><number>
<size>:
Bit sayısının boyutunu ifade eder.
<base
format>: ' ile başlar ve sayının
tabanına göre bir karakter ile devam eder.
b: binary
d: decimal
o: octal
h: hexadecimal
<number>: ikilik, onluk, sekizlik ve
onaltılık tabanındaki sayının değeridir. Standart 32 bittir.
Tamsayı
|
Saklanma Şekli
|
1
|
00000000000000000000000000000001
|
8'hAA
|
10101010
|
6'b10_0011
|
100011
|
'hF
|
00000000000000000000000000001111
|
Eğer sayının boyutu değerden küçükse değerin en
soldaki bit’leri atılır.
Eğer sayının boyutu değerden büyükse en soldaki
bitler değerin en soldaki değerine göre doldurulur.
1. En soldaki '0' veya '1' ise '0' ile doldurulur.
2. En soldaki 'z' ise 'z' ile doldurulur.
3. En soldaki 'x' ise 'x' ile doldurulur.
Not: x
bilinmeyen değer, z ise yüksek empedansı belirtir.
Tamsayı
|
Saklanma Şekli
|
6'hCA
|
001010
|
6'hA
|
001010
|
16'bZ
|
zzzzzzzzzzzzzzzz
|
8'bx
|
xxxxxxxx
|
Verilog HDL Operatörleri
Bitsel Operatörler (Bitwise
Operators)
~ (unary)
|
NOT
|
&
|
AND
|
|
|
OR
|
^
|
XOR
|
~^
|
XNOR
|
module Bitwise (Y, A, B); input [6:0] A; input [5:0] B; output [6:0] Y; reg [6:0] Y; always @(A or B) begin Y[0]=A[0]&B[0]; Y[1]=A[1]|B[1]; Y[2]=!(A[2]&B[2]); Y[3]=!(A[3]|B[3]); Y[4]=A[4]^B[4]; Y[5]=A[5]~^B[5]; Y[6]=!A[6]; end endmodule
Mantıksal Operatörler (Logical
Operators)
!
|
Logical NOT
|
&&
|
Logical AND
|
||
|
Logical OR
|
module Logical (Y, A, B, C, D); input [2:0] A, B, C, D; output Y; reg Y; always @(A or B or C or D) begin if ((A==B) && (C>D)) Y=1; else Y=0; end endmodule
İlişkisel Operatörler (Relational
Operators)
==
|
Equal To
|
!=
|
Not Equal To
|
>=
|
Greater Than or Equal To
|
<=
|
Less Than or Equal To
|
>
|
Greater Than
|
<
|
Less Than
|
module Relational (Y1, A, B); input [2:0] A, B; output Y1; reg Y1; always @(A or B) begin if (A>B) Y1=1; else Y1=0; end endmodule
İndirgeme Operatörleri (Reduction Operators)
&
|
Reduction AND
|
~&
|
Reduction NAND
|
|
|
Reduction OR
|
~|
|
Reduction NOR
|
^
|
Reduction XOR
|
~^ ya da ^~
|
Reduction XNOR
|
module Reduction (Y1, Y2, Y3, Y4, Y5, Y6, A); input [3:0] A; output Y1, Y2, Y3, Y4, Y5, Y6; reg Y1, Y2, Y3, Y4, Y5, Y6; always @(A) begin Y1=&A; Y2=|A; Y3=~&A; Y4=~|A; Y5=^A; Y6=~^A; end endmodule
Aritmetik Operatörler (Arithmetic
Operators)
+
|
Plus
|
-
|
Minus
|
*
|
Multiply
|
/
|
Divide
|
%
|
Modulus
|
+ (unary)
|
Sign Plus
|
-
(unary)
|
Sign Minus
|
module Arithmetic (Y1, Y2, Y3, Y4, Y5, A, B); input [2:0] A, B; output [3:0] Y1; output [4:0] Y3; output [2:0] Y2, Y4, Y5; reg [3:0] Y1; reg [4:0] Y3; reg [2:0] Y2, Y4, Y5; always @(A or B) begin Y1=A+B; Y2=A-B; Y3=A*B; Y4=A/B; Y5=A%B; end endmodule
Diğer
Operatörler (Other Operators)
{ }
|
Concatenation
|
{{ }}
|
Replication
|
[ ]
|
Bit Select / Part Select
|
<<
|
Shift Left
|
>>
|
Shift Right
|
module Concatenation (Y, A, B); input [2:0] A, B; output [14:0] Y; parameter C=3'b011; reg [14:0] Y; always @(A or B) begin Y={A, B, 2{{C}}, 3'b110}; end endmodule
Bit Select / Part Select
Bitler: 0, 1 ve x (bilinmeyen değer)
Bit Vektörü: A[3:0] vektörü 4 bits: A[3], A[2], A[1], A[0]
module Bit_Vector(Y, A); input [3:0] A; output [7:0] Y; always @(A) begin Y={A[3], A[3], A[3], A[3], A[3:0]} end endmodule
Değişkenler (Varibles)
Nets ve Registers olmak üzere değişkenler için iki
veri türü vardır.
Net Değişkenler
Sadece değişken bileşenlerini birbirine atama için kullanılan değişken türüdür. (örnek: wire)
Reg Değişkenler
Bir davranış tanımının bir parçası olarak verileri
saklamak için kullanılan değişken türüdür.
reg yalnızca alwalys ve initial bloklarında
kullanılabilir.
Sürekli Atama (Continuous
Assignment)
Sürekli atama ifadesi assign anahtar kelimesi ve '=' operatörü ile atama işlemi yapılır (örnek: wire veri tipinde değişkene atama işlemi).
Atama yapılan değişken reg veri tipinde olamaz.
module Assign_Example (y, a, b); input [3:0] a, b; output [7:0] y; wire [7:0] y; assign y = {a,b}; endmodule
Prosedürel Atama (Procedural
Assignment)
<reg
variable> = <expression>
Burada <reg değişken> bir kayıt veya bellek
olmalıdır.
module initial_example(); reg clk,reset,enable,data; initial begin clk = 0; reset = 0; enable = 0; data = 0; end endmodule
İlkel Veri Tipleri (Primitive Data Types)
Önceden tanımlanmış veri tipleridir.
Fonksiyon çağırma işlemi gibi değildir, sadece ilkel tipin bir örneği kullanılabilir.
Genellikle hata ayıklama için bir örnek adı verilmesi gereklidir.
primitive primitive_syntax ( a, // Port a b, // Port b c, // Port c d // Port d ); output a; input b,c,d; // fonksiyon kodları endprimitive