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 yazarsınız ve ihtiyacınız olduğu kadar çok kez yeniden kullanırsınız. Her bir örnek, o donanımın çip üzerindeki ayrı bir kopyasıdır.

Peki ya her bir kopyanın farklı olmasını isterseniz? Örneğin, bir adet 8-bitlik sayaç, bir adet 16-bitlik sayaç ve bir adet 32-bitlik sayaç. Parametreler olmadan, üç ayrı modül yazmanız gerekirdi.

Parametreler bu problemi çözer.

Bir parametre, bir örnek oluşturduğunuzda ayarlayabileceğiniz sabit bir 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), varsayılan değeri 8 olan WIDTH adlı bir parametre tanımlar.

Parametreleri tanımlarken, # sembolünü modül adından hemen sonra ve port listesinden önce kullanırız. #, Verilog'a arkasından gelenin modülü yapılandıran bir parametre listesi olduğunu söyler. Eğer modülünüzün parametresi yoksa, # işaretini tamamen atlarsınız.

Parametreleri Kullanma

Parametreler, bir sabitin gerekli olduğu her yerde kullanılabilir:

reg [WIDTH-1:0] data;        // Vektör boyutu
count <= count + 1;           // Herhangi bir genişlikte çalışır
assign out = data[WIDTH-1];   // MSB konumu

Parametreleri Geçersiz Kılma

Modülü kullandığınızda, parametre değerini değiştirebilirsiniz:

// Varsayılan genişlik (8 bit)
counter u1 (.clk(clk), .reset(reset), .count(count1));

// 16 bit olarak geçersiz kıl
counter #(.WIDTH(16)) u2 (.clk(clk), .reset(reset), .count(count2));

Çoklu Parametreler

Birden fazla parametreye sahip olabilirsiniz:

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 geçersiz kılınamaz:

module example;
  localparam STATE_IDLE = 2'b00;
  localparam STATE_RUN = 2'b01;
  localparam STATE_STOP = 2'b10;
  // Bu değerler bu modül içinde sabittir
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

Kopya kağıdı

Parametreler, kodun yeniden yazılmasına gerek kalmadan modül örneklerinin farklı şekilde yapılandırılmasına olanak tanır.

Parametrelerin Bildirilmesi

module counter #(
  parameter WIDTH = 8  // default value
)(
  input clk,
  output reg [WIDTH-1:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

Örnekleme Sırasında Parametrelerin Geçersiz Kılınması (Overriding)

counter u1 (.clk(clk), .count(count1));          // uses default (8)
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2)); // overridden to 16

Çoklu Parametreler

module fifo #(
  parameter DEPTH = 16,
  parameter WIDTH = 8
)( ... );

Localparam (Geçersiz Kılınamayan Sabit)

localparam STATE_IDLE = 2'b00;
localparam STATE_RUN  = 2'b01;

Modül dışından değiştirilmemesi gereken dahili sabitler için localparam kullanın.

Kendin dene

module counter #(
  // Buraya varsayılan değeri 4 olan WIDTH parametresini ekleyin
  
)(
  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