跳至內容

位元 Arithmetic#

本主題說明 Bit Width 在從 VisualApplets 設計產生的 FPGA 管線中的運作方式。讀完本主題後,您將了解連結 Bit Width 如何限制 Arithmetic 結果、如何處理溢位,以及如何使用轉型、剪裁和位移運算子來控制數值範圍。您也將了解有號數與無號數的區別、定點數的運作方式,以及如何從較寬的資料字中擷取位元欄位。

關鍵詞

Bit width 為連結上每個像素或每個值的位元數。Bit width 定義了 value range。例如,8-bit 無號連結可攜帶從 0 到 255 的值。Arithmetic overflow 意指算術結果無法再容納於可用的位元中。結果會發生折返 (wrap) 或遺失高階位元。

關於 link property 與參數相依性,請參閱 Parameterization 教學主題。關於 link 背後的正式規則,請參閱使用者手冊中的 Rules of Links。

每個 link 位於兩個模組(即已實例化的運算子)之間,並承載一個 Bit Width Property。此 Property 定義了所產生的 FPGA 管線(pipeline)針對該連接上的每個像素或值所使用的位元數。對於色彩鏈路,Bit Width 涵蓋所有色彩元件。在具有 ImageProtocol = VALT_SIGNAL的鏈路上,Bit Width 永遠是 1 bit。

每個連線每個資料字最多支援 64 bits。當運算子計算出較寬的結果時,您必須在連線寬度超過此限制之前對資料進行裁剪、轉型或位移。

並非每個運算子都接受所有 Bit Width。有些運算子只允許特定的範圍,例如 1 至 64 bits、8 bits、12 bits 或 16 bits。Operator Reference 中的 Supported Link Format 表格記錄了每個運算子所允許的值。您也可以在設計窗格中對模組按一下滑鼠右鍵並選取 Help,或按下 F1 來開啟運算子說明。這與 Operator Reference 中的內容相同,是以 VisualApplets 工具內輔助說明的形式提供。

當發生 Bit Width 衝突時,請先檢查上游運算子的輸出鏈路。調整 Bit Width 可在其上進行編輯的運算子上的鏈路 Property,或者插入諸如 CastBitWidth, ClipHigh, ClipLow, ShiftLeft或 ConvertPixelFormat 的運算子,以沿著路徑更改 Bit Width。

連線屬性會在管線中傳遞,直到有運算子變更它們為止。請在相機輸出連線上設定寬度,或在處理路徑上插入 Bit Width 運算子。請參閱 Propagation of Link Properties 教學主題。

Bit Widths for Arithmetic Operations#

Arithmetic 程式庫的運算子會自動衍生輸出 Bit Width 自動進行。 支援的 Link 格式 中的 Operator Reference 將這些輸出標記為 自動。您通常無法直接在連線上編輯這些輸出 Bit Width 連線屬性。如果您希望在算術運算後手動變更 Bit Width,請使用其他運算子,例如 CastBitWidth 並結合 ClipHigh, ClipLow,或兩者皆可。以下 Arithmetic 運算子也會更改 Bit Width:

Addition and Subtraction#

影像 ADD 運算子會加總所有輸入鏈路上的像素值。 SUB 運算子會從第一個輸入中減去第二個輸入上的像素值。

VisualApplets 會根據輸入 Bit Width 來設定輸出 Bit Width。結果會比該最大值多一個位元。如果您在 ADD上混合使用無號與有號輸入,則輸出可能需要額外的一個位元。

Add Operator 新增像素值

輸出 Bit Width 不得超過 64 位元。在 ADD 或 SUB之後,請檢查下游連接上傳遞的鏈路寬度。

Multiplication#

影像 MULT 運算子會將其兩個輸入端的像素值相乘。單一鏈路上允許的最大輸入 Bit Width 為 32 bit。輸出 Bit Width 等於兩個輸入 Bit Width 的總和。8 位元值乘以 8 位元值會產生 16 位元的結果:

使用 MULT 運算子變更 Bit Width

資訊

MULT 會消耗大量 FPGA 資源。若要進行常數 Scaling,Basler 建議使用 SCALE 或 ShiftLeft 。

Division#

影像 DIV 運算子會將輸入鏈路上的值相除 I1 由輸入鏈結上的值 I2。輸出鏈結 O 攜帶整數商。輸出鏈結 R 攜帶餘數。除以零在兩個輸出上都是未定義的。

