🧩 Verilog’ta Modül Nedir?#
Modül, Verilog’taki en temel yapı taşıdır. Bir mantık kapısı, sayaç, ALU ya da tüm bir işlemci gibi belirli bir donanım bloğunu tanımlar.
📦 Modül Yapısı#
Modüller, hiyerarşik tasarım, yeniden kullanılabilirlik ve test edilebilirlik sağlar.
🧱 Örnek Modül#
module and_gate (
input wire a,
input wire b,
output wire y
);
assign y = a & b;
endmodule
🧱 Module Instantiation Styles (Modül Örnekleme Biçimleri)#
Verilog’da bir modülü kullanmak için, onu başka bir modül içinde instantiate (örnekleme) etmemiz gerekir. Aşağıda iki yaygın yöntemi ve çoklu örnekleme örneğini inceleyelim.
module_adi ornek_adi (a, b, y);
🔹 Positional Mapping (Konumsal Eşleme)#
Bağlantılar sıra ile yapılır. Bu yöntem kısa ama hataya açıktır.
and_gate u1 (a, b, y);
⚠️ Tehlikeli olabilir! Portların sırası modül tanımıyla birebir uyuşmalı. Sıra değişirse hatalı bağlanır ama sentez hatası vermez.
⛔ Riskli Senaryo:#
// Tanım: module and_gate (input a, input b, output y);
and_gate u1 (b, a, y); // Port sırası yanlış! a ve b karıştı!
🔹 Named Mapping ✅ (Tavsiye Edilen)#
Her porta isimle bağlantı yapılır. Daha güvenlidir ve okunabilirliği artırır.
and_gate u1 (
.a(in1),
.b(in2),
.y(out)
);
✅ Güvenlidir. Port sırası değişse bile bağlantı doğru yapılır.
💡 Avantajları:#
- Daha okunaklı
- Uzun port listelerinde hata riski daha düşüktür
- Otomatik kod üretimi ve IP çekirdeklerinde standarttır
🔁 Multiple Instances (Çoklu Örnekleme)#
Aynı modülün birden fazla kopyasını farklı sinyallerle kullanabilirsiniz:
and_gate u1 (.a(a1), .b(b1), .y(y1));
and_gate u2 (.a(a2), .b(b2), .y(y2));
Bu yapı genelde bit-paralel mantık, bus işlemleri, veya array of modules gibi durumlarda kullanılır.
🧪 assign
ile Sürekli Atama#
assign
anahtar kelimesi, kombinasyonel mantık için sürekli (continuous) atama yapmakta kullanılır.
assign y = a & b;
- Yalnızca
wire
türü sinyallerle kullanılabilir - Girişlerdeki değişiklik anında çıkış güncellenir
🔁 always
Bloğu (İşlemsel Mantık)#
always
bloğu, olaylara (ör. clock kenarı, sinyal değişimi) tepki veren işlemsel mantığı tanımlar.
✅ Genel Yapı#
always @(sensitivity_list) begin
// işlemler
end
⚙️ always @(*)
→ Kombinasyonel Mantık#
always @(*) begin
case (sel)
2'b00: y = a;
2'b01: y = b;
default: y = 0;
endcase
end
- Blocking assignment kullanılır:
=
- Bellek tutmayan mantık tanımlar
⏱️ always @(posedge clk)
→ Sıralı Mantık#
always @(posedge clk or posedge rst) begin
if (rst)
q <= 0;
else
q <= d;
end
- Non-blocking assignment (
<=
) kullanılır - Flip-flop, register gibi saatle çalışan yapılar için
🧬 Bit Seviyesinde Operatörler#
Bu operatörler vektörler üzerinde bit bit işlem yapar:
Operator | Meaning | Example |
---|---|---|
& | AND | y = a & b; |
| | OR | y = a | b; |
^ | XOR | y = a ^ b; |
~ | NOT (bitwise) | y = ~a; |
~& | NAND | y = ~(a & b); |
~| | NOR | y = ~(a | b);\ |
&&
,||
gibi mantıksal operatörlerden farklıdır — bunlar yalnızca tek bitlik sonuç verir.
🔗 Birleştirme (Concatenation) ve Tekrarlama#
🔹 Birleştirme#
assign bus = {addr, data}; // İki 8-bit veriyi 16-bit yap
🔹 Tekrarlama#
assign all_ones = {8{1'b1}}; // 8-bit boyunca 1 üret
🔹 İkisi Beraber#
assign all_in_one = {addr, data, 8{1'b1}};
📊 Özet Tablo#
Yapı | Kullanım Tipi | Atama Türü | Sinyal Tipi |
---|---|---|---|
assign | Sürekli mantık | = | wire |
always @(*) | Kombinasyonel mantık | = (blocking) | reg |
always @(posedge clk) | Sıralı mantık | <= (non-blocking) | reg |
🧠 En İyi Uygulamalar#
- ✅ Gerçek tasarımlarda isimli port bağlantısı kullan
- 📛 Anlamlı instance isimleri ver:
stage0
,AND1
,alu_unit
- 📏 Giriş/çıkış yönlerini tutarlı kullan
- ⚠️ Aynı
always
bloğu içinde=
ve<=
kullanmaktan kaçın