32 / 37 · 實作
整合實作:連接週期脈衝與致能累加器
明確用舊值實現模組間傳遞,比較停頓、連續脈衝和同時重置。
單元可免費閱讀,註冊課程即可儲存學習進度。
先定義連線契約
enable=1 的每個上升緣接受無號四位 sample,每第 N 個接受樣本產生註冊 pulse。累加器在下一上升緣消費 pulse 和對應儲存的 sample,即使此時 enable=0。八位 total 按模 256 迴繞。同步 reset 清兩級並丟棄待處理樣本。
這一拍延遲是契約的一部分。累加器讀取舊 pulse 和舊 saved_sample,不能在同一時脈邊緣看到另一過程的新非阻塞值。儲存參數課的 modulo_tick.sv 和以下 periodic_accumulator.sv。N 必須為正。
module periodic_accumulator #(parameter integer N = 3) (
input logic clk, rst, enable,
input logic [3:0] sample,
output logic pulse,
output logic [7:0] total
);
localparam integer CW = (N <= 1) ? 1 : $clog2(N);
wire [CW-1:0] count;
logic [3:0] saved_sample;
modulo_tick #(.N(N)) tick_u (
.clk(clk), .rst(rst), .enable(enable),
.count(count), .pulse(pulse)
);
always_ff @(posedge clk) begin
if (rst) saved_sample <= 4'b0;
else if (enable) saved_sample <= sample;
end
always_ff @(posedge clk) begin
if (rst) total <= 8'b0;
else if (pulse) total <= total + {4'b0, saved_sample};
end
endmodule一起追蹤資料與事件
N=3,輸入在時脈邊緣前,輸出在更新後。
| 時脈邊緣 | rst | enable | sample | 更新後 pulse | 更新後 total |
|---|---|---|---|---|---|
| E0 | 1 | 1 | 9 | 0 | 0 |
| E1 | 0 | 1 | 2 | 0 | 0 |
| E2 | 0 | 1 | 4 | 0 | 0 |
| E3 | 0 | 1 | 7 | 1 | 0 |
| E4 | 0 | 0 | 9 | 0 | 7 |
| E5 | 0 | 1 | 1 | 0 | 7 |
| E6 | 0 | 1 | 3 | 0 | 7 |
| E7 | 0 | 1 | 5 | 1 | 7 |
| E8 | 1 | 1 | 15 | 0 | 0 |
E4 加 7 而非外部新 sample 9。enable 只控制新接受,不取消待處理事件。E8 reset 丟棄待處理的 5 並清 total。用 enable && pulse 控制消費會丟掉 E4 事件。
在系統邊界寫參考模型
保留接受計數、可選待處理值和整數 total。非重置時脈邊緣先按模 256 消費舊待處理值,再用當前 enable/sample 決定是否產生新的第 N 個待處理值。reset 清全部。不依賴 tick_u.count 或 saved_sample。用下降緣刺激、更新後比較,每拍檢查 pulse/total、無待處理值時保持、消費後移除事件。
覆蓋整合錯誤
- N=1 連續 pulse,每個接受樣本在下一拍恰好消費一次。
- N=3 在終止樣本前後插入禁用間隔,按接受時脈邊緣而非所有時脈計數。
- 禁用的消費時脈邊緣改變外部 sample,仍須使用儲存值。
- 待處理時 reset,清 total 並丟棄事件。
- 累加越過 255,檢查模 256 迴繞。
把 saved_sample 改成 sample,E4 必須失敗;再用 enable 限制消費也必須失敗。恢復正確設計後記錄透過。本實驗驗證單時脈有限位元寬度功能,不證明跨時脈、物理時序收斂或免費 DDS 產品執行,後者需獨立證據。
✓ 已學習