[RTLLM-p026] Control/Finite State Machine (FSM)/sequence_detector


提交解答


分數: 5
時間限制: 2.0s
記憶體限制: 256M

作者:
題目代碼
題目類型
允許的語言
Verilog

4 位元序列偵測器:偵測 1001

題目說明

請設計一個名為 sequence_detector 的序列偵測器,用來偵測串列輸入資料中的二進位序列:

1001

輸入訊號 data_in 每個時脈週期提供一個位元。

當連續輸入的四個位元為:

1, 0, 0, 1

時,輸出:

sequence_detected = 1

否則:

sequence_detected = 0

此設計使用有限狀態機追蹤目前已匹配的序列前綴。


模組介面

方向 位元寬度 說明
clk input 1 時脈訊號
reset_n input 1 低電位有效重置訊號
data_in input 1 串列輸入資料
sequence_detected output 1 偵測到 1001 時輸出高電位

Reset 說明

雖然題目文字提到「當 reset 為高時重置」,但訊號名稱為:

reset_n

且原始測試程式使用:

rst_n = 0;
#2 rst_n = 1;

因此本題應將 reset_n 視為:

低電位有效重置

當:

reset_n = 0

時,FSM 必須回到 IDLE 狀態。


狀態定義

本題使用五個狀態:

狀態 說明
IDLE 尚未匹配任何有效位元
S1 已匹配 1
S2 已匹配 10
S3 已匹配 100
S4 已完整匹配 1001

當 FSM 進入 S4 時:

sequence_detected = 1

狀態轉移

IDLE

尚未找到序列開頭。

data_in = 0 → IDLE
data_in = 1 → S1

S1

已收到:

1
data_in = 0 → S2
data_in = 1 → S1

若再次收到 1,新的 1 仍然可以作為下一個 1001 的開頭。


S2

已收到:

10
data_in = 0 → S3
data_in = 1 → S1

S3

已收到:

100
data_in = 0 → IDLE
data_in = 1 → S4

當收到 1 時,完整序列:

1001

已經被偵測。


S4

已完整偵測到:

1001

此時:

sequence_detected = 1

下一個狀態必須考慮連續輸入:

data_in = 0 → S2
data_in = 1 → S1

因為完整序列 1001 的最後一個位元為 1,這個位元也可以視為下一個序列的第一個位元。


設計要求

  • 模組名稱必須為 sequence_detector
  • 必須偵測序列 1001
  • reset_n 為低電位有效重置。
  • Reset 時回到 IDLE
  • 使用有限狀態機實作。
  • 每個 clk 上升沿取樣一次 data_in
  • 完整偵測到 1001 時,sequence_detected 必須為 1
  • 支援連續輸入。
  • 支援重疊序列。
  • 未偵測到完整序列時,輸出必須為 0

程式設計模板

module sequence_detector (
    input  clk,
    input  reset_n,
    input  data_in,
    output sequence_detected
);

    // Write your code here

endmodule

評論

目前沒有評論。