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 |
|---|---|---|
| S0 | S0、hit=0 | S1、hit=0 |
| S1 | S10、hit=0 | S1、hit=0 |
| S10 | S0、hit=0 | S1、hit=1 |
每欄是一次上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容的觀察紀錄。輸入為邊緣前值,名稱含「後」的狀態為更新後值。欄位對齊表示取樣順序,並未繪出實體傳播延遲傳播延遲是輸入改變後,輸出穩定至正確值所需的時間。邏輯式是否等價與時間特性是兩個不同問題。 詳細內容。
重設後從 S0 開始,每欄 valid 都為 1。第三位偵測後保留 S1,因此第五位也可偵測。
查看波形資料
| 訊號 | 波形 | 匯流排值 |
|---|---|---|
| 接受位元 | 10101 | |
| state 後 | 23452 | S1 → S10 → S1 → S10 → S1 |
| hit 後 | 0.101 |
實作暫存的偵測輸出
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
endmoduleHit 將狀態與該邊緣接受輸入所算出的值存入暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容,不會像純組合 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 當成下一樣式起點,因而漏掉第五次輸入的偵測。