[RTLLM-p048] Miscellaneous/Others/pulse_detect
010 脈衝偵測器
請設計一個名為 pulse_detect 的同步脈衝偵測模組。
輸入 data_in 為連續的 1 位元訊號,模組在每個 clk 上升沿取樣一次。當連續三個取樣值依序為:
0 → 1 → 0
即視為偵測到一個完整脈衝。
當收到最後一個 0 時,輸出 data_out 必須在該時脈週期輸出 1,並在下一個週期恢復為 0,直到再次偵測到新的 010 序列。
脈衝序列允許重疊。例如:
data_in = 0 1 0 1 0
data_out = 0 0 1 0 1
第一個 010 出現在第 1 至第 3 個週期,第二個 010 出現在第 3 至第 5 個週期。
模組名稱
pulse_detect
輸入埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
clk |
1 | 時脈訊號 |
rst_n |
1 | 低電位有效的非同步 Reset |
data_in |
1 | 欲偵測的輸入訊號 |
輸出埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
data_out |
1 | 偵測到完整 010 序列時輸出 1 |
狀態定義
模組使用三個狀態記錄目前已符合的輸入序列。
| 狀態 | 說明 |
|---|---|
IDLE |
尚未符合任何有效前綴 |
GOT_0 |
已收到序列 0 |
GOT_01 |
已收到序列 01 |
狀態轉移
IDLE
data_in = 0:進入GOT_0data_in = 1:保持IDLE
GOT_0
data_in = 0:保持GOT_0data_in = 1:進入GOT_01
連續輸入多個 0 時,最後一個 0 仍可作為下一個脈衝的起點。
GOT_01
data_in = 0:偵測到010,令data_out = 1,並進入GOT_0data_in = 1:序列不符合,返回IDLE
偵測完成後進入 GOT_0,是因為 010 最後的 0 可以同時作為下一個 010 的第一個 0。
設計要求
- 模組名稱必須為
pulse_detect。 - 在
clk上升沿取樣data_in。 - 偵測連續的
010輸入序列。 - 偵測完成時,
data_out輸出 1。 data_out只維持一個時脈週期。- 必須支援重疊脈衝,例如
01010。 rst_n為低電位有效的非同步 Reset。- Reset 時將狀態與
data_out清除。 - 時序邏輯必須使用 nonblocking assignment。
程式模板
module pulse_detect (
input clk,
input rst_n,
input data_in,
output reg data_out
);
// Write your code here
endmodule
評論