2 / 63 · 概念
數制與固定寬度表示
除了進位制轉換,也計算表示範圍、所需位元數與截斷誤差。
單元可免費閱讀,註冊課程即可儲存學習進度。
本課程的起點
建議具備高中代數與基本程式設計經驗。課內會整理二進位與布林代數布林代數處理 0、1 與 AND、OR、NOT 運算。此處的加號通常代表 OR,規則與整數加法不同。 詳細內容,並以大學入門數位邏輯設計的程度快速推進。比起背公式,更應專注於定義輸入條件、位元寬度與觀察時間,再用範例驗證。
必須區分位元序列與數值
電路儲存的是有限的位元序列;如何將它解讀為整數、有號值或定點數定點數預先固定小數點位置,對整數位元序列套用固定倍率來表示數值。必須一併指定位寬、是否帶符號與小數位元數。 詳細內容,則由設計契約決定。本單元假設你已理解整數運算與次方,直接進入實際 RTL 所需的範圍計算。
位元 unsigned無符號(unsigned)將位元序列解讀為非負整數。n 位元範圍為 0 至 2^n−1;相同位元序列的帶符號解讀可能得到不同數值。 值的解讀如下。
10110110 是 。每 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 位元寬,傳給運算子的符號資訊不同,比較結果也可能不同。
先決定範圍,再決定位元寬度
區分 個不同狀態所需的最少位元數如下。
從 0 數到 999 需表示 1000 個值,因此需要 10 位元。從 0 到 1024 則有 1025 個值,需要 11 位元。混淆最大值與狀態數量,就會恰好在邊界少一個位元。若 RTL 參數也允許 ,應將寬度下限設為 1,避免產生零位元向量。
存入較窄的訊號會發生什麼事
捨棄高位元、只保留 位元的 unsigned 儲存等同模數運算。
例如將 9 位元的計算結果 300 存入 8 位元,會留下 44。這不是四捨五入,也不是飽和運算。若需要飽和,必須另外設計偵測超出範圍並選擇最大值的電路。
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 後會留下什麼值?
查看解說
第一個範圍有 個值,需要 12 位元;第二個有 4097 個值,需要 13 位元。因為 ,儲存值為 8'hFF,但不能只憑這個值認定沒有發生 overflow。