Altifigence Academy

16 / 37 · 概念

模數、飽和計數器與結束脈衝

設計最大值處理策略與 terminal-count 訊號的確切週期。

超出範圍的三種策略不同

同樣的 N 位元暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容,到最大值後是回捲、保持最大值,還是回報錯誤,都由規格決定。

Cnextwrap=(C+1) mod 2NC_{next}^{wrap}=(C+1)\bmod2^N
Cnextsat=min⁡(C+1,2N−1)C_{next}^{sat}=\min(C+1,2^N-1)

8 位元模數計數器在 255 之後變成 0,飽和計數器則保持 255,兩者功能不同。需要正負值的累加器,還須考慮 signed 範圍及兩側飽和邊界。

每欄是一次上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容的觀察紀錄。輸入為邊緣前值,名稱含「後」的狀態為更新後值。欄位對齊表示取樣順序,並未繪出實體傳播延遲傳播延遲是輸入改變後,輸出穩定至正確值所需的時間。邏輯式是否等價與時間特性是兩個不同問題。 詳細內容。
初始 count=8、reset=0、enable=1。相同輸入下,modulo-10、4 位元回捲與 4 位元飽和會產生不同軌跡。

超過最大值之後的三種策略
查看波形資料
波形資料:每個字元表示一個區間;句點保持先前狀態;p 表示一個時脈週期。
訊號波形匯流排值
邊緣234523452E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8
mod10 後2345234529 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7
wrap4 後2345234529 → 10 → 11 → 12 → 13 → 14 → 15 → 0 → 1
sat4 後2345234..9 → 10 → 11 → 12 → 13 → 14 → 15

比較 modulo-M 的最後狀態

若希望每十次輸出脈衝,使用狀態 0~9,只計入 enable 有效的邊緣。可將 pulse 暫存為「此邊緣消耗 9 並返回 0」的事件。

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) begin
    count <= 4'd0;
    pulse <= 1'b0;
  end else begin
    pulse <= 1'b0;
    if (en) begin
      if (count == 4'd9) begin
        count <= 4'd0;
        pulse <= 1'b1;
      end else count <= count + 4'd1;
    end
  end
end

pulse 有預設指定,因此下一邊緣會返回 0。若只輸出 count==9,enable=0 停住時可能連續數週期為 1。必須區分結束狀態與完成事件。

週期的計數起點

reset 後從 count=0 開始,必須經過十個 enable=1 的邊緣才產生第一個 pulse。與其爭論第一個邊緣叫第 0 還是第 1,更重要的是一致使用輸入、狀態與輸出表的定義。

此互動練習是 modulo-16 計數器。初始 1110 經一個邊緣為 1111,再一個為 0000。試著在 1111 時設 enable=0 暫停。保持與飽和雖然看起來同值,恢復執行後卻不同。比較同條件下飽和計數器應得到什麼值。

在 4 位元最大值停止或循環

同步 reset 優先於 enable。enable=0 時,保持已儲存的值。 q=1110; q_next = (q + 1) mod 16

自己試試看

上述電路在 count=9、pulse=0 時,經過兩個 en=0 邊緣,再經過 en=1 邊緣,count 與 pulse 如何變化?

查看解說

暫停的兩個邊緣保持 count=9、pulse=0。第三個邊緣成為 count=0、pulse=1,下一邊緣則由預設指定使 pulse=0。

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