[RTLLM-p031] Miscellaneous/Signal generation/signal_generator
5 位元三角波訊號產生器
題目說明
請設計一個名為 signal_generator 的三角波訊號產生器。
模組使用一個 5 位元輸出訊號 wave 表示目前的波形數值。wave 會由 0 逐次增加至 31,再由 31 逐次減少至 0,並持續重複此循環。
輸出序列如下:
0, 1, 2, 3, ..., 29, 30, 31,
30, 29, 28, ..., 3, 2, 1, 0,
1, 2, 3, ...
模組內部使用一個 1 位元狀態暫存器 state 控制目前的波形方向:
state = 0:遞增階段
state = 1:遞減階段
當低電位有效重置訊號 rst_n 被致能時,wave 與 state 都必須立即清為 0。
模組介面
| 埠名稱 | 方向 | 位元寬度 | 說明 |
|---|---|---|---|
clk |
input | 1 | 時脈訊號 |
rst_n |
input | 1 | 低電位有效非同步重置 |
wave |
output reg | 5 | 目前的三角波數值 |
狀態定義
模組內部使用一個 1 位元的 state 暫存器:
state |
狀態名稱 | 功能 |
|---|---|---|
0 |
UP | wave 每個時脈加一 |
1 |
DOWN | wave 每個時脈減一 |
Reset 行為
當:
rst_n = 0
時,模組必須立即執行:
state = 0
wave = 0
因此 Reset 解除後,波形將從 0 開始向上增加。
本題採用低電位有效非同步 Reset,敏感度列表應包含:
posedge clk or negedge rst_n
遞增狀態
當:
state = 0
且:
wave < 31
時,每個時脈上升沿執行:
wave = wave + 1
例如:
0 → 1 → 2 → 3 → ... → 30 → 31
當目前的 wave 已經等於 31 時,下一個時脈週期必須切換至遞減狀態,並將輸出變為 30:
31 → 30
遞減狀態
當:
state = 1
且:
wave > 0
時,每個時脈上升沿執行:
wave = wave - 1
例如:
31 → 30 → 29 → ... → 2 → 1 → 0
當目前的 wave 已經等於 0 時,下一個時脈週期必須切換回遞增狀態,並將輸出變為 1:
0 → 1
邊界行為
波形在最高點及最低點不應重複停留。
正確序列為:
29 → 30 → 31 → 30 → 29
而不是:
29 → 30 → 31 → 31 → 30
最低點同樣如此:
2 → 1 → 0 → 1 → 2
而不是:
2 → 1 → 0 → 0 → 1
設計要求
- 模組名稱必須為
signal_generator。 wave必須宣告為 5 位元輸出暫存器。- 模組內部必須包含方向狀態暫存器
state。 state = 0表示遞增。state = 1表示遞減。rst_n為低電位有效非同步重置。- Reset 時將
state與wave清為 0。 wave必須在0與31之間循環。- 每個時脈週期只能增加或減少 1。
- 在
31時切換為遞減方向。 - 在
0時切換為遞增方向。 - 必須使用
case敘述控制狀態。 - 時序邏輯必須使用 nonblocking assignment。
程式設計模板
module signal_generator (
input clk,
input rst_n,
output reg [4:0] wave
);
reg state;
// Write your code here
endmodule
評論