[RTLLM-p032] Miscellaneous/Signal generation/square_wave


提交解答


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

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

可變除頻方波產生器

題目說明

請設計一個名為 square_wave 的方波訊號產生器。

此模組接收一個輸入時脈 clk 與一個 8 位元控制值 freq,並透過內部計數器決定 wave_out 的翻轉週期。

內部計數器 count 會在每個 clk 上升沿加一。當計數器到達:

freq - 1

時,模組必須:

  1. count 清為 0。
  2. wave_out 反相。

因此,wave_out 每經過 freq 個輸入時脈週期翻轉一次。

例如,當:

freq = 4

時,輸出每 4 個輸入時脈週期翻轉一次:

wave_out = 0:維持 4 個週期
wave_out = 1:維持 4 個週期

完整方波週期則需要:

2 × freq

個輸入時脈週期。


模組介面

埠名稱 方向 位元寬度 說明
clk input 1 輸入時脈
freq input 8 輸出翻轉週期控制值
wave_out output reg 1 方波輸出

內部暫存器

模組使用一個 8 位元計數器:

reg [7:0] count;

count 用來記錄距離下一次 wave_out 翻轉已經經過多少個輸入時脈週期。


計數器行為

當:

count < freq - 1

時,執行:

count <= count + 1'b1;

當:

count == freq - 1

時,執行:

count    <= 8'd0;
wave_out <= ~wave_out;

輸出頻率

假設輸入時脈頻率為:

Fclk

由於輸出每 freq 個時脈週期翻轉一次,而一個完整方波包含兩次翻轉,因此輸出頻率為:

Fwave = Fclk / (2 × freq)

例如:

Fclk = 100 MHz
freq = 4

則:

Fwave = 100 MHz / 8
      = 12.5 MHz

因此,freq 越大,輸出方波頻率越低。


初始狀態

題目沒有提供 Reset 輸入,但測試程式會直接觀察 wave_out

為了讓模擬具有確定的初始值,本題將:

count    = 0
wave_out = 0

設為初始狀態。

可以使用 Verilog 的 initial 區塊:

initial begin
    count    = 8'd0;
    wave_out = 1'b0;
end

此寫法通常可由 FPGA 工具合成為暫存器的上電初始值;若設計目標為一般 ASIC,實務上通常應額外加入 Reset 輸入。


freq = 0 的處理

若直接計算:

freq - 1'b1

freq = 0,8 位元運算結果會下溢為:

255

這會使輸出每 256 個時脈週期才翻轉一次。

為了避免不明確的行為,本題將 freq = 0 視為最小除頻值 1,也就是每個時脈上升沿翻轉一次:

freq = 0 或 freq = 1

皆視為:

每 1 個時脈週期翻轉一次

設計要求

  • 模組名稱必須為 square_wave
  • freq 必須為 8 位元輸入。
  • wave_out 必須為暫存器型輸出。
  • 內部必須包含 8 位元計數器 count
  • count 在每個 clk 上升沿更新。
  • count 到達 freq - 1 時清零。
  • 在計數器清零時將 wave_out 反相。
  • wave_out 每經過 freq 個時脈週期翻轉一次。
  • 初始時 countwave_out 必須為 0。
  • 必須使用 nonblocking assignment 描述時序更新。
  • 應妥善處理 freq = 0 的情況。

程式設計模板

module square_wave (
    input            clk,
    input      [7:0] freq,
    output reg       wave_out
);

    reg [7:0] count;

    // Write your code here

endmodule

評論

目前沒有評論。