[RTLLM-p047] Miscellaneous/Others/edge_detect
上升沿與下降沿偵測器
請設計一個名為 edge_detect 的邊沿偵測模組,用來偵測輸入訊號 a 的上升沿與下降沿。
當輸入訊號由 0 變成 1 時,代表偵測到上升沿,輸出 rise 必須在下一個時脈週期輸出 1。
當輸入訊號由 1 變成 0 時,代表偵測到下降沿,輸出 down 必須在下一個時脈週期輸出 1。
rise 與 down 只維持一個時脈週期。若沒有偵測到對應的邊沿,輸出必須回到 0。
模組名稱
edge_detect
輸入埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
clk |
1 | 時脈訊號 |
rst_n |
1 | 低電位有效的非同步 Reset |
a |
1 | 欲偵測邊沿的輸入訊號 |
輸出埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
rise |
1 | 偵測到上升沿時輸出一個週期的高電位 |
down |
1 | 偵測到下降沿時輸出一個週期的高電位 |
功能說明
模組使用一個暫存器保存輸入訊號 a 在前一個時脈週期的值:
reg a_dly;
在每個 clk 上升沿,將目前輸入 a 與前一個週期的 a_dly 比較。
上升沿
當:
a_dly = 0
a = 1
時,偵測到上升沿:
rise <= 1'b1;
等價的邏輯運算為:
a & ~a_dly
下降沿
當:
a_dly = 1
a = 0
時,偵測到下降沿:
down <= 1'b1;
等價的邏輯運算為:
~a & a_dly
無邊沿
當輸入保持不變時:
0 → 0
1 → 1
輸出為:
rise = 0
down = 0
輸出時序範例
前一個 a |
目前 a |
rise |
down |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 0 |
| 1 | 0 | 0 | 1 |
設計要求
- 模組名稱必須為
edge_detect。 rst_n為低電位有效的非同步 Reset。- Reset 時將歷史輸入值、
rise與down清除為 0。 - 輸入由 0 變成 1 時,
rise輸出 1。 - 輸入由 1 變成 0 時,
down輸出 1。 rise與down只維持一個時脈週期。- 輸入保持不變時,
rise與down都輸出 0。 - 時序邏輯必須使用 nonblocking assignment。
程式模板
module edge_detect (
input clk,
input rst_n,
input a,
output reg rise,
output reg down
);
// Write your code here
endmodule
評論