Parametreler
Coddy'nin Verilog Journey'sinin Temeller bölümünün bir parçası — ders 11 / 90.
Aynı modülün birçok kopyasını oluşturabilir ve bunları farklı yerlerde kullanabilirsiniz — buna **çoklu örnekleme** (multiple instances) denir. Aynı kodu tekrar tekrar yazmak yerine, bir kez yazar ve ihtiyacınız olduğu kadar yeniden kullanırsınız. Her bir örnek, çip üzerindeki o donanımın ayrı bir kopyasıdır.
Peki ya her bir kopyanın farklı olması gerekirse? Örneğin, bir adet 8-bit counter, bir adet 16-bit counter ve bir adet 32-bit counter. Parametreler olmadan, üç ayrı module yazmanız gerekirdi.
Parametreler bu sorunu çözer.
Bir parameter, **bir örnek oluşturduğunuzda** ayarlayabileceğiniz bir **sabit değerdir**. Modülün her bir kopyasını farklı şekilde yapılandırmanıza olanak tanır.
Parametre Bildirimi
module counter #(
parameter WIDTH = 8
)(
input clk,
output reg [WIDTH-1:0] count
);
always @(posedge clk) count <= count + 1;
endmodule#(parameter WIDTH = 8) ifadesi, 8 varsayılan değerine sahip WIDTH adında bir parameter tanımlar.
Parametreleri tanımlarken, # sembolünü modül adının hemen ardından ve port listesinden önce kullanırız. # işareti, Verilog'a ardından gelenlerin modülü yapılandıran bir parametre listesi olduğunu söyler. Eğer modülünüzde parametre yoksa, # sembolünü tamamen atlarsınız.
Parametreleri Kullanma
Parametreler, sabit bir değerin gerektiği her yerde kullanılabilir:
reg [WIDTH-1:0] data; // Vektör boyutu
count <= count + 1; // Herhangi bir genişlikle çalışır
assign out = data[WIDTH-1]; // MSB konumuParameter Değerlerini Değiştirme (Overriding Parameters)
Modülü kullandığınızda parameter değerini değiştirebilirsiniz:
// Varsayılan genişlik (8 bit)
counter u1 (.clk(clk), .reset(reset), .count(count1));
// 16 bit'e geçersiz kıl
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));Multiple Parameters
Birden fazla parameter kullanabilirsiniz:
module fifo #(
parameter DEPTH = 16,
parameter WIDTH = 8
)(
input clk, wr_en, rd_en,
input [WIDTH-1:0] data_in,
output [WIDTH-1:0] data_out
);
reg [WIDTH-1:0] memory [0:DEPTH-1];
endmoduleLocalparam
Bir localparam benzerdir ancak dışarıdan overridden yapılamaz (üzerine yazılamaz):
module example;
localparam STATE_IDLE = 2'b00;
localparam STATE_RUN = 2'b01;
localparam STATE_STOP = 2'b10;
// These values are fixed inside this module
endmoduleDeğişmemesi gereken sabitler için localparam kullanın.
Görev
Varsayılan değeri 4 olan WIDTH adında bir parametre ekleyin.
Yapılacaklar:
WIDTHadında bir parametre ekleyin- Varsayılan değerini
4olarak ayarlayın - Parametre, modül adından sonra
#( )içine yazılır
Kendin dene
module counter #(
// Buraya varsayılan 4 ile WIDTH parametresini ekle
)(
input clk,
input reset,
output reg [WIDTH-1:0] count
);
endmoduleBu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Temeller bölümündeki tüm dersler
4Operatörler Bölüm 1
Aritmetik OperatörlerModül OperatörüKarşılaştırma OperatörleriÖzet - Basit MatematikBitsel Operatörler7Atama ve Kapılar
Sürekli AtamaOperatörlerle AtamaYerleşik Kapı PrimitifleriAND OR NOT KapılarıXOR XNOR KapılarıÖzet - Mantık Kapısı Devresi10Karar Yapıları
If İfadesiIf - ElseÖzet - Basit KarşılaştırıcıCase İfadesiCasex ve CasezÖzet - ALU Tasarımı5Operatörler Bölüm 2
Mantıksal Operatörlerİndirgeme OperatörleriKaydırma OperatörleriBirleştirme OperatörüKoşullu OperatörÖzet - Operatör Meydan Okuması11Döngüler
For DöngüsüWhile DöngüsüRepeat DöngüsüSonsuz DöngüDevre Dışı Bırakma İfadesiÖzet - Döngü Kalıpları3Sayı Sistemleri
İkilik GösterimBoyutlandırılmış SayılarBoyutlandırılmamış SayılarNegatif SayılarÖzel Değerler X ve ZÖzet - Sayı Formatları6Modüller
Modül YapısıGiriş ve Çıkış PortlarıInout PortlarıModül Örneklendirmeİsme Göre Port EşlemeSıraya Göre Port EşlemeÖzet - Bir Modül Oluşturun9Prosedürel Bloklar
Always BloğuInitial BloğuDuyarlılık ListesiEngelleyici AtamaEngelleyici Olmayan AtamaÖzet - Always vs Initial15Trafik Işığı Kontrolcüsü
Durumları TanımlamaDurum Makinesi Mantığı