輸入鏈結上的 Bit Width I2 必須小於或等於輸入鏈結上的 Bit Width I1。對於無號輸入,輸出鏈結上的輸出 Bit Width O 等於輸入鏈結上的 Bit Width I1。對於有號輸入,輸出鏈結上的輸出 Bit Width O 等於輸入 bit width 上的 Bit Width I1 加一。

使用無號輸入連線之 DIV 運算子的 Bit Width

DIV 執行整數除法。它本身不會保留小數點位數。若要進行定點數除法,請在使用 ShiftLeft 運算子之前先進行處理。

如需有關小數值的詳細資訊,請參閱本主題的 Fixed-Point Arithmetic 小節。

資訊

DIV 會消耗許多 FPGA 資源。若要除以 2 的冪次方,請使用 ShiftRight 。

Handling Arithmetic Overflow with Clip and Cast Operators#

Arithmetic overflow 會在結果超出目前 Bit Width 所能表示的範圍時發生。在 8 位元無號連線上,範圍是 0 到 255。總和 200 + 100 等於 300。如果輸出位元不足,儲存的值就會錯誤。溢位會顯示為不正確的像素值:

位元溢位

Arithmetic overflow 不應與 Overflow 中的 operator 同步化 library 所處理的溢位狀況混淆: Overflow 運算子用於不可停止資料來源的流量控制。如需關於 Overflow 運算子,請參閱 可停止與不可停止的資料流 教學主題。

您可以使用下列運算子來修正 Arithmetic 溢位:

ClipHigh and ClipLow#

影像 ClipHigh 運算子會將值限制在可設定的最大值。任何超過最大值的輸入值都會被最大值取代。 ClipLow 運算子對可設定的最小值也有類似的作用。

使用 ClipHigh 和 ClipLow 以將值保持在目標範圍內 在 減少 Bit Width。請使用模組參數設定裁剪極限。有效範圍取決於 Bit Width 輸入鏈結 Property 以及輸入鏈結使用的是有號還是無號 Arithmetic。

螢幕截圖顯示 ClipHigh 將所有大於 255 的像素值設為 255:

ClipHigh 運算子計算所有像素值以符合範圍

CastBitWidth#

影像 CastBitWidth 運算子會變更連結 Bit Width。您可在運算子的輸出連結上 Bit Width 設定連結 Property。

當輸出 bit width 大於輸入 bit width 時,運算子會保留該值並在最高有效位元位置新增 bit。對於帶正負號的值, CastBitWidth 會執行符號擴充。

當輸出 bit width 小於輸入 bit width 時, CastBitWidth 會捨棄最高有效位元。因此,無法在輸出 bit width 內表示的值將會被修改。由於此操作會永久移除 bit,因此後續處理所需的資訊可能會遺失。

當縮減連結 bit width 時,Basler 建議依序執行以下步驟:

  1. 插入 ClipHigh 和 ClipLow 以將 bit width 值限制在目標範圍內。
  2. 插入 CastBitWidth 以縮減 bit width。

另請參閱 Parameterization 教學主題。

Example: Add Pixels and Narrow the Result#

此範例將兩個 8-bit 無符號像素串流相加,並傳回一個 8-bit 結果供後續處理使用:

  1. 將兩個 8-bit 影像路徑連接至 ADD operator。
  2. 檢查輸出連結。 ADD 會產生 9-bit 結果。
  3. 插入 ClipHigh 之後使用 operator ADD。將最大值設為 255。
  4. 插入 CastBitWidth 之後使用 operator ClipHigh。將輸出 Bit Width 設為 8。
  5. 執行 Design Rules Check Level 1 並確認所有連線皆有效。

若沒有 ClipHigh, CastBitWidth 則只會捨棄第九個 bit,因此大的總和會產生錯誤的像素值。

結合 ClipHigh 與 CastBitWidth 可防止產生不正確的結果資料

Signed and Unsigned Values#

連結 Property Arithmetic 定義產生的 FPGA 管線如何將值視為 Signed 或 Unsigned對於 Signed,硬體會使用二補數表示法。您可以在設計階段於 VisualApplets 中設定此 Property。

符號位元是所設定的 Bit Width 的一部分。

9 位元值,保留 1 位元用於正負號資訊

影像 CastType operator 會變更 Arithmetic 輸出連接埠上的 link property。位元組態保持不變。產生的 FPGA 邏輯不會變更儲存的位元組態,因此該 operator 不會佔用任何 FPGA 資源。

