Verilog Hile Sayfası
Son güncelleme
Modül yapısı ve portlar
Modül temel yapı taşıdır - bir adı ve bir port listesi vardır.
| Söz dizimi | Anlamı |
|---|---|
module adder(...); ... endmodule | Bir modülü ve gövdesini tanımla |
input clk; | Bir giriş portu |
output q; | Bir çıkış portu |
output reg q; | Bir always bloğundan sürülen bir çıkış |
input [7:0] data; | 8 bitlik bir giriş veri yolu (vektör) |
inout sda; | Çift yönlü bir port |
adder u1 (.a(x), .b(y), .sum(s)); | Bir modülü adlandırılmış portlarla örnekle (instantiate) |
Veri tipleri
wire bir bağlantıyı modeller; reg, prosedürel kodun atadığı bir değeri tutar.
| Element | Ne yapar |
|---|---|
wire w; | assign veya bir modül çıkışı tarafından sürülen bir net |
reg r; | Bir always/initial bloğu içinde atanan bir değeri tutar |
wire [3:0] bus; | 4 bitlik bir vektör (bit 3'ten 0'a) |
reg [7:0] count; | 8 bitlik bir register |
bus[2] | Tek bir biti seç |
bus[3:1] | Bir bit dilimini seç (part-select) |
reg mem [0:255]; | Bir bellek: register'lardan oluşan bir dizi |
parameter WIDTH = 8; | Modül için adlandırılmış bir sabit |
Sayı değişmezleri
Biçim <size>'<base><value> şeklindedir - bit cinsinden boyut, taban b/o/d/h olarak.
| Söz dizimi | Anlamı |
|---|---|
4'b1010 | 4 bitlik ikili, değer 10 |
8'hFF | 8 bitlik onaltılık, değer 255 |
8'hff | Aynısı - onaltılık basamaklar büyük/küçük harf duyarsızdır |
16'd255 | 16 bitlik ondalık, değer 255 |
3'o7 | 3 bitlik sekizlik, değer 7 |
8'b1010_1100 | Alt çizgiler okunabilirlik için basamakları gruplar |
1'bx | Bilinmeyen (x) bit değeri |
1'bz | Yüksek empedanslı (z) bit değeri |
Operatörler
Bit düzeyinde, mantıksal, karşılaştırma ve indirgeme (reduction) operatörleri.
| Operatör | Ne yapar |
|---|---|
& | ^ ~ | Bit düzeyinde AND, OR, XOR, NOT |
&& || ! | Mantıksal AND, OR, NOT (1 bit döndürür) |
== != < > <= >= | Karşılaştırma operatörleri |
<< >> | Sola ve sağa kaydırma |
+ - * / % | Aritmetik operatörler |
&bus | İndirgeme AND (tüm bitlerin AND'i) |
|bus | İndirgeme OR (tüm bitlerin OR'u) |
^bus | İndirgeme XOR (tüm bitlerin pariteleri) |
{a, b} | Birleştirme (concatenation); {4{1'b1}}, 4'b1111'e çoğaltır |
Sürekli atama
assign bir wire'ı sürekli olarak sürer - onu kombinasyonel mantık için kullanın.
| Söz dizimi | Anlamı |
|---|---|
assign y = a & b; | y'yi a ile b'nin AND'iyle sür |
assign sum = a + b; | Sürekli olarak bir toplam hesapla |
assign y = sel ? a : b; | Üçlü (ternary) - 2'den 1'e çoklayıcı (mux) |
assign {c, s} = a + b; | Eldeyi (carry) ve toplamı birlikte yakala |
assign y = ~en; | Bir wire'ı tersine çevrilmiş bir sinyalden sür |
Prosedürel bloklar
always ve initial ifade çalıştırır; duyarlılık listesi ne zaman olacağını kontrol eder.
| Söz dizimi | Anlamı |
|---|---|
always @(*) begin ... end | Kombinasyonel mantık (herhangi bir giriş değişikliği) |
always @(posedge clk) | Her yükselen saat kenarında çalış (ardışıl) |
always @(negedge clk) | Her düşen saat kenarında çalış |
always @(posedge clk or posedge rst) | Asenkron reset'li saatli blok |
initial begin ... end | Zaman 0'da bir kez çalış (testbench'ler, yalnızca simülasyon) |
begin ... end | Birden fazla ifadeyi grupla |
#10 | 10 zaman birimi geciktir (yalnızca simülasyon) |
Blocking ile non-blocking
Kombinasyonel mantık için =, saatli ardışıl mantık için <= kullanın.
| Söz dizimi | Anlamı |
|---|---|
a = b; | Blocking - sırayla, hemen çalışır |
a <= b; | Non-blocking - önce tüm sağ taraflar okunur, sonra atanır |
always @(*) y = a & b; | Kombinasyonel: blocking = kullan |
always @(posedge clk) q <= d; | Bir flip-flop: non-blocking <= kullan |
Tek bir blokta = ve <= karıştırmak | Bundan kaçının - yaygın bir hata kaynağı |
Kontrol akışı
Prosedürel blokların içinde koşullar ve çok yollu dallanmalar.
| Söz dizimi | Anlamı |
|---|---|
if (cond) ... else ... | Koşullu ifade |
if (a) x = 1; else x = 0; | Tek satırlık if/else |
case (sel) ... endcase | Bir değer üzerinde çok yollu dallanma |
2'b00: y = a; | Bir case öğesi |
default: y = 0; | Yedek case öğesi |
for (i = 0; i < 8; i = i + 1) | Döngü (genellikle generate veya simülasyon içinde) |
repeat (4) @(posedge clk); | Bir ifadeyi N kez tekrarla |
Yaygın desenler
Tekrar tekrar yazdığınız yapı taşları, ayrıca testbench görevleri.
| Desen | Söz dizimi |
|---|---|
| D flip-flop | always @(posedge clk) q <= d; |
| Reset'li register | always @(posedge clk) if (rst) q <= 0; else q <= d; |
| Sayaç | always @(posedge clk) count <= count + 1; |
| FSM durum register'ı | always @(posedge clk) state <= next_state; |
| FSM sonraki-durum mantığı | always @(*) case (state) ... endcase |
| Bir değeri yazdır | $display("q = %b", q); |
| Değişiklikte yazdır | $monitor("t=%0t q=%b", $time, q); |
| Simülasyonu bitir | $finish; |
Başvurduğunuz her Verilog söz dizimi parçası tek sayfada. Bu Verilog hile sayfası, donanım tanımlama dili için hızlı bir başvurudur - modülleri ve portları bildirme, veri tiplerini seçme, kombinasyonel ve ardışıl mantık yazma ve gerçek devreleri tanımlayan always-bloğu desenleri.
Buradaki söz dizimi standart Verilog'dur (IEEE 1364) ve Icarus Verilog ile Verilator gibi yaygın simülatörlerde çalışır. İhtiyacınız olanı kopyalayın ya da Verilog playground'da canlı deneyin - bir modül yazın, simüle edin ve çıktıyı tarayıcınızda görün.
Verilog hile sayfası SSS
Bu Verilog hile sayfası ücretsiz mi?
wire ile reg arasındaki fark nedir?
wire fiziksel bir bağlantıyı modeller ve sürekli olarak sürülmelidir - bir assign ifadesi veya bir modül çıkışı tarafından - bu yüzden onu kombinasyonel net'ler için kullanırsınız. Bir reg, prosedürel kod değiştirene kadar değerini tutar, dolayısıyla bir always veya initial bloğu içinde atanan her şey için onu kullanırsınız. Adına rağmen, bir reg her zaman bir donanım register'ına dönüşmez; yalnızca değerin prosedürel olarak ayarlandığı anlamına gelir.Blocking ile non-blocking atama arasındaki fark nedir?
=), normal bir programlama ifadesi gibi hemen ve sırayla çalışır, bu yüzden onu always @(*) bloklarında kombinasyonel mantık için kullanın. Non-blocking atama (<=), önce tüm sağ tarafları değerlendirir ve sonra sol tarafları birlikte günceller; bu da flip-flop'ları doğru şekilde modeller - dolayısıyla onu saatli always @(posedge clk) bloklarında kullanın. İkisini tek bir blokta karıştırmak klasik bir simülasyon hata kaynağıdır.