FSM görüntüleyici: Verilog ve SystemVerilog'dan durum diyagramı
Verilog ya da SystemVerilog ile yazılmış bir durum makinesini yapıştırın; durum diyagramı kodunuzun yanında, canlı ve satırlarına bağlı olarak çizilsin.
- Sınır
- 64 KiB ve en çok 32 state; uzun adlar çizimi azaltır
- Yayımlandı
- Yazarlık
- Taslağı yapay zekâ desteğiyle hazırlandı, İsmail tarafından gözden geçirildi
En çok 64 KiB, tek bir Verilog ya da SystemVerilog modülü.
sequence_detector: 5 state, 10 geçiş, binary kodlar.
“Çalıştır” bu senaryoyu baştan oynatır; bir girişe basmak buradan devam eder.
Çalışan bir state machine (durum makinesi): state diyagramı ve dalga biçimi aynı zaman ekseninde. Girişler: rst_n, sig_in. Çıkışlar: found. clk periyodu 8 tick. Makinenin 5 state'i var: IDLE, S1, S10, S101 ve S1011; reset ile IDLE state'inde başlar; 10 geçişi var. Dalga biçimi şunları gösteriyor: clk, rst_n, sig_in, state, found.
Şekil 1. “Çalıştır” düğmesine basın: reset sequence_detector modülünü IDLE state'inde tutar, sonra bırakır; girişleri çizimin altındaki düğmelerle sürün.
// Detects the bit sequence 1011 on sig_in, with overlap: 1011011 is found twice.
//
// Reset style for this module: asynchronous, active low. One style per page,
// stated up front, so nothing on the page has to be read twice.
module sequence_detector (
input logic clk,
input logic rst_n,
input logic sig_in,
output logic found
);
typedef enum logic [2:0] {
IDLE = 3'd0,
S1 = 3'd1,
S10 = 3'd2,
S101 = 3'd3,
S1011 = 3'd4
} state_t;
state_t state, next;
// The state register: the only flip-flops in the module.
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= IDLE;
end else begin
state <= next;
end
end
// Next state. The default assignment holds the state when no branch fires,
// so no arm can leave a latch behind.
always_comb begin
next = state;
unique case (state)
IDLE: begin
if (sig_in) next = S1;
else if (!sig_in) next = IDLE;
end
S1: begin
if (!sig_in) next = S10;
else if (sig_in) next = S1;
end
S10: begin
if (sig_in) next = S101;
else if (!sig_in) next = IDLE;
end
S101: begin
if (sig_in) next = S1011;
else if (!sig_in) next = S10;
end
S1011: begin
if (!sig_in) next = S10;
else if (sig_in) next = S1;
end
default: next = IDLE;
endcase
end
// Moore output: a function of the state alone.
always_comb begin
found = 1'b0;
unique case (state)
S1011: found = 1'b1;
default: found = 1'b0;
endcase
end
endmoduleSonuç nasıl okunur
Çizim, modülünüzün geri okunmuş hâlidir. Her stadyum bir state'tir (durum); adı kodunuzdaki adıdır, Moore çıkışları adının altında yazılıdır. Her ok bir geçiştir; üzerinde, kodun sınadığı biçimiyle koşulu ve bir Mealy makinesinde geçiş sırasında sürdüğü çıkışlar yazılıdır. Bir state'e giren kısa ok reset'tir.
Çizim ile kod iki yönde de birbirine bağlıdır. Bir state'in üzerine gelin ya da klavyeyle ona
ulaşın: onu oluşturan satırlar figürün yanındaki kodunuzda yanar: bir state için case'in kolu,
bir ok için if'in dalı, bir girişin düğmesi için portun satırı. Bir satırın üzerine gelin,
çizimdeki karşılığı yanar.
Figürün tek bir senaryosu var: Reset. “Çalıştır” düğmesine basın: reset makineyi, asenkronsa en baştan, senkronsa ilk clock kenarından itibaren reset state'inde tutar, sonra bırakır. Bundan sonra girişleri çizimin altındaki düğmelerle siz sürersiniz; dalga biçimi her kenarı kaydeder: clock, reset, girişler, state ve çıkışlar, ilk on ikisi.
Otomatik yerleşim bir makineyi çizemediğinde figürün yerini iki tablo alır: çıkışlarıyla state'ler ve koşullarıyla geçişler. Tablonun her satırı, çizimdeki bir parça gibi koddaki kendi satırlarını yakar. Tabloların üstündeki cümle nedenini yerleşimin kendi terimleriyle söyler: state'lerin kaç ızgara birimi gerektirdiğini ya da hangi etiketin yer bulamadığını.
Neyi okur
SystemVerilog ya da Verilog ile yazılmış tek bir modül: if (rst) ya da if (!rst_n) altında
reset'lenen bir state register'ı (reset senkron ya da asenkron olabilir, adı da önemli değildir),
kombinasyonel bir blokta ya da clock'lu bloğun kendisinde hesaplanan sonraki state, state başına ya
da geçiş başına atanan çıkışlar. Ders kitaplarının ve derslerin üslupları okunur: Verilog-1995'te
parameter, Verilog-2001'de parameter ve localparam kodları, SystemVerilog'da bir enum, bir,
iki ya da üç process, her harf büyüklüğünde ve en çok 24 karakterlik state adları, binary, Gray ve
one-hot kodlar.
Ya tam okur ya hiç okumaz. Bir okun üzerindeki koşul, kodunuzun o dala girdiği koşuldur; state'in kodundaki her yol üzerinden çıkarılır, kodun ne demek istediğine dair bir tahmin değildir. Bunu güvenceye almak için aracın test korpusunda okuduğu her makine aynı girişlerle hem kendi koduyla Icarus Verilog'da hem de çizimden figürün motorunda çalıştırıldı: araya reset'ler serpiştirilmiş, 220 clock periyotluk üç koşu; state ve her çıkış her adımda karşılaştırıldı ve hiçbiri farklı çıkmadı.
Neyi okumaz, ne yapmalı
Okuyamadığı kodu adıyla, satırı ve sütunuyla reddeder; “Satıra git” onu alanda seçer. En sık red,
state'in yanındaki ikinci bir register'dır: bir sayaç, bir zamanlayıcı, bir bayrak. Figürün
koşulları makinenin girişleridir; kendi sayacını okuyan bir makine için doğru olacak bir çizim
yoktur. Makinenin sayaçtan okuduğu değeri bir giriş yapın, count == 4'd9 yerine count_done
gibi; sonra kodu yeniden yapıştırın. Bir koşuldaki bit seçimi ve kendinize özgü bir kodlama, yani
binary, Gray ya da one-hot olmayan bir sırada kodlar da aynı biçimde reddedilir; her cümle,
görüntüleyicinin bunun yerine neyi okuduğunu söyler.
Sınırlar
Alan 64 KiB alır. Görüntüleyici en çok 32 state, 8 giriş ve 8 çıkış ile en çok 24 karakterlik state
adlarını okur. Sinyal adları küçük harf, rakam ve _ ile yazılır, bir vektörün aralığı da
[msb:0] biçimindedir: Clock ya da reg [2:1] y yazan bir ders kitabı kodu o satırda
reddedilir. Kodunuza bir bağlantı en çok 3.900 karakter taşır; korpustaki her makine buna sığar.
Daha uzun bir modül yapıştırılabilir ama bağlantıya dönüştürülemez.
Ne kadarının çizildiği, state sayısından çok adlara bağlıdır. Korpusta görüntüleyicinin okuduğu 42 makineden 24'ü çiziliyor, hepsi 2 ile 6 arası state'li; geri kalanı tablo olarak görünüyor. Uzun port adları uzun ok etiketleri, uzun çıkış adları geniş stadyumlar demektir.
Kodunuz sayfadan hiç çıkmaz. Okuma ve çizim tarayıcınızda olur; bağlantı yalnızca siz istediğinizde oluşturulur.