根據 Arithmetic 設定,相同的位元組態可以代表不同的十進位值。該值 1010 在 4-bit 無號 link 上等於 10。在 4-bit 有號 link 上的相同組態則等於 −6。

請使用 CastType 當下游 operator 需要不同的 Arithmetic 類型且數值範圍仍然符合時,請使用此 operator。

CastType 將算術值從有號變更為無號

Checking Whether a Value Fits to a Bit Range#

在 VisualApplets 中,參數值(例如 CONST operator 的模組參數)是以十進位數字輸入和顯示的。不過,連接到 operator 的 links 只能儲存特定位元範圍內的值。因此,請確保參數值符合所連接 link 的 Bit Width。

無號 Links

n-bit 無號 link 只能代表正值與零。有效範圍為:

0 到 2^n − 1

例如,8-bit 無號 link 可以儲存從 0 到 255 的值:

Maximum Value for 8 Bit Unsigned

在具有 ImageProtocol = VALT_SIGNAL的 links 上,Arithmetic 始終為 Unsigned.

有號 Links

n-bit 有號 link 可以同時代表正值與負值。有效範圍為:

−2^(n-1) 到 2^(n-1) − 1

例如,8-bit 有號 link 可以儲存從 −128 到 127 的值。

Maximum Value for 8 Bit Signed

最高有效位元用作符號位元,並指示數值是正數還是負數。

Fixed-Point Arithmetic#

VisualApplets 用於建立實作於 FPGA 上的影像處理設計。與在 PC 上執行的軟體不同,FPGA 硬體通常不處理浮點數(例如 0.5 或 1.25)。相反地,運算通常是使用整數來執行的。

為了在仍使用整數運算的同時表示小數值,VisualApplets 使用了定點數表示法。這可讓縮放比例、增益或次像素座標等數值在硬體中有效率地儲存與處理。

本節說明:

  • 為什麼需要定點數表示法。
  • 小數值如何儲存在整數位元組態中。
  • Q 格式如何定義小數點的位置。
  • Bit Width 如何影響可用的數值範圍與精度。
  • 運算子選擇如何影響計算的準確性。

在連線上傳輸的每個數值皆儲存為一串位元。硬體會將這些位元解讀為整數值。

例如,以下的位元組態代表整數值 5:

00000101 = 5

然而,影像處理應用程式通常需要小數值,例如: 0.5, 1.25或 12.75.

由於 FPGA 不會儲存浮點數,因此這些數值會使用定點數格式來表示。在定點數表示法中,位元組態仍會儲存為整數,但您會為小數點定義一個固定的位置。

儲存的整數值仍然是 5,但它會被解讀為:

5 / 2^2 = 1.25

因為有兩個位元保留給小數部分。

您可以將其視為 虛擬小數點 ,它固定在預定義的位置。在二進位 Arithmetic 中,這種分割是位權之間的二進位點 2^0 和 2^-1。本教學課程保留了熟悉的術語 虛擬小數點。FPGA 使用整數執行所有計算,而您則根據所選的 fixed-point 格式來解讀結果。

Q Format and Bit Allocation#

Fixed-point 數值透過將某些 bit 指派給整數部分、某些 bit 指派給小數部分來表示小數值。虛擬小數點的位置使用 Q format 來描述。

Q 格式的寫法為:

Qm.n

其中:

  • m 是整數位元數
  • n 是小數位元數

對於有號數,正負號位元包含在整數部分中。

例如:

Q4.4

表示:

  • 4 個整數部分位元
  • 4 個小數部分位元
  • 總共 8 個位元

小數位元的數量決定了所表示數值的精度。

最小可表示的步長大小為:

1 / 2^n

其中 n 是小數位數。

範例:

Format Fractional Bits Smallest Step Size
Q6.2 2 0.25
Q4.4 4 0.0625
Q2.6 6 0.015625

更多的小數位數允許相鄰數值之間的差異更小,從而提供更高的精度。

總 Bit Width 是固定的。因此,用於小數部分的 bit 將無法再用於整數部分。

因此:

  • 更多的小數位數可提供更高的精度,但會減少可用的整數範圍。
  • 較少的小數位數可提供更大的整數範圍,但精度較低。

選擇 Q 格式時,請平衡所需的數值範圍與所需的精度。

在定點數中,每個 bit 代表 2 的冪。

虛擬小數點左側的 bit 代表整數:

..., 2^3, 2^2, 2^1, 2^0

右側的 bit 代表小數:

