Altifigence Academy

29 / 37 · 概念

綜合設計:重疊 101 樣式偵測器

在同一設計中運用狀態最小化、輸入有效性、暫存輸出與獨立參考驗證。

先固定需求

在 valid=1 的上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容接受一個 bit_in。最近接受位元的結尾若為 101,該邊緣後一週期 hit=1。允許重疊,因此 10101 的第三與第五位都應有 hit。valid=0 時保持狀態、hit=0;reset 則初始化狀態與 hit。

只儲存需要的過去資訊

S0 表示沒有匹配前綴,S1 表示結尾為 1,S10 表示結尾為 10。完成 101 後,最後的 1 可成為下一樣式起點,因此回到 S1。

目前狀態接受位元 0接受位元 1
S0S0、hit=0S1、hit=0
S1S10、hit=0S1、hit=0
S10S0、hit=0S1、hit=1

每欄是一次上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容的觀察紀錄。輸入為邊緣前值,名稱含「後」的狀態為更新後值。欄位對齊表示取樣順序,並未繪出實體傳播延遲傳播延遲是輸入改變後,輸出穩定至正確值所需的時間。邏輯式是否等價與時間特性是兩個不同問題。 詳細內容。
重設後從 S0 開始,每欄 valid 都為 1。第三位偵測後保留 S1,因此第五位也可偵測。

10101 中的兩次重疊偵測
查看波形資料
波形資料:每個字元表示一個區間;句點保持先前狀態;p 表示一個時脈週期。
訊號波形匯流排值
接受位元10101
state 後23452S1 → S10 → S1 → S10 → S1
hit 後0.101

實作暫存的偵測輸出

SystemVerilog
module pattern_101 (
  input logic clk, rst, valid, bit_in,
  output logic hit
);
  typedef enum logic [1:0] {S0, S1, S10} state_t;
  state_t state;
  always_ff @(posedge clk) begin
    if (rst) begin
      state <= S0;
      hit <= 1'b0;
    end else begin
      hit <= 1'b0;
      if (valid) begin
        case (state)
          S0: state <= bit_in ? S1 : S0;
          S1: state <= bit_in ? S1 : S10;
          S10: begin
            state <= bit_in ? S1 : S0;
            hit <= bit_in;
          end
          default: state <= S0;
        endcase
      end
    end
  end
endmodule

Hit 將狀態與該邊緣接受輸入所算出的值存入暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容,不會像純組合 Mealy 輸出那樣立即回應邊緣間的 bit_in 變動。此設計以一般 SystemVerilog 審查;提供的單一時脈練習引擎是否支援語法及其執行證據,須另行確認。

獨立計算合格標準

只把接受的位元組成字串,長度至少三時比較最後三字是否為 101,即可建立參考模型,不必複製 FSM狀態機依儲存的狀態與輸入決定下一狀態及輸出。必須一併定義狀態轉移、輸出與重設規則。 詳細內容 狀態編碼。

  • 101 → hit 位置 3。
  • 10101 → hit 位置 3、5。
  • 11101 → hit 位置 5。
  • 1001 → 無偵測。
  • 1、0 後 reset,再送 1 → 無偵測。
  • 在 1、0 之間或之後插入 valid=0 → 依接受序號的結果相同。

下方位元序列練習檢查連續有效輸入的功能,不應解讀為已驗證 reset、valid 暫停或實體時序。

變更輸入以觀察結果

自己試試看

若修改成偵測 101 後回到 S0,最短哪個輸入序列會與原規格不同?

查看解說

10101。正確電路偵測第三與第五個輸入;若回 S0,就無法把第一次偵測末尾的 1 當成下一樣式起點,因而漏掉第五次輸入的偵測。

此選擇適用於本瀏覽器,隨時可從頁尾變更。