Altifigence Academy

2 / 63 · 概念

數制與固定寬度表示

除了進位制轉換,也計算表示範圍、所需位元數與截斷誤差。

本課程的起點

建議具備高中代數與基本程式設計經驗。課內會整理二進位與布林代數布林代數處理 0、1 與 AND、OR、NOT 運算。此處的加號通常代表 OR,規則與整數加法不同。 詳細內容,並以大學入門數位邏輯設計的程度快速推進。比起背公式,更應專注於定義輸入條件、位元寬度與觀察時間,再用範例驗證。

必須區分位元序列與數值

電路儲存的是有限的位元序列;如何將它解讀為整數、有號值或定點數定點數預先固定小數點位置,對整數位元序列套用固定倍率來表示數值。必須一併指定位寬、是否帶符號與小數位元數。 詳細內容,則由設計契約決定。本單元假設你已理解整數運算與次方,直接進入實際 RTL 所需的範圍計算。

NN 位元 unsigned無符號(unsigned)將位元序列解讀為非負整數。n 位元範圍為 0 至 2^n−1;相同位元序列的帶符號解讀可能得到不同數值。 值的解讀如下。

u=∑i=0N−1bi2i,0≤u≤2N−1u=\sum_{i=0}^{N-1}b_i2^i,\qquad 0\le u\le 2^N-1

10110110 是 128+32+16+4+2=182128+32+16+4+2=182。每 4 位元分組可得 B6,因此 8'hB6 與 8'b10110110 表示相同位元序列。十六進位的每一位固定對應 4 個位元,閱讀位址、遮罩與波形時可快速轉換。

位元序列不變,解讀方式不同

試著切換下方的 b7。unsigned 解讀會增加位權 128,但二補數二補數以固定寬度的位元序列表示帶符號整數。n 位元範圍為 −2^(n−1) 至 2^(n−1)−1。 詳細內容解讀中,最高有效位元的權重是 −128。先做出 0x7F 與 0x80,比較兩種解讀的邊界。

位元與數值表示

10110110 → unsigned 182 · signed -74 · hex 0xB6

改變位元序列與將它解讀為 signed 是不同操作。即使電路同為 8 位元寬,傳給運算子的符號資訊不同,比較結果也可能不同。

先決定範圍,再決定位元寬度

區分 MM 個不同狀態所需的最少位元數如下。

N=⌈log⁡2M⌉N=\left\lceil\log_2 M\right\rceil

從 0 數到 999 需表示 1000 個值,因此需要 10 位元。從 0 到 1024 則有 1025 個值,需要 11 位元。混淆最大值與狀態數量,就會恰好在邊界少一個位元。若 RTL 參數也允許 M=1M=1,應將寬度下限設為 1,避免產生零位元向量。

存入較窄的訊號會發生什麼事

捨棄高位元、只保留 NN 位元的 unsigned 儲存等同模數運算。

xstored=x mod 2Nx_{stored}=x\bmod 2^N

例如將 9 位元的計算結果 300 存入 8 位元,會留下 44。這不是四捨五入,也不是飽和運算。若需要飽和,必須另外設計偵測超出範圍並選擇最大值的電路。

SystemVerilog
logic [7:0] a, b, low;
logic [8:0] full_sum;
assign full_sum = {1'b0, a} + {1'b0, b};
assign low = full_sum[7:0];

先擴展兩個運算元,清楚表達連 carry 也要保留的意圖。不要只看進位制寫法,就以為符號與結果寬度也已決定。判讀波形必須同時掌握寬度、符號與基底。

自己試試看

從 0 數到 4095 與從 0 數到 4096,分別需要幾個位元?把 511 存入 8 位元 unsigned 後會留下什麼值?

查看解說

第一個範圍有 4096=2124096=2^{12} 個值,需要 12 位元;第二個有 4097 個值,需要 13 位元。因為 511 mod 256=255511\bmod256=255,儲存值為 8'hFF,但不能只憑這個值認定沒有發生 overflow。

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