Altifigence Academy

32 / 37 · 實作

整合實作:連接週期脈衝與致能累加器

明確用舊值實現模組間傳遞,比較停頓、連續脈衝和同時重置。

先定義連線契約

enable=1 的每個上升緣接受無號四位 sample,每第 N 個接受樣本產生註冊 pulse。累加器在下一上升緣消費 pulse 和對應儲存的 sample,即使此時 enable=0。八位 total 按模 256 迴繞。同步 reset 清兩級並丟棄待處理樣本。

這一拍延遲是契約的一部分。累加器讀取舊 pulse 和舊 saved_sample,不能在同一時脈邊緣看到另一過程的新非阻塞值。儲存參數課的 modulo_tick.sv 和以下 periodic_accumulator.sv。N 必須為正。

SystemVerilog
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,輸入在時脈邊緣前,輸出在更新後。

時脈邊緣rstenablesample更新後 pulse更新後 total
E011900
E101200
E201400
E301710
E400907
E501107
E601307
E701517
E8111500

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 產品執行,後者需獨立證據。

此選擇適用於本瀏覽器,隨時可從頁尾變更。