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

Bu sayfayı İngilizce oku

En çok 64 KiB, tek bir Verilog ya da SystemVerilog modülü.

sequence_detector: 5 state, 10 geçiş, binary kodlar.

sig_in37. satır!sig_in!sig_insig_insig_in!sig_in46. satırsig_in49. satır!sig_in50. satır!sig_in53. satırsig_in54. satırrst_n23–29. satırIDLES1S10S10148–51. satırS1011found=1

“Ç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.

sequence_detector.sv
// 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

endmodule

Sonuç 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.

Bir hata mı buldunuz? Düzeltme gönderin