Verilog HDL ile Sayısal Tasarım I (Digital Design with Verilog HDL I)

watch_later 2/26/2016
comment 4 Comments
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
Verilog HDL Sözdizim Yapısı
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 ederTasarı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) 

(unary)
Reduction AND
~& (unary)
Reduction NAND
|(unary)
Reduction OR
~|(unary)
Reduction NOR
(unary)
Reduction XOR
~^ ya da ^~ (unary)
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




Bir sonraki yazımda görüşmek üzere...
avatar
Adsız

Teşekkürler, çok istifade ettim. devamı ümidiyle...

delete 11 Mart 2016 23:29
avatar
Adsız

Ayrıca kodlara yorum satır eklemiz daha faydalı olur, thanks

delete 11 Mart 2016 23:30
avatar

Önerilerinizi dikkate alacağım, teşekkürler.

delete 11 Mart 2016 23:35
avatar

Merhaba. Ücret karşılığında Verilog'da küçük bir program yazdırmak istiyorum. İlgilenir misiniz? İlgilenirseniz bana ahmet_taskeser@hotmail.com adresinden yazabilir misiniz? Teşekkürler.

delete 28 Temmuz 2019 21:41



sentiment_satisfied Emoticon