[RTLLM-p031] Miscellaneous/Signal generation/signal_generator


提交解答


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

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

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 被致能時,wavestate 都必須立即清為 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 時將 statewave 清為 0。
  • wave 必須在 031 之間循環。
  • 每個時脈週期只能增加或減少 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

評論

目前沒有評論。