2^-1, 2^-2, 2^-3, ...

例如,在 Q4.4 格式中:

Bit position:  7   6   5   4   3    2     1      0
Weight:      2^3  2^2  2^1  2^0  2^-1  2^-2  2^-3  2^-4

的位置 2^0 bit 定義了虛擬小數點的位置。此位置不會儲存在硬體中;它由所選的 Q 格式定義,並且必須在整個設計中進行一致的解釋。

Example: Q4.4#

在 Q4.4 格式中,4 個 bit 用於整數部分,4 個 bit 用於小數部分。

bit 模式

0 0 0 0 . 1 0 0 0

包含一個 1 在第一個小數位置。此位置代表數值 2^-1,等於 0.5.

因此,該 bit 模式代表:

0 * 2^0 + 1 * 2^-1 + 0 * 2^-2 + 0 * 2^-3 + 0 * 2^-4 = 0.5

雖然代表的數值是 0.5,但 FPGA 僅儲存對應的整數值:

Stored integer value: 8
Represented real value: 0.5

這有效的原因是 Q4.4 使用了 4 個小數 bits。儲存的整數值被解釋為:

Real value = Stored integer / 2^4
           = 8 / 16
           = 0.5

設 F 為小數部分的位元數。

要將實數值轉換為其定點數表示法:

FixedPoint = round(RealValue * 2^F)

範例:

FixedPoint = round(0.5 * 2^4)
           = round(8)
           = 8

產生的位元圖樣:

0000.1000

要將定點數值轉換回實數值:

RealValue = FixedPoint / 2^F

範例:

RealValue = 8 / 2^4
          = 8 / 16
          = 0.5

Operators and Design Rules#

運算子僅處理整數位元圖樣。在定點數 Arithmetic 中,虛擬小數點的位置由 Q 格式決定,並且必須在整個設計過程中進行追蹤。

以下運算子通常用於調整 Scaling 並維持預期的 Q 格式:

  • 影像 ShiftLeft 和 ShiftRight 運算子會將輸入位元圖樣向左或向右移動可配置的位元數。向左位移會將數值乘以 2^Shift;向右位移則會將其除以 2^Shift。這些運算子通常用於 Arithmetic 運算之後,以恢復所需的 Q 格式。
  • SCALE 或 ShiftLeft:請使用這些運算子來代替 MULT 當將數值乘以 2 的常數次方時。它們執行相同的 Scaling 操作,但通常需要較少的 FPGA 資源。
  • 影像 MULT 運算子將兩個輸入值相乘。輸出 Bit Width 等於輸入 Bit Width 的總和。在定點數 Arithmetic 中,結果中的小數點位元數也是兩個運算元小數點位元數的總和。

範例#

將 Q4.4 值乘以另一個 Q4.4 值會產生 Q8.8 結果:

Q4.4 * Q4.4 -> Q8.8

該結果提供更高的精度,但如果設計預期獲得 Q4.4 值,它可能需要後續的 ShiftRight 運算或 Bit Width 縮減。

某些 operator 會假設特定的 fixed-point 格式。例如,三角 operator,例如 SIN, COS, TAN及其反函數,其輸入和輸出需要預先定義的小數點位元數。

在將 link 連線至此类 operator 之前,請在 Operator Reference 的 Arithmetics Library 中驗證所需的格式。

設計準則

記錄每個階段的 Q 格式。在相乘或相除之後,使用 ShiftRight 或 Bit Width 調整(如果需要)來恢復預期的格式。

Displaying Fixed-Point Values in Simulation#

您可以在 VisualApplets 中使用模擬功能,在建構 applet 之前驗證 fixed-point 數值是否按照預期在設計中被解讀、Scaling 並傳遞。在 Simulation Probe Viewer 中,link 數值保持為整數,但您可以透過設定 fractional bits、選擇有號/無號十進位以及選擇性地套用 Scaling 因子,將其顯示為 fixed-point。這僅影響顯示,不影響硬體。若要透過 VisualApplets 中的模擬檢查 fixed-point 數值:

  1. 在處理管線的開頭新增 Simulation Source。
  2. 將 Simulation Probe 新增至 operator 的輸出 link。
  3. 透過 Analysis → Start Simulation 開始模擬。
  4. 開啟您在步驟 2 中新增的 probe 的 Simulation Probe Viewer。
  5. 在 Simulation Probe Viewer 中,選取有號或無號十進位顯示。
  6. 設定 fractional bits 的數量以符合您的 Q-format。
  7. 可選擇設定用於單位轉換的 Scaling 因數,例如從弳度轉換為角度。

