[RTLLM-p026] Control/Finite State Machine (FSM)/sequence_detector
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
評論