[RTLLM-p032] Miscellaneous/Signal generation/square_wave
可變除頻方波產生器
題目說明
請設計一個名為 square_wave 的方波訊號產生器。
此模組接收一個輸入時脈 clk 與一個 8 位元控制值 freq,並透過內部計數器決定 wave_out 的翻轉週期。
內部計數器 count 會在每個 clk 上升沿加一。當計數器到達:
freq - 1
時,模組必須:
- 將
count清為 0。 - 將
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個時脈週期翻轉一次。- 初始時
count與wave_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
評論