結果,您可以看到 Simulation Probes 如何將 fractional bits 納入考量:

Simulation Probe: Display the Result Taking the Fractional Bits into Account.

有關 VisualApplets 中模擬的更多資訊,請參閱 User Manual 中的 Simulation。

Extracting Bit Fields with SelectBitField#

影像 SelectBitField operator 會從輸入值中提取連續的位元範圍並將其複製到輸出。當您只需要較寬資料字組中的特定部分時,請使用此 operator。

依照下列方式設定 operator:

  • 設定 output Bit Width 位於 output link 上。這會決定要提取多少位元。
  • 將 BitOffset parameter。這會指定要複製到輸出的所選欄位之最低有效位元 (LSB) 的位置。所選位元會成為輸出值的第 0 位元 (最低有效位元)。

對於灰階影像, BitOffset 必須在以下範圍內:

0 ... Input Bit Width - Output Bit Width

如果輸入使用帶符號的 Arithmetic,則提取的位元永遠會以不帶符號的值輸出。

SelectBitField: 輸入與輸出 Link Bit Width 以及 BitOffset Module Parameter 的相依性

Widening Bit Width for Downstream Software#

許多相機產生的像素資料具有如每像素 10 或 12 位元的 Bit Width。然而,影像處理軟體和影像檔案格式通常使用標準資料寬度,例如 8、16 或 32 位元。

因此,在將相機資料傳輸到主機 PC 之前,通常會將其轉換為 16 位元像素。您可以透過下列方式執行此操作:

Using ConvertPixelFormat#

若要加寬 Bit Width,您可以在影像來源或緩衝區與 ConvertPixelFormat 之間插入一個 DmaToPC.

插入之後, ConvertPixelFormat operator,開啟輸出 link properties 並設定 Bit Width 設定為 16.

例如,當將 9-bit 像素資料轉換為 16-bit 時,operator 會將每個像素值向左位移 7 位,並在新建的最低有效位位置插入零。這能在將資料調整為 16-bit 格式的同時,保留相對的亮度範圍。

Widening the Bit Width with the ConvertPixelFormat Operator

Using ShiftLeft#

或者,您也可以插入一個 ShiftLeft operator,並將 Shift parameter 設定為 7。

向左位移 7 位產生的 Scaling 效果與將 9-bit 值轉換為 16-bit 值相同:

9-bit value << 7

隨後,輸出 link 便會傳輸 16-bit 像素值。

Widening the Bit Width with the ShiftLeft Operator

Using CastBitWidth#

如果您想要在不改變數值的情況下增加 Bit Width,請插入一個 CastBitWidth operator。若下游軟體需要較寬的 Bit Width,但不需要對像素值進行 Scaling,請選擇此選項。

若要使用 CastBitWidth operator 變更 Bit Width,請變更 CastBitWidth operator 輸出 link 上的 Bit Width:

Widening the Bit Width with the CastBitWidth Operator

與...不同 ConvertPixelFormat 或 ShiftLeft, CastBitWidth 不會位移像素資料。相反地,它會新增額外的高階位,同時保留原始值。

使用 DRC 驗證您的設計#

變更 Bit Width 或插入 Arithmetic 運算子後,請執行 Analysis → Design Rules Check Level 1。Level 1 會在 DRC log 中回報 Bit Width 不符與參數衝突。受影響的模組和連結會在設計窗格中反白顯示。

執行 Design Rules Check Level 2 建置之前。Level 2 會估算 FPGA 資源使用量。寬中介結果與運算子,例如 MULT 和 DIV 等 operator 會增加資源消耗。

請結合 DRC log 與反白顯示的模組和連結進行檢視。如需完整的工作流程,請參閱From Empty Design to Running Applet教學主題。

關鍵詞

處理 Bit Width 時,Basler 建議遵循以下實務做法:

  • 在每個 Arithmetic operator 之後,檢查下游 link 上傳遞的 Bit Width 。
  • 在轉型為較窄的寬度之前,請先對數值進行裁剪。
  • 儘早為主機軟體規劃 Bit Width 變更,例如在 DMA 之前採用每像素 16-bit。
  • 使用 ShiftLeft 和 ShiftRight 可能時,請使用 MULT 和 DIV 進行 2 的冪次方 Scaling,而不是
  • 當參數值無法套用時,請參閱Operator Reference。