🧩 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
🔌 Modül Portları ve Türleri #
Portlar, bir modülün dış dünya ile nasıl iletişim kurduğunu tanımlar.
Anahtar Kelime | Yön | Açıklama |
---|---|---|
input |
Giriş | Modüle veri girer, sadece okunur |
output |
Çıkış | Modülden veri çıkar, wire veya reg olabilir |
inout |
Çift yönlü | Ortak veriyolu gibi yapılar için |
🧱 Modül Kullanımı (Instance) #
Tanımlanan bir modül, başka modüller içinde kullanılabilir.
🔹 Sıralı Bağlantı (Positional) #
and_gate u1 (a, b, y);
⚠️ Port sırası tanımla birebir aynı olmalı.
🔹 İsimle Bağlantı ✅ (Tavsiye Edilen) #
and_gate u1 (
.a(in1),
.b(in2),
.y(out)
);
🔁 Çoklu Instance #
Aynı modül, farklı sinyallerle birden fazla kez kullanılabilir:
and_gate u1 (.a(a1), .b(b1), .y(y1));
and_gate u2 (.a(a2), .b(b2), .y(y2));
🧪 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
📊 Ö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