[RTLLM-p048] Miscellaneous/Others/pulse_detect


提交解答


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

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

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_0
  • data_in = 1:保持 IDLE
GOT_0
  • data_in = 0:保持 GOT_0
  • data_in = 1:進入 GOT_01

連續輸入多個 0 時,最後一個 0 仍可作為下一個脈衝的起點。

GOT_01
  • data_in = 0:偵測到 010,令 data_out = 1,並進入 GOT_0
  • data_in = 1:序列不符合,返回 IDLE

偵測完成後進入 GOT_0,是因為 010 最後的 0 可以同時作為下一個 010 的第一個 0。


設計要求

  1. 模組名稱必須為 pulse_detect
  2. clk 上升沿取樣 data_in
  3. 偵測連續的 010 輸入序列。
  4. 偵測完成時,data_out 輸出 1。
  5. data_out 只維持一個時脈週期。
  6. 必須支援重疊脈衝,例如 01010
  7. rst_n 為低電位有效的非同步 Reset。
  8. Reset 時將狀態與 data_out 清除。
  9. 時序邏輯必須使用 nonblocking assignment。

程式模板

module pulse_detect (
    input      clk,
    input      rst_n,
    input      data_in,
    output reg data_out
);

    // Write your code here

endmodule

評論

目前沒有評論。