Altifigence Academy

29 / 63 · 概念

狀態數、計數器寬度與未使用代碼

從計數範圍求儲存位元數,定義錯誤狀態的復原策略。

計數電路也是狀態機

循環 0~9 的計數器需要 10 個狀態,最小儲存寬度為 ⌈log⁡210⌉=4\lceil\log_2 10\rceil=4 位元。但 4 位元暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容有 16 種位元樣式,因此只選對寬度,還不能完成 modulo-10 功能。

N=⌈log⁡2M⌉,unused codes=2N−MN=\left\lceil\log_2 M\right\rceil,\qquad \text{unused codes}=2^N-M

M 是狀態數,不是最大值。從 0 數到 M-1 與從 0 數到 M 不同。若支援參數 M=1,須將儲存寬度下限設為 1,並處理成永遠保持 0。

4 位元儲存空間有 16 個代碼,但 modulo-10 只用 10 個作為正常狀態。決定寬度後,還要加入比較與復原策略。

儲存位寬與循環條件分別設計
  1. 10 個狀態: 正常 count 為 0–9
  2. 以 4 位元儲存: 16 種編碼,10–15 為多餘編碼
  3. 下一狀態: en=1 且 count≥9 時為 0

範圍外狀態也是設計的一部分

4 位元 modulo-10 計數器若因某種原因變成 12,下一步應如何動作?可以證明初始化與重設重設將狀態回復至規格指定的初始值。必須一併定義它是同步或非同步,以及是否優先於其他控制訊號。 詳細內容條件,據以假設不會發生;也可採用 9 以上回到 0 的策略。復原功能不等於能容忍所有硬體故障。

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

此範例連錯誤值 10~15 也在 en=1 的邊緣復原。enable=0 時仍保持該值,因此若規格要求立即復原,需改變條件優先權。

寬度審查與功能審查不同

0~999 用 10 位元就足夠,但自由遞增會到 1023。需要比較與選擇電路,在規格指定的最大狀態返回 0。記憶體位址、重複次數與封包長度計數器中,這項差別會直接造成錯誤存取或長度錯誤。

自己試試看

求循環 0~99 的計數器最小寬度與未使用代碼數。若只用該寬度不斷 +1,會有什麼不同?

查看解說

100 個狀態需要 7 位元,未使用代碼有 128−100=28128-100=28 個。單純遞增不會在 99 返回,而會到 127,因此變成 modulo-128,不是 modulo-100。

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