Menu
Coddy logo textTech

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 konumu

Parameter 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];
endmodule

Localparam

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
endmodule

Değişmemesi gereken sabitler için localparam kullanın.

challenge icon

Görev

Varsayılan değeri 4 olan WIDTH adında bir parametre ekleyin.

Yapılacaklar:

  1. WIDTH adında bir parametre ekleyin
  2. Varsayılan değerini 4 olarak ayarlayın
  3. 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
);

endmodule
quiz iconKendini test et

Bu 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