自訂運算子庫

藉由 VisualApplets,您可以將在 VHDL 中設計的影像處理模組轉換為 VisualApplets operator。

您可以將模組作為 IP 核心納入 VisualApplets 中。每個 IP 核心會建構一個 operator。實作完成後,這些 operator 的運作方式將與內建的 VisualApplets operator 相同。以這種方式實作的 operator 稱為 custom operator。

若要在 VisualApplets GUI 上提供您的 custom operator,您還需要定義一或多個包含該 custom operator 的自訂函式庫。每個 custom operator 都必須是特定自訂函式庫的一部分。

工作流程

只需幾個步驟,即可將新的 custom operator 新增至 VisualApplets。您可以自行完成整個工作流程:

  1. 直接在 VA GUI 上指定 custom operator 的主要 Property 及其介面(operator 名稱、operator 版本、所需的 image in、image out 與 memory ports 的數量及 Property 等)。

  2. 根據您在步驟 1 中的輸入,讓 VisualApplets 為 operator 介面(黑盒子)產生 VHDL 程式碼,以及用於測試您實作內容的 VHDL 測試平台。

  3. 包裝您的 HDL 程式碼,使其介面與產生的黑盒子相符。自動產生的測試平台有助於測試您的實作內容。

  4. 建立您實作內容的網路表 (netlist)。如有需要,也請建立限制檔案 (constraints file)。

  5. 選用:建立 operator 文件(用於 operator 說明視窗)以及模擬模型(稍後可用於模擬包含該 custom operator 的 VA 設計)。

  6. 再次在 VA 中編輯 custom operator:新增產生的網路表,並可選擇性地新增說明檔案與模擬模型。

完成這些步驟後,您的影像處理模組即可直接在 VisualApplets 中作為 custom operator 使用,且其使用方式與任何其他 operator 相同。自訂函式庫會儲存為 *.val 或 *.vl 檔案(類似於使用者函式庫)。它們可以以此格式進行部署與散布。

VisualApplets 自訂運算子功能

VisualApplets(亦即 VisualApplets Custom Operator Functionality)在此工作流程中會使用兩次:

  1. 用於在 VisualApplets 中產生 operator 原型,以便匯出 HDL 程式碼來定義相關的 IP 核心介面(黑盒子與測試平台)。

  2. 透過新增合成所需的檔案以及(選用的)模擬與說明內容來完成 operator。

Generation of Operator Prototype:VA Custom Operator Functionality 可讓您建立 operator 原型,該原型可立即用於在 VisualApplets 中建立 operator 執行個體。針對此 operator 原型,可以匯出黑盒子介面以及 RTL 層級的模擬實體,以模擬所產生 operator 介面的通訊連接埠。接著,您可以開始編寫程式碼(即實作符合黑盒子介面的 HDL 程式碼)並模擬您的 custom operator 設計。然後,將產生的 FPGA 設計合成至 EDIF 或 NGC 網路表。您可以選擇性地新增限制檔案、為 VisualApplets 高階模擬建立動態連結函式庫,以及為 VisualApplets GUI 編寫 HTML 文件。

Completing the operator definition:VA Custom Operator Functionality 可讓您指定網路表、模擬函式庫和說明檔案。補充這些檔案後,operator 便可立即使用。

運算子類型

根據底層的流量控制機制,VisualApplets 支援不同類型的 operator 與連接埠。Operator 可以是 O 類型或 M 類型。

[提示] Custom Operator 類型:M

Custom operator 永遠是 M 類型。

同步與非同步運算子連接埠

Operator 連接埠可以是同步的或非同步的。在 VisualApplets 中,同步基本上是指多個連接埠的資料以同步方式傳輸,而非同步的連接埠則支援未對齊的通訊模式。

連接埠只有在具有共同的 M 來源,或是由 SYNC 模組提供來源時才是同步的;該來源與連接埠之間可以存在任何 O-operators 的組合。

根據 operator 輸入連接埠之間的相互關係,我們區分以下選項:

  1. Synchronous inputs:所有輸入連接埠彼此同步。有一個輸出連接埠。

  2. Asynchronous inputs:部分輸入連接埠彼此非同步,且所有輸出彼此同步。

不允許具備非同步輸出的運算子。具備同步輸入的運算子只能有一個輸出。如果需要多個輸出,則必須將輸入宣告為非同步。

[提示] 定義多個輸出

如果您想要建立具有多個輸出的運算子,則需要將其輸入宣告為非同步。多個輸出永遠是同步的。

這兩類(內建的 VisualApplets 運算子)的範例:

RemoveImage

具有同步輸入和一個輸出的 M 運算子。

SYNC

具有非同步輸入和多個同步輸出的 M 運算子。

介面架構

VisualApplets 自訂運算子介面旨在順暢地整合您的新運算子,使其在 VisualApplets 中的行為如同內建運算子。您可以為自訂運算子定義任意數量的輸入和輸出連接埠。

  • Image In / Image Out:Image In 和 Image Out 連接埠可能支援多種影像格式。它們由易於使用的 FIFO 介面驅動。FIFO 位於自訂運算子的 VA 部分中,因此您只需實作流量控制,而無需實作 FIFO。

  • Memory ports:您也可以定義任意數量的 Memory ports。它們同樣使用位於自訂運算子 VA 部分中的 FIFO。

  • GPIO ports:除了影像連接埠之外,您還可以定義通用 I/O 連接埠,例如用於向運算子傳遞非同步訊號。

  • Registers:為了讓您的運算子的最終使用者能夠設定運算子並存取狀態資訊,您可以定義任意數量的寫入和讀取暫存器。

  • Clock:用於接收時脈脈衝的連接埠會為每個自訂運算子自動設定。

  • Reset/Enable port:用於接收重設或啟用命令的連接埠會為每個自訂運算子自動設定。

以下章節詳細說明上圖中所示的不同介面類型。

時脈介面

VisualApplets 連接兩個時脈輸入——設計時脈以及與設計時脈同步但頻率加倍的第二個時脈。除 Memory 介面外,所有介面都必須與設計時脈同步。Memory 介面可以設定為對讀取和/或寫入介面使用設計時脈或倍頻時脈。

重設與啟用

Reset 和 Enable 輸入由實例化運算子的 VA 製程的相應「process enable」和「process reset」訊號驅動。請確保在您的運算子中實作以下行為作為對這些訊號的反應:

  • 確認 Reset 會將運算子置於其初始狀態。

  • 確認 Enable 會開始處理。

  • 停用 Enable 會停止處理。

  • (當 Enable=0 時,不會讀取運算子的輸出 FIFO。根據影像處理管線的狀態,某些資料可能仍會寫入輸入連接埠,但流量控制可安全地防止任何 FIFO 內容損毀。)

  • 僅當 Enable=0 時才會確認 Reset

自訂運算子的 VA 部分實作瞭對這些訊號的以下行為:

  • Reset 將清空所有連接埠介面 FIFO。

  • Reset 和 Enable 對運算子的參數沒有影響。

  • Reset 和 Enable 對運算子的 GPIO 介面沒有影響。

暫存器介面

為了傳遞算子參數和狀態,自訂算子可以配備任意數量的 VisualApplets 參數。每個參數都會對應到自訂算子的獨立暫存器連接埠。VisualApplets 會負責分派進出算子暫存器的存取作業。

影像資料介面

影像通訊協定

您可以定義自訂算子的影像輸入與影像輸出連接埠所支援的影像協定。如此一來,您算子的未來使用者便能從您提供的影像協定清單中進行選擇。

VisualApplets 提供以下影像格式供您算子的 ImgIn 與 ImgOut 連接埠支援:

  • grayXxP:每個像素具備 X 位元且 Parallelism 為 P 的灰階影像

  • rgbYxP: 每個色彩元件(紅、綠、藍)具備 Y/3 位元且 Parallelism 為 P 的彩色影像

  • hsiYxP: 每個色彩元件(HSI 色彩模型)具備 Y/3 位元且 Parallelism 為 P 的彩色影像

  • hslYxP: 每個色彩元件(HSL 色彩模型)具備 Y/3 位元且 Parallelism 為 P 的彩色影像

  • hsvYxP: 每個色彩元件(HSV 色彩模型)具備 Y/3 位元且 Parallelism 為 P 的彩色影像

  • yuvYxP: 每個色彩元件(YUV 色彩模型)具備 Y/3 位元且 Parallelism 為 P 的彩色影像

  • ycrcbYxP: 每個色彩元件(YCrCb 色彩模型)具備 Y/3 位元且 Parallelism 為 P 的彩色影像

  • labYxP: 每個色彩元件(LAB 色彩模型)具備 Y/3 位元且 Parallelism 為 P 的彩色影像

  • xyzYxP: 每個色彩元件(XYZ 色彩模型)具備 Y/3 位元且 Parallelism 為 P 的彩色影像

此外,影像尺寸以及像素元件是有號數還是無號數的資訊,可以透過選用的字尾來編碼。

The pixel data width X is limited to 64 bit. The width Y must be a multiple of 3 and is limited to 63 bit. The parallelism P defines the number of pixels which are contained in a single data word at the interface port. It must be chosen from following set of allowed values: P = {1, 2, 4, 8, 16, 32, 64}.

將影像資料封裝至給定介面寬度 N 的字組中時,必須遵循特定的規則:

  • 所有 P 個像素的資料必須放入長度為 N 的單一字組中。資料是以 LSB 對齊方式儲存,這表示對於像素寬度 Z(灰階時 Z=X,彩色時 Z=Y),資料的分布方式如下:Pixel[0]->Bits[0..Z-1] .. Pixel[P-1]->Bits[(P-1)*Z..P*Z-1]。

  • 對於 RGB 影像,三個色彩元件會以 LSB 對齊方式封裝至子字組 [0..Y-1] 中,順序如下:紅色使用位元 [0..Y/3-1],綠色使用位元 [Y/3..2*Y/3-1],藍色使用位元 [2*Y/3..3*Y/3-1]。

  • 對於 YUV 彩色影像,適用與 RGB 相同的規則,其中 Y 扮演紅色的角色,U 扮演綠色的角色,而 V 扮演藍色的角色。

  • 對於 HSI 彩色影像,適用與 RGB 相同的規則,其中 H 扮演紅色的角色,S 扮演綠色的角色,而 I 扮演藍色的角色。

  • 對於 LAB 彩色影像,適用與 RGB 相同的規則,其中 L 扮演紅色的角色,A 扮演綠色的角色,而 B 扮演藍色的角色。

  • 對於 XYZ 彩色影像,適用與 RGB 相同的規則,其中 X 扮演紅色的角色,Y 扮演綠色的角色,而 Z 扮演藍色的角色。

在 VisualApplets 中,任何連結都帶有最大影像寬度和最大影像高度等 Property。VisualApplets 允許您針對自訂算子所支援的任何影像協定,分別定義最大寬度和高度的選用條件限制。

對於影像介面連接埠,您可以定義允許的影像協定清單。此清單構成可能的 VisualApplets 影像格式的子集(見上方)。格式可以用以下 Property 來描述:

  • 資料類型 uint 或 int

  • 像素資料 Bit Width N = [1..64]

  • 灰階或 Color Format(具有彙總寬度 N 的單一或三個資料元件)

  • Color Format 的風味 (RGB, HSI, HSL, HSV, YUV, YCrCb, LAB, XYZ)

  • 2D、1D 或 0D

  • Parallelism P = {1,2,4,8,16,32,64}

隱含假設核心大小為 1x1。列出的格式從零開始編號, 並據此定義一個 ID。

當在 VisualApplets 中使用最終運算子時,您的運算子使用者可以 針對相關的影像通訊連接埠,選擇您在此處列出的任何格式。 根據 VA 使用者所做的選擇,對應的 ID 將輸出至 相關的自訂運算子連接埠。

這使自訂運算子能夠使其行為適應所選的格式。

影像輸入連接埠

影像輸入連接埠允許將影像資料從 VisualApplets 處理程序傳遞至 自訂運算子。這些連接埠命名為 ImgIn。如果您將 自訂運算子設計為支援其輸入通道的組態設定 (請參閱「Image Protocols」一節),則透過 VisualApplets 中的對應格式參數所選取的單一連接埠,可以驅動數個不同的通訊協定。 該介面基本上由一個 FIFO 和一個參數暫存器組成,該暫存器為實際 使用的資料格式提供 ID。自訂運算子必須負責讀取 FIFO,並根據所選影像格式的通訊協定來解譯 影像資料。運算子必須 根據提供 FIFO 填滿狀態資訊的狀態接腳,保證正確的流量控制,亦即當 FIFO 為空時不得讀取任何資料。

對於影像介面連接埠,需要定義允許的影像格式清單。 此清單構成可能 VisualApplets 影像格式 (請參閱「Image Protocols」一節) 的子集,其中格式可以用下列 Property 進行描述:

  • 資料類型 uint 或 int

  • 像素資料 Bit Width N = [1..64]

  • 灰階或 Color Format(具有彙總寬度 N 的單一或三個資料元件)

  • Color Format 的風味 (RGB, HSI, HSL, HSV, YUV, YCrCb, LAB, XYZ)

  • 2D、1D 或 0D

  • Parallelism P = {1,2,4,8,16,32,64}

隱含假設核心大小為 1x1。列出的格式從零開始編號, 並據此定義一個 ID。

當在 VisualApplets 中使用最終運算子時,使用者可以針對 有關的影像通訊連接埠,選擇您在此處列出的任何 格式。根據 VA 使用者所做的選擇,對應的 ID 將輸出至相關的 Custom Operator 連接埠。這使得自訂運算子能夠調整其行為以適應所選的 格式。

影像輸出連接埠

影像輸出連接埠允許將影像資料從自訂運算子傳遞至 VisualApplets 處理程序。這些連接埠命名為 ImgOut。如果您設計 自訂運算子以支援其輸出通道的適當組態設定 (請參閱 「Image Protocols」一節),則透過 VisualApplets 中的對應格式參數所選取的單一連接埠,可以驅動數個不同的通訊協定。 該介面基本上由一個 FIFO 和一個參數暫存器組成,該暫存器為 實際使用的資料格式提供 ID。自訂運算子必須負責根據所選影像格式的通訊協定將影像資料饋送至 FIFO 中。運算子必須 根據提供有關 FIFO 填滿狀態資訊的狀態接腳來保證正確的流量控制,亦即當 FIFO 已滿時不得寫入任何資料。

對於影像介面連接埠,需要定義允許的影像格式清單。 此清單構成可能 VisualApplets 影像格式 (請參閱「Image Protocols」一節) 的子集,其中格式可以用下列 Property 進行描述:

  • 資料類型 uint 或 int

  • 像素資料 Bit Width N = [1..64]

  • 灰階或 Color Format(具有彙總寬度 N 的單一或三個資料元件)

  • Color Format 的風味 (RGB, HSI, HSL, HSV, YUV, YCrCb, LAB, XYZ)

  • 2D、1D 或 0D

  • Parallelism P = {1,2,4,8,16,32,64}

隱含假設核心大小為 1x1。列出的格式從零開始編號, 並據此定義一個 ID。

當在 VisualApplets 中使用最終運算子時,使用者可以針對 有關的影像通訊連接埠,選擇您在此處列出的任何格式。根據 VA 使用者所做的選擇,對應的 ID 將輸出至相關的自訂 運算子連接埠。這使得自訂運算子能夠調整其行為以適應所選的 格式。

通用 I/O

通用 I/O 介面允許連接自訂運算子的 專用訊號接腳。每個 GPIO 連接埠都對應到自訂運算子的一個接腳,該接腳不是輸入就是 輸出。

不支援雙向接腳。在 VisualApplets 中,對應的運算子 連接埠屬於 SIGNAL 類型。

[提示] 不支援雙向接腳

GPIO 接腳必須是輸入或輸出。不支援 雙向接腳。

記憶體介面

可以設定自訂運算子以存取一個或多個記憶體庫。 相關的記憶體連接埠具有類似 FIFO 的介面,用於寫入和讀取命令。FIFO 位於自訂運算子的 VA 部分中,因此您只需實作流量 控制,而不需要實作 FIFO。將 FIFO 內容轉發到附加至自訂運算子的記憶體控制器的時序,完全由 VisualApplets 控制。

透過 GUI 定義個別自訂 Operator

首先,您需要輸入一些詳細資料來描述您的新自訂運算子。

VisualApplets 使用這些詳細資料來為您的自訂運算子產生 VHDL 黑箱 (Black Box) 以及用於模擬的對應測試平台 (Test Bench)。

您可以透過 VisualApplets GUI 輸入個別自訂運算子的組態設定。VisualApplets 會立即將指定的運算子提供用於設計中, 即使該運算子規格在網路表、模擬模型和 文件方面尚不完整。

[提示] 自訂函式庫檔案

包含所有運算子的自訂函式庫會儲存為單一 <LibaryName>.val 或 <LibaryName>.vl 檔案中。 <LibaryName> 是 自訂函式庫的名稱。

此檔案可以散布並直接應用於 VisualApplets 中。 只需將其複製到 VisualApplets 設定中所指定的自訂函式庫目錄中即可。

[提示] XML 格式的運算子組態設定

VisualApplets 以 XML 格式儲存自訂運算子規格。您可以將 XML 內容從自訂函式庫匯出至檔案,例如用於在版本 控制系統中進行處理。另一方面,您也可以匯入 XML 以新增自訂運算子 (請參閱 「匯入和匯出個別自訂運算子」一節)。您不需要 知道此 XML 檔案的外觀。不過,如果您想查看,請參閱 「自訂運算子規格的 XML 格式」一節。

建立新的自訂庫

在開始定義新的自訂運算子之前,您需要建立一個新運算子所屬的自訂程式庫。

如果您已經有一個現成的自訂程式庫可供新自訂運算子使用,請跳過此節並前往「建立新自訂運算子」一節。

若要建立新的自訂程式庫:

  1. 在Library選單中,選取Create New Custom Library功能表項目。

  2. 為您的新自訂程式庫命名。

  3. 依預設,新的自訂運算子程式庫會以 *.val 檔案格式儲存。如果您想在 VisualApplets 3.3.2 或更舊版本中開啟此程式庫,請選取 Legacy library format (.vl).

  4. 按一下 OK

[提示] 遵守有效 C 識別碼的慣例

在定義程式庫名稱時,請確保遵守有效 C 識別碼的慣例。

現在,新的自訂程式庫已建立。您可以在運算子面板的Custom Library標籤頁中看到它:

當您將滑鼠游標移至自訂程式庫名稱上方時,工具提示會顯示該程式庫是否儲存為 *.vl 舊版檔案格式:

若要建立新的自訂程式庫,您可能需要指定一個目錄來儲存所有與自訂程式庫相關的檔案。您可以在Settings → System Settings → Paths中進行此設定。

建立新的自訂運算子

若要定義新的自訂運算子:

  1. 在Library選單中,選取Edit Custom Library功能表項目。

  2. 在開啟的子選單中,選取New Custom Library Element。

  3. 在開啟的視窗中,透過按兩下程式庫名稱來選取自訂程式庫。

  4. 輸入您的自訂運算子名稱:

    [提示] 遵守 VHDL 命名慣例

    在 VA GUI 中定義運算子名稱時,請確保符合 VHDL 命名慣例。

    VHDL 的有效名稱定義如下:

    「連接埠、信號、變數、實體名稱、架構主體或類似物件的有效名稱,由一個字母開頭,後面接任意數量的字母或數字,且中間不可有空格。有效名稱也稱為具名識別碼。VHDL 不區分大小寫。不過,名稱內可以使用底線,但不得以底線開頭或結尾。不允許連續兩個底線。」

  5. 在儲存之前,您必須定義新運算子的 Property:

    如需關於定義新自訂運算子 Property 的詳細資訊,請參閱「定義自訂運算子的基本資訊」。

  6. 按一下Create按鈕。

    Edit Custom Operator對話方塊隨即開啟。您可以在此處定義您的自訂運算子。

  7. 按一下 Save 按鈕。

現在,您的新自訂運算子會顯示在它所屬的自訂函式庫下方:

一旦您建立了新的自訂運算子並將其儲存至 VisualApplets,您隨時都可以中斷工作並繼續進行。若要繼續,請前往 Custom Library 標籤頁、開啟函式庫、在運算子名稱上按一下滑鼠右鍵,然後從子選單中選取 Edit。

[提示] 改用運算子範本

或者,您可以使用 VisualApplets 安裝中提供的自訂運算子範本來定義新的自訂運算子。關於如何使用該範本,請參閱「Custom Operator Template」一節。

定義關於自訂運算子的基本資訊

首先,您需要定義自訂運算子的介面。

  1. 提供您的供應商名稱。您可以輸入任意字串。此資訊旨在供使用者辨識運算子。

  2. Provide a version number for your operator, e.g., version 1.0. You can enter any number but you should comply with the version scheme <major>.<minor>. This information is intended for operator version identification by the user.

  3. 切換至 Inputs 標籤頁。

定義影像輸入連接埠

在 Inputs 標籤頁下,您可以描述影像輸入連接埠的屬性。

  1. 首先,您需要定義自訂運算子 ImgIn 連接埠的輸入模式:

[提示] 同步與非同步運算子連接埠

運算子連接埠可以是同步的或非同步的。在 VisualApplets 中,同步基本上是指多個連接埠的資料是同步傳輸的,而彼此非同步的連接埠則支援未對齊的通訊模式。

唯有當連接埠具有共同的 M-source,或它們源自 SYNC 模組時,它們才是同步的;該來源與連接埠之間可以存在任意組合的 O 運算子。

根據運算子輸入連接埠之間的關係,我們區分以下選項:

同步輸入:

所有輸入連接埠彼此同步。有一個輸出連接埠。

非同步輸入:

部分輸入連接埠彼此非同步,且所有輸出彼此同步。

不允許具備非同步輸出的運算子。具備同步輸入的運算子只能有一個輸出。如果需要多個輸出,則必須將輸入宣告為非同步。

如果您想要建立具有多個輸出的運算子,則需要將其輸入宣告為非同步。多個輸出永遠都是同步的。

這兩類(VisualApplets 內建運算子)的範例:

RemoveImage

具備同步輸入和一個輸出的 M-Operator

SYNC

具備非同步輸入和多個同步輸出的 M-Operator

您可以定義一個或多個影像輸入連接埠(ImgIn)。每個 ImgIn 連接埠的使用次數可依您的指定而定。

  1. 按一下 Plus 按鈕 若要在 (ImgIn) 連接埠中建立第一個影像。

  2. 為 ImgIn 連接埠命名,並在 Multiplicity 欄位中定義輸入連接埠的數量:>1 表示定義一個連接埠陣列,其名稱由基底名稱和索引組成。

    程式視窗中的運算子呈現隨即會顯示輸入的 ImgIn 連接埠陣列:

  3. 在 Properties 面板中,您可指定此 ImgIn 連接埠所支援協定的屬性。

  4. 在 Port Width 下方,指定 ImgIn 連接埠的寬度。

  5. 在 Fifo Depth 下方,指定 VA 核心至少須提供的輸入資料緩衝區 FIFO 深度。該值必須是 15 到 1023 之間、2 的冪次方減 1。

    針對影像介面連接埠,您需定義允許的協定清單。協定可透過下列屬性進行描述:

    • 灰階或色彩格式(具備聚合寬度 N 的單一或三個資料元件)

    • Color Format 的風味 (RGB, HSI, HSL, HSV, YUV, YCrCb, LAB, XYZ)

    • 像素資料 Bit Width N = [1..64]

    • Parallelism P = {1,2,4,8,16,32,64}

    • 2D (陣列)、1D (線條) 或 0D (原始)

    • 資料類型 uint 或 int

    • 最大影像尺寸

    隱含假設核心大小為 1x1。

    所列出的協定從零開始編號,因而定義了一個 ID(在下方的圖片中,可見於 Properties 面板表格的左側欄)。

    如果您指定多個協定,即表示您將自訂運算子設計為支援其輸入通道的組態設定。在此情況下,單一連接埠可驅動數個不同的協定。

    您的自訂運算子使用者可以在特定的 ImgIn 連接埠上選擇其要使用的協定。根據 VA 使用者所做的選擇,對應的 ID 將會輸出至相關的自訂運算子連接埠。這可讓自訂運算子根據所選的協定調整其行為。

  6. 在 Format 下方,指定協定的色彩格式。

    允許使用下列色彩格式:

    • grayXxP:每個像素具備 X 個位元且 Parallelism 為 P 的灰階影像

    • rgbYxP: 每個色彩元件 (紅、綠、藍) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • hsiYxP: 每個色彩元件 (HSI 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • hslYxP: 每個色彩元件 (HSL 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • hsvYxP: 每個色彩元件 (HSV 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • yuvYxP: 每個色彩元件 (YUV 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • ycrcbYxP: 每個色彩元件 (YCrCb 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • labYxP: 每個色彩元件 (LAB 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • xyzYxP:每個彩色元件具備 Y/3 位元(XYZ 色彩模型)且 Parallelism 為 P 的彩色影像

  7. 在 Pix.Width 欄位的欄位中按兩下,並為特定格式指定像素資料寬度:

    Pix.Width 的數值範圍取決於您在 Format 下的選擇:

    Gray:像素資料寬度(以下稱為 X)限制為 64 bit。

    All color formats:像素資料寬度(以下稱為 Y)必須是 3 的倍數,且限制為 63 bit。

  8. 在 Parall. 欄位的欄位中按兩下,並為特定格式指定 Parallelism。

    The parallelism defines the number of pixels which are contained in a single data word at the interface port. It must be chosen from following set of allowed values: P = {1, 2, 4, 8, 16, 32, 64}. Packing of image data into words of a given interface width N (specified under Port Width) must follow certain rules:

    • 所有 P 個像素的資料必須裝入長度為 N 的單一 word 中。資料採用 LSB 對齊儲存,這表示對於像素寬度 Z(灰階時 Z=X,彩色時 Z=Y),資料分佈如下:Pixel[0]->Bits[0..Z-1] .. Pixel[P-1]->Bits[(P-1)*Z..P*Z-1]。

    • 對於 RGB 影像,三個色彩元件會以 LSB 對齊方式封裝至子 word [0..Y-1] 中,順序如下:紅色使用 bits [0..Y/3-1],綠色使用 bits [Y/3..2*Y/3-1],藍色使用 bits [2*Y/3..3*Y/3-1]。

    • 對於 HSI 彩色影像,適用與 RGB 相同的規則,其中 H 扮演紅色的角色,S 扮演綠色的角色,I 扮演藍色的角色。

    • 對於 HSL 彩色影像,適用與 RGB 相同的規則,其中 H 扮演紅色的角色,S 扮演綠色的角色,L 扮演藍色的角色。

    • 對於 HSV 彩色影像,適用與 RGB 相同的規則,其中 H 扮演紅色的角色,S 扮演綠色的角色,V 扮演藍色的角色。

    • 對於 YUV 彩色影像,適用與 RGB 相同的規則,其中 Y 扮演紅色的角色,U 扮演綠色的角色,V 扮演藍色的角色。

    • 對於 YCrCb 彩色影像,適用與 RGB 相同的規則,其中 Y 扮演紅色的角色,Cr 扮演綠色的角色,Cb 扮演藍色的角色。

    • 對於 LAB 彩色影像,適用與 RGB 相同的規則,其中 L 扮演紅色的角色,A 扮演綠色的角色,B 扮演藍色的角色。

    • 對於 XYZ 彩色影像,適用與 RGB 相同的規則,其中 X 扮演紅色的角色,Y 扮演綠色的角色,Z 扮演藍色的角色。

  9. 在 Dimension 下,指定該協定支援 2D(區域)、1D(線形)還是 0D(Raw)影像。

  10. Max.Width/Max.Height:使用這些選填欄位,您可以為影像寬度和影像高度定義限制條件。

  11. 重複步驟 6 到 10,以為 ImgIn 連接埠支援任意數量的協定。

  12. 重複步驟 1 到 11,以為自訂運算子提供任意數量的 ImgIn 連接埠。

定義影像輸出連接埠

在 Outputs 索引標籤下,您將描述影像輸出連接埠的屬性。

您可以定義一或多個影像輸出連接埠(ImgOut)。每個 ImgOut 連接埠都可以按照您指定的次數使用。

  1. 按一下 Plus 按鈕 以建立第一個影像輸出(ImgOut) 連接埠中建立第一個影像。

  2. 為 ImgOut 連接埠命名。

  3. 在 Multiplicity 欄位的欄位中按兩下以建立連接埠陣列。Multiplicity >1 會定義一個連接埠陣列,其名稱由基礎名稱與索引組成。

    程式視窗中的 operator 圖示會立即顯示所輸入的 ImgOut 通訊埠陣列:

  4. 在 Properties 面板中,您可指定此 ImgOut 通訊埠所支援的通訊協定屬性。

    在 Port Width 下,指定 ImgOut 通訊埠的寬度。

  5. 在 Fifo Depth 下,指定輸出資料的緩衝區 FIFO 深度,VA 核心至少需提供此深度。該數值必須介於 15 到 1023 之間,且為 2 的冪次方減 1。

    針對影像介面連接埠,您需定義允許的協定清單。協定可透過下列屬性進行描述:

    • 灰階或 Color Format(具有彙總寬度 N 的單一或三個資料元件)

    • Color Format 的風味 (RGB, HSI, HSL, HSV, YUV, YCrCb, LAB, XYZ)

    • 像素資料 Bit Width N = [1..64]

    • Parallelism P = {1,2,4,8,16,32,64}

    • 2D (陣列)、1D (線條) 或 0D (原始)

    • 資料類型 uint 或 int

    • 最大影像尺寸

    隱含假設核心大小為 1x1。

    所列出的協定從零開始編號,因而定義了一個 ID(在下方的圖片中,可見於 Properties 面板表格的左側欄)。

    如果您指定多個協定,即表示您將自訂運算子設計為支援其輸入通道的組態設定。在此情況下,單一連接埠可驅動數個不同的協定。

    您自訂 operator 的使用者可以在特定的 ImgOut 通訊埠上選擇要使用的通訊協定。根據 VA 使用者所做的選擇,對應的 ID 將會輸出至相關的自訂 operator 通訊埠。這可讓自訂 operator 根據所選的通訊協定調整其行為。

  6. 在 Format 下方,指定協定的色彩格式。

    允許使用下列色彩格式:

    • grayXxP:每個像素具備 X 個位元且 Parallelism 為 P 的灰階影像

    • rgbYxP: 每個色彩元件 (紅、綠、藍) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • hsiYxP: 每個色彩元件 (HSI 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • hslYxP: 每個色彩元件 (HSL 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • hsvYxP: 每個色彩元件 (HSV 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • yuvYxP: 每個色彩元件 (YUV 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • ycrcbYxP: 每個色彩元件 (YCrCb 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • labYxP: 每個色彩元件 (LAB 色彩模型) 具備 Y/3 個位元且 Parallelism 為 P 的彩色影像

    • xyzYxP:每個彩色元件具備 Y/3 位元(XYZ 色彩模型)且 Parallelism 為 P 的彩色影像

  7. 在 Pix.Width 欄位的欄位中按兩下,並為特定格式指定像素資料寬度:

    Pix.Width 的數值範圍取決於您在 Format 下的選擇:

    Gray:像素資料寬度(以下稱為 X)限制為 64 bit。

    All color formats:像素資料寬度(以下稱為 Y)必須是 3 的倍數,且限制為 63 bit。

  8. 在 Parall. 欄位的欄位中按兩下,並為特定格式指定 Parallelism。

    The parallelism defines the number of pixels which are contained in a single data word at the interface port. It must be chosen from following set of allowed values: P = {1, 2, 4, 8, 16, 32, 64}. Packing of image data into words of a given interface width N (specified under Port Width) must follow certain rules:

    • 所有 P 個像素的資料必須裝入長度為 N 的單一 word 中。資料採用 LSB 對齊儲存,這表示對於像素寬度 Z(灰階時 Z=X,彩色時 Z=Y),資料分佈如下:Pixel[0]->Bits[0..Z-1] .. Pixel[P-1]->Bits[(P-1)*Z..P*Z-1]。

    • 對於 RGB 影像,三個色彩元件會以 LSB 對齊方式封裝至子 word [0..Y-1] 中,順序如下:紅色使用 bits [0..Y/3-1],綠色使用 bits [Y/3..2*Y/3-1],藍色使用 bits [2*Y/3..3*Y/3-1]。

    • 對於 HSI 彩色影像,適用與 RGB 相同的規則,其中 H 扮演紅色的角色,S 扮演綠色的角色,I 扮演藍色的角色。

    • 對於 HSL 彩色影像,適用與 RGB 相同的規則,其中 H 扮演紅色的角色,S 扮演綠色的角色,L 扮演藍色的角色。

    • 對於 HSV 彩色影像,適用與 RGB 相同的規則,其中 H 扮演紅色的角色,S 扮演綠色的角色,V 扮演藍色的角色。

    • 對於 YUV 彩色影像,適用與 RGB 相同的規則,其中 Y 扮演紅色的角色,U 扮演綠色的角色,V 扮演藍色的角色。

    • 對於 YCrCb 彩色影像,適用與 RGB 相同的規則,其中 Y 扮演紅色的角色,Cr 扮演綠色的角色,Cb 扮演藍色的角色。

    • 對於 LAB 彩色影像,適用與 RGB 相同的規則,其中 L 扮演紅色的角色,A 扮演綠色的角色,B 扮演藍色的角色。

    • 對於 XYZ 彩色影像,適用與 RGB 相同的規則,其中 X 扮演紅色的角色,Y 扮演綠色的角色,Z 扮演藍色的角色。

  9. 在 Dimension 下,指定該協定支援 2D(區域)、1D(線形)還是 0D(Raw)影像。

  10. Max.Width/Max.Height:使用這些選填欄位,您可以為影像寬度和影像高度定義限制條件。

  11. 重複步驟 6 至 10,以定義您希望 ImgOut 通訊埠支援的任意數量通訊協定。

  12. 重複步驟 1 至 11,以定義您希望自訂 operator 支援的任意數量 ImgOut 通訊埠。

定義 GPIO 連接埠

通用 I/O 介面允許連接自訂運算子的 專用訊號接腳。每個 GPIO 連接埠都對應到自訂運算子的一個接腳,該接腳不是輸入就是 輸出。

不支援雙向接腳。在 VisualApplets 中,對應的 operator 通訊埠型別為 SIGNAL。

  1. 前往 GPIO 分頁。

  2. 使用下列項目新增所需的任意數量 GPI 與 GPO: Plus 按鈕 .

  3. 按兩下欄位以為特定的 GPI 或 GPO 命名。

程式視窗左上方面板中的自訂 operator 圖示會立即顯示已定義的 GPI 與 GPO:

[提示] 不支援雙向接腳

接腳只能是輸入或輸出。不支援雙向接腳。

定義記憶體連接埠

可以將自訂 operator 設定為存取一個或多個 Memory 庫(DRAM、SRAM 等)。

所有 Memory 通訊埠都具有類似 FIFO 的介面,可用於寫入和讀取指令。這些 FIFO 位於自訂 operator 的 VA 部分中,因此您只需要實作流量控制,而不需要實作 FIFO。將 FIFO 內容轉發至連接至自訂 operator 之 Memory 控制器的時序完全由 VisualApplets 控制。

在 Memory 分頁下,您可以定義您的 operator 能夠存取外部 Memory。您可以指定最多 4 個通訊埠。您可以指定 operator 所需的 Memory 介面屬性。

[提示] 符合目標平台的 Memory 配置

請記住潛在目標平台(將執行包含自訂 operator 之 applet 的平台)的 Memory 配置。

參數名稱

Type

描述

Data Width

Integer

資料寬度

Address Width

Integer

位址寬度

Number of Write Flags (Width)

Integer

標記寫入存取的旗標寬度。此參數必須 >= 1。

Number of Read Flags (Width)

Integer

標記讀取存取的旗標寬度。此參數必須 >= 8。

SyncMode

String

此參數用來表示 Memory 介面時脈與設計時脈之間的關係。可使用下列數值:

SyncToDesignClk – Memory 介面通訊埠與下列項目同步: iDesignClk.

SyncToDesignClk2x – Memory 介面通訊埠與下列項目同步: iDesignClk2x.

定義自訂運算子的暫存器

在 Registers 標籤頁中,您可以定義自訂算子將提供的寫入和讀取暫存器。在 VisualApplets 中,每個此類暫存器都是透過專用的算子參數進行存取(參數名稱與暫存器名稱相同)。

  1. 前往 Registers 標籤頁。

  2. 在 Write Registers 下,定義您希望自訂算子擁有的寫入暫存器。

  3. 為每個寫入暫存器指定特定的位元寬度。

  4. 在 Read Registers 下,定義您希望自訂算子擁有的讀取暫存器。

  5. 為每個讀取暫存器指定特定的位元寬度。

    相關的算子參數會立即顯示在對話視窗的左下方面板中:

  6. 按一下 Save.

產生 VHDL Black Box 與測試平台 (Test Bench)

在您輸入了 'Defining an Individual Custom Operator via GUI' 一節中所述的所有詳細資料後,即可進行實際的 VHDL 編碼。首先,您需要 VisualApplets 來產生 VHDL 黑箱和測試平台。

若要觸發 VHDL 黑箱和測試平台的產生:

  1. 在 VisualApplets 程式視窗的 Library 面板中,前往 Custom Library 標籤頁。

  2. 開啟自訂庫並選取您要實作的自訂算子。

  3. 在算子名稱上按一下滑鼠右鍵,然後從子選單中選取 Export → VHDL。

  4. 指定您要儲存所建立之 VHDL 檔案的資料夾。

此時會開始產生。產生成功後,會開啟確認對話方塊。按一下 OK 以確認。

您可以在您指定的資料夾中找到所有產生的檔案。

Operator 介面連接埠

產生的黑箱提供了您透過 GUI 指定的所有連接埠(請參閱 'Defining an Individual Custom Operator via GUI')。

在本章中,您可以找到關於這些連接埠在產生的 VHDL 黑箱中之外觀的詳細說明。

時脈系統、重設與致能

VisualApplets 支援兩個時脈網域。其中包含一個基礎設計時脈以及一個與該時脈同相且頻率加倍的衍生時脈。因此,自訂算子有兩個時脈輸入。此外,還有一個 Reset 和 Enable 如上所述的輸入。

連接埠

方向

Width

描述

iDesignClk

在

1

基礎設計時脈

iDesignClk2x

在

1

時脈同步至 iDesignClk 但頻率加倍

iReset

在

1

算子重設

iEnable

在

1

啟用處理

參數介面

正如章節所述,寫入暫存器連接埠的定義 'Defining an Individual Custom Operator via GUI' 會產生如下的介面,其中 PORTID 為暫存器名稱,且 PORTIDWidth 為已定義的暫存器位元寬度。

連接埠

方向

Width

描述

ivReg_PORTID_D

在

PORTIDWidth

暫存器資料

iReg_PORTID_Wr

在

1

訊號寫入存取

如 'Defining the Registers of the Custom Operator' 中所述,讀取暫存器連接埠的定義會對應產生以下介面:

連接埠

方向

Width

描述

ovReg_PORTID_D

輸出

PORTIDWidth

暫存器資料

iReg_PORTID_Rd

在

1

訊號讀取存取

影像通訊介面

為了在 VisualApplets 核心與自訂運算子之間進行資料通訊,可以設定如 'Defining the Image Input Ports' 中所述的影像通訊連接埠。通訊透過簡單的 FIFO 介面以及額外的格式識別符連接埠來完成。

ImgIn 類型的介面

用於將資料從 VisualApplets 核心傳輸至自訂運算子的 ImgIn 通道會產生如下介面,其中 PORTID 是對應連接埠型別名稱的名稱,而 X 則是 用於區分多個同類連接埠的連接埠編號:

連接埠

方向

Width

描述

ivPORTIDXData

在

PORTIDWidth

進入自訂運算子的資料

oPORTIDXRead

輸出

1

接受輸入資料

iPORTIDXEndOfLine

在

1

訊號行結束。如果啟用此旗標,則資料不包含像素值。

iPORTIDXEndOfFrame

在

1

訊號影格結束。如果啟用此旗標,則資料不包含像素值。此旗標僅在同時發出行結束訊號時才會被確立。

iPORTIDXFIFOEmpty

在

1

緩衝區 FIFO 為空

ivPORTIDXFIFOCnt

在

Ceil Log2(PORTIDFIFODepth)

緩衝區 FIFO 中的字數。此訊號可用於產生 FIFO 旗標,例如 Almost Empty.

ivPORTIDX_FID_D

在

Ceil Log2(N)

用於通知目前影像資料格式的預先定義參數。N 是為此連接埠指定的影像格式數量。

下圖說明了 ImgIn 連接埠處的資料流。連接埠名稱元件 PORTIDX 已被替換為 ImgIn。波形顯示了大小為 3x2 的二維影格輸入。

當 ImgIn 連接埠是多個 O-synchronous 輸入連接埠的一部分時,所有連接埠都必須同時消耗 FIFO 資料。在這種情況下,所有連接埠的 FIFO 填充級別將完全相符,因此運算子只需要根據多個 O-synchronous 輸入之一的填充級別來實作流量控制。

ImgOut 類型的介面

用於將資料從自訂運算子傳輸至 VisualApplets 核心的 ImgOut 通道會產生如下介面,其中 PORTID 是對應連接埠型別名稱的名稱,而 X 則是 用於區分多個同類連接埠的連接埠編號:

連接埠

方向

Width

描述

ovPORTIDXData

輸出

PORTIDWidth

輸出資料

oPORTIDXValid

輸出

1

輸出資料有效

oPORTIDXEndOfLine

輸出

1

將目前的寫入存取發出訊號作為行結尾通知。此時寫入資料將不會被解釋為像素資料。

oPORTIDXEndOfFrame

輸出

1

將目前的寫入存取發出訊號作為影格結尾通知。此時寫入資料將不會被解釋為像素資料。此旗標需要同時與行結尾選通信號相關聯。

iPORTIDXFIFOFull

在

1

Buffer FIFO 已滿,不再接受任何資料

ivPORTIDXFIFOCnt

在

Ceil Log2(PORTIDFIFODepth)

緩衝區 FIFO 中的字數。此訊號可用於產生 FIFO 旗標,例如 Almost Full.

ivPORTIDX_FID_D

在

Ceil Log2(N)

用於通知目前影像資料格式的預先定義參數。N 是為此連接埠指定的影像格式數量。

下圖說明了 ImgOut 連接埠處的資料流。波形顯示了大小為 3x2 的二維影格之輸出。當 ImgOut 連接埠是多個 O-synchronous 輸出連接埠的一部分時,它們必須同時發出資料。

Memory 介面

可以設定自訂運算子以擁有多達四個記憶體埠。所產生介面的 I/O 埠會獲得一個後綴 X,其中 X 是記憶體埠的索引。

姓名

方向

Width

描述

ovMemWrDataX

輸出

MemDataWidthX

透過 VisualApplets 核心將寫入資料輸出至記憶體

ovMemWrFlagX

輸出

MemWrFlagWidthX

寫入旗標輸出

ovMemWrAddrX

輸出

MemAddrWidthX

寫入位址

oMemWrAddrValidX

輸出

1

發出寫入指令

oMemWrPriorityX

輸出

1

要求此寫入埠的優先權

iMemWrAlmostFullX

在

1

可能僅接受單一後續寫入指令

iMemWrFullX

在

1

由於相關的 FIFO 已滿,不接受任何寫入指令

iMemWrEmptyX

在

1

寫入指令的 FIFO 為空

ivMemWrCntX

在

4

緩衝的寫入指令數量

ivMemWrFlagX

在

MemWrFlagWidthX

來自 VisualApplets 核心的寫入旗標輸出

iMemWrFlagValidX

在

1

寫入旗標輸入有效 – 發出訊號表示 iMemWrFlagX 有效,這表示先前已用對應的 oMemWrFlagX 標記之寫入存取已被執行。

ovMemRdFlagX

輸出

MemRdFlagWidthX

讀取旗標

ovMemRdAddrX

輸出

MemAddrWidthX

讀取位址

oMemRdAddrValidX

輸出

1

發出讀取指令

oMemRdPriorityX

輸出

1

要求此讀取埠的優先權

iMemRdAlmostFullX

在

1

可能僅接受單一後續讀取指令

iMemRdFullX

在

1

由於相關的 FIFO 已滿,不接受任何讀取指令

iMemRdEmptyX

在

1

用於讀取指令的 FIFO 為空

ivMemRdCntX

在

4

已緩衝的讀取指令數量

ivMemRdFlagX

在

MemRdFlagWidthX

讀取旗標輸入 – 僅在以下情況下有效: iMemRdDataValidX 已宣告

ivMemRdDataX

在

MemDataWidthX

讀取資料輸入

iMemRdDataValidX

在

1

讀取資料有效

上圖說明瞭記憶體介面協定波形。

通用 I/O 引腳

在自訂 operator 的介面描述(「透過 GUI 定義個別自訂 operator」一節)中定義的任何 GPIO 輸入或輸出訊號,在產生的 operator 介面中都有對應的輸入或輸出埠。宣告通用接腳時,將建立以下連接埠:

  • iSig_名稱 對於名為的 GPIO 輸入訊號 名稱.

  • oSig_名稱 對於名為的 GPIO 輸出訊號 名稱.

VHDL 模擬與驗證

為了模擬包含自訂 operator 模組的 VisualApplets 設計,VisualApplets 會為連接至自訂 operator 的介面建立模擬測試台。

每個介面連接埠均獨立模擬,由 File I/O 驅動。模擬實體應由下列元素組成:

  • 暫存器存取模擬。根據激勵檔案,可以寫入和讀取一組暫存器。

  • 連接至 ImgIn 類型連接埠的畫格來源模擬器。受檔案激勵,這些類型的模組將畫格資料輸出至 ImgIn。

  • 連接至 ImgOut 類型連接埠的畫格接收器模擬器。這種類型的模組會模擬連接至 ImgOut 的 operator。該模組會將接收到的資料寫入檔案。

  • 記憶體連接埠模擬器。

  • GPIO 模擬器。每個用於輸入的 GPIO 訊號均由透過檔案設定的訊號產生器驅動。每個 GPIO 訊號輸出都會受到監控,並且訊號的變更會寫入報告檔案。

模擬架構

對於 RTL 層級模擬,VisualApplets 會建立一個 VHDL 檔案,其中包含一個名為 CustomOperator_<OPERATORNAME> 其中 <OPERATORNAME> 是指定的 operator 名稱。

此封裝包含以下元件 <OPERATORNAME> 和 <OPERATORNAME>_TB 其中後者是 VisualApplets 設計與自訂 operator 之間介面的測試台。以下顯示名為簡單自訂 operator 的產生的程式碼 RegExample 僅由一個讀取和寫入暫存器埠組成(Ctrl 和 Status),每個寬度為 4 位元:

 
component 
RegExample port(
  iDesignClk: in std_logic := '0';
  iDesignClk2x: in std_logic := '0';
  iReset: in std_logic := '0';
  iEnable: in std_logic := '0';
  ivReg_Ctrl_D: in std_logic_vector(3 downto 0);
  iReg_Ctrl_Wr: in std_logic;
  ovReg_Status_D: out std_logic_vector(3 downto 0);
  iReg_Status_Rd: in std_logic
);
end component;

component 
RegExample_TB generic(
  DesignClkPeriod: time := 16 ns;
  Register_StimuliFileName: string := ""
);
end component;
 

測試台會建立自訂 operator 的實例,並將協定模擬模組連接到每個介面連接埠。以下章節將說明不同類型的模擬器、如何透過激勵檔案控制它們,以及如何產生輸出檔案。

暫存器介面模擬

產生的測試台實作了暫存器存取介面的模擬器。該模擬器設定為定址具有單一處理序的設計。寫入和讀取暫存器的位址從 0x4 開始,暫存器位址根據給定自訂 operator 元件中暫存器介面埠的順序以 1 的增量遞增(如上述範例元件) RegExample).讀取和寫入的暫存器位址是獨立計數的。模擬器由透過 entity 參數設定的文字檔來驅動 Register_StimuliFileName 如上述 VHDL 程式碼中所提供。

激勵檔案中可能存在以下指令:

指令

描述

REM

行餘部分為註解

GRS

模擬全域重設

PRS

模擬處理重設。此指令具有以下語法: PRS <procNr> 其中參數 <procNr> 必須始終為 0。

PEN

啟用處理程序。語法如下: PEN <procNr> <value> 並使用 <procNr> 始終為 0 且 <value> 發出啟用狀態訊號。

WCK

等待一定數量的時脈週期。語法如下: WCK <clock_ticks> 並使用 <clock_ticks> 以十六進位格式給出時脈脈衝數

WRR

寫入暫存器: WRR <wrRegAddr> <value> 使用以下參數: <wrRegAddr>: 暫存器位址 (十六進位) <value>: 十六進位暫存器值

RDR

從暫存器讀取: RDR <rdRegAddr> 並使用 <wrRegAddr> 作為暫存器位址(十六進位)。

在任何指令的最後一個參數之後,可以加上以 “#” 開頭的註解。

以下程式碼是一個激勵檔案範例,它根據上述測試平台存取暫存器 RegExample_TB:

REM ************************************************************ 
REM Command formats:
REM GRS	-> Global reset
REM GEN <value>	-> Set global enable to <value>
REM PRS <procID>	-> Reset process <procID> (0 .. F) REM PEN <procID> <value>	
  -> Set enable of process <procID> to
<value>
REM WCK <clk_ticks>	-> Wait for <clk_ticks> clock cycles REM WRR <wrRegAddr> <value> 
  -> Write <value> to register <wrRegAddr> REM RDR <rdRegAddr>	-> Read from register <rdRegAddr>
REM ************************************************************

WCK	0004		#	wait for 4 clock cycles
GRS			#	global reset
GEN	1		#	set global enable
WCK	0001		#	wait for 1 clock tick
PRS	0		#	reset process 0
PEN	0 1		#	set enable of process 0
WCK	0002		#	wait for 2 clock ticks
WRR	0004	0000000A	#	write 0xA to address 0x4
WCK	0002		#	wait for 2 clock ticks
RDR	0004		#	read from address 0x4
WCK	FFFF			       
      

模擬 ImgIn 介面

類型為 ImgIn 的影像通訊介面模擬是由提供進入自訂 operator 的資料序列資訊的激勵檔案所驅動。對於任何存在的 ImgIn 連接埠,測試平台都有一個 <PORTIDX>_StimuliFileName where <PORTIDX> 是對應影像輸入連接埠類型的名稱,後面接著連接埠編號。給定檔案中的每一行都必須遵循以下語法:

 <Command> <Data> <EndOfLine> <EndOfFrame> <DataValid>            
      

其中 <Command> 是一個三字母命令, <Data> 提供一個十六進位資料字,其餘三個參數對應至 image protocol 旗標。

下表描述可用的命令:

指令

描述

DAT

Data 命令。此命令提供將成為連接埠輸入的資料 ivPORTIDXData 以及相關的 image protocol 旗標連接埠。

WCK

等待命令。參數 <Data> 提供命令直譯器暫停的時脈刻度數。

FID

設定 FID 輸入。參數 <Data> 提供連接埠 ivPORTIDX_FID_D 將被設定為的值。

任何命令列皆可新增註解,前面加上 “#”。

以下程式碼是一個 stimuli 檔案範例,會觸發 3x2 影像的輸入:

      
FID	00000001	0	0	0 #Format: Cmd Data(hex) EndOfLine EndOfFrame DataValid
DAT	00000000	0	0	0
DAT	0000001a	0	0	1
DAT	0000001b	0	0	1
DAT	0000001c	0	0	1
DAT	00000000	1	0	1
WCK	00000004	0	0	0
DAT	0000002a	0	0	1
DAT	0000002b	0	0	1

DAT	0000002c	0	0	1
DAT	00000000	1	1	1
WCK	0000FFFF	0	0	0  
      

ImgOut 介面的模擬

類型為 ImgOut 由提供 FID 狀態序列資訊的 stimuli 檔案所驅動。對於任何現有的 ImgOut 連接埠,VA_Design_Emulator 實體具有一個通用 <PORTIDX>_StimuliFileName 其中 <PORTIDX> 是對應的影像輸出連接埠類型名稱,後面接著連接埠編號。語法與 ImgIn 介面的 stimuli 完全相同,只是沒有 DAT 命令可用。一個簡單的 stimuli 檔案可能如下所示:

WCK 00000010 0 0 0    #Format: Command Data(hex)
FID 00000001 0 0 0
WCK 0000FFFF 0 0 0 
    

參數 <EndOfLine>,<EndOfFrame> 和 <DataValid> 實際上並無意義。

影像 ImgOut 產生的測試台中的介面模擬器會將接收到的資料寫入檔案。為此,測試台實體具有一個通用 <PORTIDX>_DumpFileName。在模擬期間,系統會建立一個給定名稱的檔案,並使用 DAT 和 WCK 命令將資料寫入,其格式完全對應至 ImgIn 介面模擬器的 stimuli 檔案格式。

Memory 通訊模擬

當自訂運算子實作記憶體介面時,測試台會將記憶體模擬模組連接至對應的介面連接埠。自訂運算子不得依賴記憶體介面的特定時序(例如返回讀取資料的時間),因為這完全由 VisualApplets 控制,且可能會因平台甚至不同設計而異。

GPIO 模擬

專用輸入訊號的模擬是針對每個訊號獨立進行的,由 stimuli 檔案驅動。其中提供了關於訊號狀態序列的資訊。stimuli 檔案可能包含多個在下方描述的命令。對於任何現有的輸出訊號連接埠,測試台實體具有一個通用 iSig_<NAME>_StimuliFileName 其中 <NAME> 是相關的連接埠名稱。

下表描述可用的命令:

指令

描述

SET

Set signal. 此命令提供連接埠 iSig_名稱 上的輸出將被設定的訊號狀態。下一個命令將在一個時脈週期後執行。其語法為: SET <value> 其中 <value> 可以是 0 或 1。

WCK

Wait 命令。其語法為: WCK <ticks> 其中參數 <ticks> 提供訊號將保持恆定的時脈數。

RST

從頭重新開始。命令解譯器將從 stimuli 檔案的第一行重新開始。此命令沒有任何參數。該命令將在同一個時脈周期執行檔案的第一個命令,從而能夠組裝無間隙的迴圈。

STP

在目前狀態停止。命令解譯器將停止,並且目前的訊號狀態將保持不變,直到模擬結束。此命令沒有任何參數。

任何命令列皆可新增註解,前面加上 “#”。

以下程式碼是一個範例激勵檔案,它會使自訂運算子輸入訊號保持低電位 5 個時脈週期,並保持高電位 7 個時脈週期(與 iDesignClk):

SET 0	   # deassert output
WCK 0004	# wait for 4 clock cycles
SET 1	   # assert output
WCK 0006	# wait for 6 clock cycles
RST	     # restart from begin
      

透過寫入傾印檔案來監控專屬輸出訊號 oSig_<NAME>_DumpFileName 其中

<NAME> 是相關的連接埠名稱。該檔案由 SET 和 WCK 組成,這些指令完全對應於專屬輸入訊號的激勵檔案指令。

定義自訂 Operator 的軟體介面

若要將自訂運算子完整整合至 VisualApplets,必須提供高階模擬元件。高階模擬元件需要編譯成具有預定義匯出 C 函數集的動態連結庫。您可以在 General → Simulation Library 標籤頁下將此檔案新增至運算子規格中:

為了在 VisualApplets 內進行高階模擬,必須匯出以下函數,

int SimulateOPNAME (va_custom_op_sim_handle simHandle)
        

其中 OPNAME 是自訂運算子的名稱。

高階模擬必須符合以下要求:

  • Frame based simulation - 在每個影像輸入連接埠上,都可以查詢是否有一個或多個影格可用。如果啟動模擬所需的所有連接埠都能提供影格,則需要透過呼叫適當的函數來計算並發出相關的輸出影格。對於一維影像資料,資料串流會自動分割成影格,並像 2D 資料一樣進行模擬。

  • Bit accurate simulation – 結果影格的計算必須是位元準確的,即輸出資料必須與硬體實作所產生的資料完全相同。

  • Keeping consistency of flow – 當運算子輸入連接埠彼此同步時,必須相應地擷取輸入影像。當定義了多個輸出時,必須同時輸出影像。對於模擬函數而言,這意味著當向一個輸出鏈結輸出影格時,必須在模擬函數返回之前向所有其他輸出鏈結輸出影格。

由於運算子的行為通常取決於運算子參數集,因此可以透過以下介面查詢這些參數:

編號

功能

描述

1

vaSi_CustomOp_GetParamValue()

取得運算子參數的值。

VisualApplets 提供了幾個函數,用於取得、產生和儲存自訂運算子的影像資料:

編號

功能

描述

1

vaSi_CustomOp_GetInputImage()

取得在 ImgIn 連接埠上可用的影像。

2

vaSi_CustomOp_PutOutputImage()

輸出影像至 ImgOut 連接埠。

3

vaSi_CustomOp_InputHasImage()

查詢 ImgIn 連接埠是否可以傳遞影像。

4

vaSi_CustomOp_OutputReady()

查詢 ImgOut 連接埠是否可以接收影像。

5

vaSi_CustomOp_CreateImage()

建立新影像。

6

vaSi_CustomOp_DeleteImage()

刪除影像。

7

vaSi_CustomOp_StoreImage()

將影像儲存在運算子實例的本地儲存空間中,並提供一個名稱以便日後參照該影像。

8

vaSi_CustomOp_GetStoredImagesCount()

查詢儲存在運算子實例中的影像數量。

9

vaSi_CustomOp_GetStoredImage()

依索引取得儲存的影像。

10

vaSi_CustomOp_GetNameOfStoredImage()

透過索引取得儲存的影像名稱。

11

vaSi_CustomOp_GetStoredImageByName()

透過名稱取得儲存的影像。

12

vaSi_CustomOp_CreateImageFormat()

建立新的影像格式代handle,該handle會由與指定 port 相關聯的格式進行初始化。

13

vaSi_CustomOp_CopyImageFormat()

建立作為指定格式副本的新影像格式。

14

vaSi_CustomOp_DeleteImageFormat()

刪除先前建立的影像格式 handle。

若要透過影像 handle 操作影像,可以使用以下函式:

編號

功能

描述

1

vaSi_Image_GetFormat()

取得影像格式。

2

vaSi_Image_SetProperty()

設定畫格的 Property(例如高度)。

3

vaSi_Image_GetProperty()

取得畫格的 Property。

4

vaSi_Image_SetPixelValue()

設定像素元件值

5

vaSi_Image_GetPixelValue()

取得像素元件值

6

vaSi_Image_SetLineLength ()

設定單行的大小。

7

vaSi_Image_GetLineLength ()

取得單行的大小。

可以透過以下函式操作影像格式:

編號

功能

描述

1

vaSi_ImageFormat_SetProperty()

設定影像格式 Property(例如最大寬度)。

2

vaSi_ImageFormat_GetProperty()

取得影像格式 Property。

模擬函式可以使用以下函式向 VisualApplets 模擬系統注入狀態訊息(即錯誤訊息):

編號

功能

描述

1

vaSi_CreateStatusMessage()

建立狀態訊息。

2

vaSi_SetStatusMessageProperty()

設定狀態訊息的 Property(例如嚴重性)。

3

vaSi_SendStatusMessage()

將狀態訊息提交至模擬引擎。

資料通訊

為了查詢資訊與設定參數,必須透過軟體介面交換資料。為了保持介面函式簡便同時提供型別安全的介面,實作了一種資料抽象化機制。每當需要通訊不同類型的資料時,就會使用稱為 va_data 的資料結構,其中包含對資料的參照以及有關底層資料類型的資訊。此資料結構由使用者建立,但透過下方列出的專用函式進行設定。下表顯示由此方法處理的資料類型:

Data Type

描述

VA_ENUM

以 32-Bit 整數給定的 enum 項目

VA_INT32

32-Bit 有號整數

VA_UINT32

32-Bit 無號整數

VA_INT64

64位元帶符號整數

VA_UINT64

64位元無符號整數

VA_DOUBLE

雙精度浮點數

VA_INT32_ARRAY

32位元帶符號整數陣列

VA_UINT32_ARRAY

32位元無符號整數陣列

VA_INT64_ARRAY

64位元帶符號整數陣列

VA_UINT64_ARRAY

64位元無符號整數陣列

VA_DOUBLE_ARRAY

雙精度浮點數陣列

VA_STRING

字串提供方式為 const char*

設定先前建立的 va_data 結構 (vaData) 用於透過以下函式設定資料通訊:

  
va_data* va_data_enum(va_data* vaData, int32_t *data) 
va_data* va_data_int32(va_data* vaData, int32_t *data) 
va_data* va_data_uint32(va_data* vaData, uint32_t *data) 
va_data* va_data_int64(va_data* vaData, int64_t *data) 
va_data* va_data_uint64(va_data* vaData, uint64_t *data) 
va_data* va_data_double(va_data* vaData, double *data) 
va_data* va_data_int32_array(va_data* vaData, int32_t *data, size_t elementCount)
va_data* va_data_uint32_array (va_data* vaData, uint32_t *data, size_t elementCount)
va_data* va_data_int64_array (va_data* vaData, int64_t *data, size_t elementCount)
va_data* va_data_uint64_array (va_data* vaData, uint64_t *data, size_t elementCount)
va_data* va_data_double_array (va_data* vaData, double *data, size_t elementCount)
va_data* va_data_string(va_data* vaData, char data*, size_t strSize)
va_data* va_data_const_string(va_data* vaData, const char **data)
      

對於字串,有兩種字串通訊選項:

  1. 透過以下方式提供字元陣列 va_data_string()。隨後,查詢到的字串資料將被複製 到該陣列中。

  2. 提供指標給 const char*。接著,當查詢型別為 VA_STRING 的資訊時,將傳回指向內部字串 表示形式的指標。當您使用 此方法時,請檢查傳回字串的生命週期。

範例程式碼:以下範例顯示了用於查詢影像寬度的程式碼。

 
uint32_t imgWidth; 
va_data 
va_imgWidth;
va_data_double(&va_imgWidth,&imgWidth);

vaSi_Image_GetProperty(imageHandle, "Width", &va_imgWidth);  
      

在此之後,變數 imgWidth 將包含所要求的 資訊。

介面函數詳細說明

以下是對指定模擬介面函式的參數和傳回值的詳細說明。

功能

vaSi_CustomOp_GetParamValue

語法

int vaSi_CustomOp_GetParamValue (va_custom_op_sim_handle simHandle, const char* paramName, va_data *value)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

參數名稱。

參數 3

用於查詢值的返回參數。

描述

返回具有給定名稱的參數的值。

傳回值

0:值為查詢到的資料

<0: Cannot query parameter

功能

vaSi_CustomOp_GetInputImage

語法

int vaSi_CustomOp_GetInputImage (va_custom_op_sim_handle simHandle, const char* portName, va_image_handle *image)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

運算子連接埠名稱。

參數 3

影像代handle的返回參數。

描述

取得從給定連接埠進入運算子的影像,並傳回參考該影像的 handle。在從模擬函式返回之前,必須透過呼叫以下內容來儲存此影像 vaSi_CustomOp_StoreImage() 或透過呼叫以下內容來刪除 vaSi_CustomOp_DeleteImage().

傳回值

0: OK

<0 : Cannot get image

功能

vaSi_CustomOp_PutOutputImage

語法

int vaSi_CustomOp_PutOutputImage (va_custom_op_sim_handle simHandle, const char* portName, va_image_handle imageHandle)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

運算子連接埠名稱。

參數 3

影像 handle。

描述

將影像輸出至給定的連接埠。

傳回值

0:操作已成功完成

<0: Cannot output image

功能

vaSi_CustomOp_InputHasImage

語法

bool vaSi_CustomOp_InputHasImage (va_custom_op_sim_handle simHandle, const char* portName)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

運算子輸入連接埠名稱。

描述

傳回具有給定名稱的連接埠是否有可用的輸入影像。

傳回值

true:影像可用

false:沒有可用的影像

功能

vaSi_CustomOp_OutputReady

語法

bool vaSi_CustomOp_OutputReady (va_custom_op_sim_handle simHandle, const char* portName)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

運算子輸出連接埠名稱。

描述

傳回具有給定名稱的輸出連接埠是否可以接收影像。

傳回值

true:輸出已準備好接收下一張影像

false:輸出尚未準備好接收影像

功能

vaSi_CustomOp_CreateImage

語法

int vaSi_CustomOp_CreateImage (va_custom_op_sim_handle simHandle, va_image_format_handle format, va_image_handle * newImage)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

新影像的影像格式。

參數 3

影像代handle的返回參數。

描述

根據參數 2 給定的格式建立空白影像。在從模擬函式返回之前,必須透過呼叫以下內容來儲存此影像 vaSi_CustomOp_StoreImage() 或透過呼叫以下內容來刪除 vaSi_CustomOp_DeleteImage().

傳回值

0 : OK

<0 : Could not create image

功能

vaSi_CustomOp_DeleteImage

語法

int vaSi_CustomOp_DeleteImage (va_custom_op_sim_handle simHandle, va_image_handle imageHandle)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

要刪除的影像之 handle。

描述

刪除由給定影像 handle 所參考的影像。

傳回值

0:操作已成功完成

<0: Error during deleting image

功能

vaSi_CustomOp_StoreImage

語法

int vaSi_CustomOp_StoreImage (va_custom_op_sim_handle simHandle, va_image_handle imageHandle, const char* storeName)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

影像 handle。

參數 3

儲存影像時使用的名稱。稍後可以透過此名稱查詢該影像。

描述

將影像儲存在運算子模擬實例的本機儲存空間中。

傳回值

0:操作已成功完成

VA_SIM_CANNOT_STORE_IMAGE: 無法建立影像的儲存空間

VA_SIM_STORE_NAME_ALREADY_USED: 名稱 “storeName” 已被目前儲存的影像使用中

功能

vaSi_CustomOp_GetStoredImagesCount

語法

int vaSi_CustomOp_GetStoredImagesCount (va_custom_op_sim_handle simHandle, unsigned int *count)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

影像計數的傳回參數。

描述

傳回儲存在運算子模擬執行個體中的影像數量。

傳回值

0: OK

<0: Can’t query information.

功能

vaSi_CustomOp_GetStoredImage

語法

int vaSi_CustomOp_GetStoredImage (va_custom_op_sim_handle simHandle, unsigned int index, va_image_handle *retImage)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

已儲存影像陣列中的索引。

參數 3

影像代handle的返回參數。

描述

取得先前儲存的影像。該影像將從影像儲存區中移除。從模擬函式傳回之前,必須透過呼叫以下項目再次儲存該影像: vaSi_CustomOp_StoreImage() 或透過呼叫以下項目刪除 vaSi_CustomOp_DeleteImage().

傳回值

0 : OK

<0 : Could not get image

功能

vaSi_CustomOp_GetNameOfStoredImage

語法

const char* vaSi_CustomOp_GetNameOfStoredImage (va_custom_op_sim_handle simHandle, unsigned int index)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

已儲存影像陣列中的索引。

描述

傳回影像名稱的字串。

傳回值

Not NULL : 值為影像名稱字串

NULL : 無法查詢名稱

功能

vaSi_CustomOp_GetStoredImageByName

語法

int vaSi_CustomOp_GetStoredImageByName (va_custom_op_sim_handle simHandle, const char* storeName, va_image_handle *retImage)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

儲存影像時所使用的名稱。

參數 3

影像代handle的返回參數。

描述

取得先前以指定儲存名稱儲存的影像。該影像將從影像儲存區中移除。從模擬函式傳回之前,必須透過呼叫以下項目再次儲存該影像: vaSi_CustomOp_StoreImage() 或透過呼叫以下內容來刪除 vaSi_CustomOp_DeleteImage().

傳回值

0 : OK

<0 : Could not get image

功能

vaSi_CustomOp_CreateImageFormat

語法

int vaSi_CustomOp_CreateImageFormat (va_custom_op_sim_handle simHandle, const char* portName, va_image_format_handle* createdFormat)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

運算子連接埠名稱。

參數 3

格式代碼的傳回指標。

描述

建立新的影像格式物件並傳回對應的代碼。此格式由具有指定名稱的連接埠格式進行初始化。從模擬函式傳回之前,必須透過呼叫以下項目刪除此格式: vaSi_CustomOp_DeleteImageFormat().

傳回值

0 : OK

<0 : Could not create format

功能

vaSi_CustomOp_CopyImageFormat

語法

int vaSi_CustomOp_CopyImageFormat (va_custom_op_sim_handle simHandle, va_image_format_handle formatHandle, va_image_format_handle *createdFormat)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

正在複製的格式代碼。

參數 3

格式代碼的傳回參數。

描述

建立新的影像格式物件並傳回對應的代碼。此格式由提供的格式進行初始化。從模擬函式傳回之前,必須透過呼叫以下項目刪除此格式: vaSi_CustomOp_DeleteImageFormat().

傳回值

Not NULL : 值為格式代碼

NULL : 無法建立格式

功能

vaSi_CustomOp_DeleteImageFormat

語法

int vaSi_CustomOp_DeleteImageFormat (va_custom_op_sim_handle simHandle, va_image_format_handle formatHandle)

參數 1

提供給運算子模擬函式的模擬控制代碼。

參數 2

正在刪除的格式代碼。

描述

刪除由給定格式代碼所參考的影像格式物件。

傳回值

0: OK

<0 : Could not delete format

功能

vaSi_Image_GetFormat

語法

int vaSi_Image_GetFormat (va_image_handle imageHandle, va_image_format_handle formatHandle)

參數 1

影像 handle。

參數 2

先前建立的格式之代碼,將被設定為影像的格式。

描述

查詢由影像代碼所參考的影像格式。

傳回值

0:操作已成功完成

<0: Cannot query format

功能

vaSi_Image_SetProperty

語法

int vaSi_Image_SetProperty (va_image_handle imageHandle, const char* propType, const va_data* propData)

參數 1

影像 handle。

參數 2

用於識別要設定之 Property 的字串。

參數 3

指向用於設定新 Property 的資料結構的指標。

描述

設定由影像代號(image handle)所參照之影像的 Property。透過此函式可設定以下 Property:

ImgWidth:設定影像寬度(propData 的型別為 VA_UINT32)

ImgHeight:設定影像高度(propData 的型別為 VA_UINT32)

傳回值

0:Property 已成功設定

VA_SIM_INVALID_PARAMETER:無法識別 Property

VA_SIM_INVALID_TYPE:Property 資料格式錯誤

VA_SIM_INVALID_VALUE:Property 資料包含無效值

功能

vaSi_Image_GetProperty

語法

int vaSi_Image_GetProperty (va_image_handle imageHandle, const char* propType, va_data* propData)

參數 1

影像 handle。

參數 2

用於識別要查詢之 Property 的列舉值。

參數 3

指向用於資料通訊的資料結構的指標。

描述

查詢由影像代號所參照之影像的 Property。可使用以下 Property:

ImgWidth:取得影像寬度(propData 的型別為 VA_UINT32)

ImgHeight:取得影像高度(propData 的型別為 VA_UINT32)

傳回值

0:Property 已成功查詢

VA_SIM_INVALID_PARAMETER:無法識別 Property

VA_SIM_INVALID_TYPE:Property 資料格式錯誤

VA_SIM_INVALID_VALUE:Property 資料包含無效值

功能

vaSi_Image_SetLineLength

語法

int vaSi_Image_SetLineLength (va_image_handle imageHandle, unsigned int line, unsigned int length)

參數 1

影像 handle。

參數 2

行號。

參數 3

行長度。

描述

將參照行的長度設為個別值,此值可能與整體影像寬度不同(不得超過影像格式定義的最大影像寬度)。

傳回值

0:操作已成功完成

<0: Cannot set line length to the given value

功能

vaSi_Image_GetLineLength

語法

int vaSi_Image_GetLineLength (va_image_handle imageHandle, unsigned int line, unsigned int *length)

參數 1

影像 handle。

參數 2

行號。

參數 3

行長度的回傳參數。

描述

傳回參照行的長度。

傳回值

0: OK

<0: Cannot query line length

功能

vaSi_Image_SetPixelValue

語法

int vaSi_Image_SetPixelValue (va_image_handle imageHandle, uint64_t imagePos, unsigned int compIndex, int64_t value)

參數 1

影像 handle。

參數 2

影格內的位置。

參數 3

元件索引。

參數 4

像素元件值。

描述

將對應的 pixel component 設為給定的值。

傳回值

0:操作已成功完成

<0: Error setting the pixel component value

功能

vaSi_Image_GetPixelValue

語法

int vaSi_Image_GetPixelValue (va_image_handle imageHandle, uint64_t imagePos, unsigned int compIndex, int64_t *value)

參數 1

影像 handle。

參數 2

影格內的位置。

參數 3

元件索引。

參數 4

pixel component值的傳回參數

描述

傳回對應的 pixel component 值。

傳回值

0:操作已成功完成

<0: Error getting the pixel component value

功能

vaSi_ImageFormat_SetProperty

語法

int vaSi_ImageFormat_SetProperty (va_image_format_handle formatHandle, const char* propType, const va_data* propData)

參數 1

Image format 控點。

參數 2

識別要設定之 Property 的 Enum 值。

參數 3

指向包含新 Property 的資料結構的指標。

描述

設定由控點所參照之 image format 的 Property。可以透過此函式設定下列 Property:

Protocol:設定 image protocol,其中 *propData 具有類型 VA_ENUM 並設為下列其中一個值:

  • VALT_IMAGE2D

  • VALT_LINE1D

ColorFormat:設定 image protocol,其中 *propData 具有類型 VA_ENUM 並設為下列其中一個值:

  • VAF_GRAY

  • VAF_COLOR

ColorFlavor:設定 image protocol,其中 *propData 具有類型 VA_ENUM 並設為下列其中一個值:

  • FL_NONE

  • FL_HSI

  • FL_YUV

  • FL_LAB

  • FL_RGB

  • FL_XYZ

Parallelism:設定 Parallelism(類型 VA_INT32)

ComponentCount:設定 pixel component 數量(類型 VA_INT32)

ComponentWidth:設定 pixel component 寬度(類型 VA_INT32)

Arithmetic:設定 pixel component Arithmetic,其中 *propData 具有類型 VA_ENUM 並設為下列其中一個值:

  • UNSIGNED

  • SIGNED

MaxImgHeight:設定 max. image height(類型 VA_INT32)

MaxImgWidth:設定 max. image width(類型 VA_INT32)

傳回值

0:Property 已成功設定

VA_SIM_INVALID_PARAMETER:無法識別 Property

VA_SIM_INVALID_TYPE:Property 資料格式錯誤

VA_SIM_INVALID_VALUE:Property 資料包含無效值

功能

vaSi_ImageFormat_GetProperty

語法

int vaSi_ImageFormat_GetProperty (va_image_format_handle formatHandle, VAImageFormatProperty propType, va_data* propData)

參數 1

Image format 控點。

參數 2

用於識別要查詢之 Property 的列舉值。

參數 3

指向將被查詢之 Property 覆寫的資料結構指標。

描述

查詢由控點所參照之 image format 的 Property。可以查詢的 Property 與透過下列函式可設定的 Property 相同: vaSi_ImageFormat_SetProperty().

傳回值

0:Property 已成功查詢

VA_SIM_INVALID_PARAMETER:無法識別 Property

VA_SIM_INVALID_TYPE:Property 資料格式錯誤

功能

vaSi_CreateStatusMessage

語法

int vaSi_CreateStatusMessage (va_custom_op_sim_handle simHandle, va_status_handle *newMessage)

參數 1

Simulation 控點。

參數 2

所建立錯誤訊息的傳回參數。

描述

建立可提交至 simulation 引擎的狀態訊息。

傳回值

0 : OK

<0: Can’t create message

功能

vaSi_SetStatusMessageProperty

語法

int vaSi_SetStatusMessageProperty (va_custom_op_sim_handle simHandle, va_status_handle message, const char* propName, const va_data* propValue)

參數 1

Simulation 控點。

參數 2

狀態訊息控點。

參數 3

要設定的 Property 名稱。

參數 4

新 Property 值

描述

修改狀態訊息 Property。可以透過此函式設定以下 Property:

Code:設定錯誤代碼(類型為 VA_INT32)

Severity:設定嚴重性級別,資料(類型為 VA_ENUM) 必須是下列值之一:

  • VA_INFO

  • VA_WARNING

  • VA_ERROR

Description:設定狀態的字串描述(類型為 VA_STRING)

功能

vaSi_SendStatusMessage

語法

int vaSi_SendStatusMessage (va_custom_op_sim_handle simHandle, va_status_handle message)

參數 1

Simulation 控點。

參數 2

要提交的狀態訊息 Handle。

描述

已將狀態訊息提交給模擬引擎。

傳回值

0 : OK

<0: Can’t submit message

建立自訂 Operator 文件

運算子的說明文件應以 HTML 檔案形式提供。如果可用,所有構成說明文件的檔案都必須在 General → HTML Help Files 標籤下指定:

指定的第一個檔案會被解譯為運算子說明文件的起點。此檔案的命名慣例為: <NameOfCustomOperator>.htm.

請務必提供 CSS 檔案。同時也請確保提供所有相關的圖片檔案。

您可以使用 VisualApplets 安裝目錄中子目錄下的運算子範本 Examples/CustomLibrary/OperatorTemplate.

完成自訂 Operator

當您包裝了 HDL 程式碼以使其介面符合產生的黑盒子時,您需要進行最後幾個步驟來完成自訂運算子:

  1. 從您的實作中建立一個網表(netlist)。

    [提示] 設定 Add IO Buffer = NO

    建立網表時,請確保您的綜合工具不會自動新增 IO 緩衝區。如果您使用 XST 進行網表綜合,請設定

    Add IO Buffer = NO

    否則,產生的 NGC 檔案會在 VisualApplets 建置流程中導致錯誤。

    [提示] 網表產生過程中的警告

    產生網表時,可能會輸出關於自訂運算子介面未使用的 IO Port 的警告。未使用的 IO Port 是指根據您的運算子定義產生,但未與您的 IP 核心連接的所有連接埠。您可以忽略這些警告。

    此行為的範例包括您在以下位置找到的所有自訂運算子範例 Examples VisualApplets 安裝目錄:

    \Examples\CustomLibrary

  2. 如果需要,也請定義約束檔案(*.ucf 格式(如果您使用 Xilinx ISE), *.xdc 如果您使用 Xilinx Vivado,則為格式)。

  3. 選用:如「定義自訂運算子的軟體介面」一節所述設定運算子的軟體介面。

  4. 選用:如「建立自訂運算子說明文件」一節所述建立運算子說明文件。

現在,您需要在 VisualApplets 中完成運算子定義。為此,請按照以下步驟操作。

必要步驟:

  1. 前往 Cores 分頁。

  2. 指定您產生的網list(netlist)檔案。

  3. 如果您定義了限制條件(constraints),請指定限制條件檔案。

  4. 指定支援的裝置:裝置名稱即為目標平台 FPGA 類型的名稱。請完全使用 VisualApplets 專案資訊方塊中提供的拼寫方式。若支援多個 FPGA 類型,請使用空格分隔名稱列表。

    若設計使用了自訂運算子(custom operator),但目標平台上的 FPGA 不在此列表中,DRC 將回報該運算子不受目標平台支援的錯誤。

  5. 指定支援的 Xilinx Tool(s)。您可以同時勾選 ISE 和 Vivado。使用 ISE 產生的網list通常也與 Vivado 建構流程相容,但您應確認您的運算子實作是否如此。您需要定義支援給定網list的工具最低版本號。通常這會是您用來建立網list的版本。

    若設計使用了自訂運算子,但建構設計時未使用指定的工具,DRC 將回報該運算子不受目標平台支援的錯誤。

    [提示] 定義多個 Core

    您可以為同一個自訂運算子定義多個 Core。這允許使用自訂運算子的裝置與工具特定實作,以便針對不同的目標平台選擇適當的實作來建構 applet。

    選用步驟:

  6. 選填,輸入運算子消耗的邏輯資源。只需輸入 Xilinx 工具在產生網list期間估算的數值即可。

  7. 在 General 分頁下,指定您的模擬函式庫路徑(自訂運算子的軟體介面)。

  8. 在 General 分頁下,指定圖示檔案的路徑。此檔案包含當您的自訂運算子顯示於 VisualApplets 時所使用的圖示。

  9. 在 General 分頁下,指定構成您的自訂運算子文件的所有檔案。請確保同時提供 CSS 檔案以及所有相關的圖片檔案。

  10. 如果您想要保護您的運算子設計:在左下角,啟用 Protected 選項。在開啟的對話方塊中:

    1. 確保保護模式 Password 已啟用。

    2. 輸入您的密碼。

    3. 按一下 OK。

    您隨時可以在稍後的時間點,透過自訂函式庫元素的關聯式選單來保護您的自訂運算子設計。

    [提示] 保護選項

    啟用保護後,自訂運算子將變成一個 「黑盒(black box)」。保護自訂運算子設計有兩種方式:

    • 透過密碼保護:自訂運算子設計隨後可以透過密碼開啟與編輯。沒有密碼的使用者將無法檢視自訂運算子的任何詳細資料(黑盒)。

    • 不可逆保護:如果您選擇保護模式 One-Way,自訂運算子將永久成為黑盒,且無法再次開啟,即使您自己也無法開啟。

    "One-Way" 保護是不可逆的:如果您選擇保護模式 One Way(而不是 Password),自訂函式庫元素將永遠無法再次開啟,即使您自己也無法開啟。如果您計劃在稍後的時間點增強該元素,請確保改選保護模式 Password。或者,您可以在啟用此保護模式之前,先將該元素複製一份(作為階層式方塊或未受保護的運算子)。

  11. 按一下 Save。

現在,您的新自訂運算子已準備好在設計中使用。

使用新的自訂運算子

散布自訂 Library 或個別自訂 Operator

包含所有運算子的自訂函式庫會儲存為單一 <LibaryName>.val 或 <LibaryName>.vl 檔案中。

<LibaryName> 是自訂函式庫的名稱。

此檔案可以進行散布並直接應用於 VisualApplets 中。它只需要複製到 VisualApplets 設定中指定的「自訂函式庫」目錄即可(Settings → System Settings → Paths → Custom Libraries)

  1. 將新的 <LibaryName>.val 或 <LibaryName>.vl 檔案複製到 VisualApplets 安裝目錄中的 Custom Library 目錄。

  2. 在 VisualApplets GUI 中重新掃描自訂程式庫:在程式庫名稱上按一下滑鼠右鍵,然後從子選單中選取 Rescan Custom Library Directory。

在 VisualApplets 範例目錄中,您會找到一個名為 CustomLibrary.vl

的現成程式庫,其中包含所有範例 operator。

從自訂 Library 更新

當您對自訂 operator 進行變更時,這些變更不會反映在您已經使用該自訂 operator 的設計中。因此,您需要更新設計中的自訂 operator 執行個體。

  1. 在 operator 上按一下滑鼠右鍵。

  2. 從子選單中選取 Update from Custom Library 或 Quick Update from Custom Library。

Custom Libraries 的更新機制與 User Libraries 完全相同。

匯入與匯出個別自訂 Operator

您可以透過匯入/匯出 operator 的 XML 定義來匯入和匯出個別的自訂 operator。

若要匯入自訂 operator:

  1. 在您要將自訂 operator 匯入至其中的自訂程式庫上按一下滑鼠右鍵。

  2. 從子選單中,選擇 匯入運算子 → 來源XML。

  3. 指定自訂 operator 的 XML 定義路徑,然後按一下 Open。

    Edit Custom Operator 對話方塊隨即開啟:

  4. 按一下 Save。

    儲存後,匯入的 operator 將直接可用於自訂程式庫中:

運算子範本與範例

範例

在安裝目錄中,您會找到三個可用作參考的完整自訂 operator。您可以在此處找到這些範例:

\Examples\CustomLibrary

自訂運算子範本

在安裝目錄中,您會找到可用於定義自訂 operator 的自訂 operator 範本。

\Examples\CustomLibrary 若要使用自訂 operator 範本:

  1. 在您要建立新自訂 operator 的自訂程式庫上按一下滑鼠右鍵。

  2. 從子選單中,選擇 匯入運算子 → 來源XML。

  3. 指定 operator 範本的路徑。

  4. 按一下 Open。

    Edit Custom Operator 對話方塊隨即開啟:

  5. 為您的新自訂 operator 命名,然後依照 'Defining an Individual Custom Operator via GUI' 一節中的說明繼續操作。

自訂運算子規格的 XML 格式

自訂 operator 的定義是以 XML 格式儲存。可以從 operator 程式庫匯出相關的 XML 檔案,或者可以使用先前匯出的 XML 檔案來匯入 operator。

接下來,我們將說明所需的參數,其中參數名稱與具有相同名稱的 XML 標籤相關。諸如 ImgInInfo 將會轉譯為類似以下的 XML 條目:

<ImgInInfo> ImgInPortNames </ImgInInfo> 其中 ImgInPortNames 是該值,在此情況下為連接埠名稱序列。這些參數是以階層方式排列。在以下表格中,具有灰色背景的列會標示預期參數所在的階層位置。

簡單的參數值可屬於下列類型:

  • 選項 (Choice):允許的值為 YES 或 NO

  • 字串 (String):不含空白字元的 ASCII 字串

  • Integer

  • 浮點數

某些參數是由值所組成的結構,其中陣列或記錄可作為結構化元素。輸入陣列時,需使用以空白字元分隔的值清單,且值本身也可以是結構化的。輸入記錄時,則使用如下的格式,其中 RecordName 是記錄識別碼, attrX 是記錄條目的識別碼,且 attrXValue 是這些值:

<RecordName attr1=”attr1Value” .. attrN=”attrNValue”/>

例如,提供一個名為 port 的記錄,其中包含用於名稱和寬度的條目:

<port name=”flag” width=”4”/>

XML 格式的根標籤為 Operator ,帶有一個屬性 name ,應在此處提供自訂運算子名稱:

<Operator name=”XYZ”>
…
</Operator>
   
[提示] 遵守 VHDL 命名慣例

在 VA GUI 中定義運算子名稱時,請確保符合 VHDL 命名慣例。

VHDL 的有效名稱定義如下:

「連接埠、信號、變數、實體名稱、架構主體或類似物件的有效名稱,由一個英文字母開頭,後接任意數量的字母或數字組成,且不含空格。有效名稱也稱為命名識別碼。VHDL 不區分大小寫。不過,名稱內可以使用底線,但不能以底線開頭或結尾。不允許使用兩個連續的底線。」

參數名稱

Type

描述

Vendor

String

供應商名稱。

Version

String

運算子的版本號碼。此值可自由選定,供使用者進行版本識別。

Cores

字串陣列

運算子的核心網表清單。第一個字串必須是 Core0 且必須永遠存在。如果有超過一個核心可用,其命名慣例為 Core<N> 其中 <N> 是隨每個核心遞增的整數。

LibraryFile

String

包含適用於運算子的高階模擬模型的軟體函式庫(動態連結函式庫)的檔案之引號括住名稱。

IconFile

String

包含運算子圖示的檔案之引號括住名稱。

HtmlHelpFiles

字串陣列

包含說明內容(HTML + 圖片)的引號包圍檔案名稱清單。第一個檔案被視為主 HTML 檔案。

表 7. Operator/Info


參數名稱

Type

描述

RegInInfo

字串陣列

稍後定義的資訊結構名稱清單 (Operator/RegIn)描述寫入暫存器連接埠。

RegOutInfo

字串陣列

稍後定義的資訊結構名稱清單 (Operator/RegOut)描述讀取暫存器連接埠。

ImgInSyncMode

String

字串,用於定義 ImgIn 連接埠的輸入彼此是同步還是非同步。此字串可以是 “Sync” 或 “Async”。

ImgInInfo

字串陣列

稍後定義的資訊結構名稱清單 (Operator/ImgIn)描述影像輸入連接埠的屬性。多個清單項目可能指涉相同的結構,這表示有多個相同類型的影像輸入介面連接埠可用。

ImgOutInfo

字串陣列

稍後定義的資訊結構名稱清單 (Operator/ImgOut)描述影像輸出連接埠的屬性。多個清單項目可能指涉相同的結構,這表示有多個相同類型的影像輸出介面連接埠可用。

GPIn

字串陣列

通用信號輸入的接腳名稱清單。

GPOut

字串陣列

通用信號輸出的接腳名稱清單。

MemInfo

字串陣列

稍後定義的資訊結構名稱清單 (Operator/Mem)描述記憶體介面連接埠的屬性。多個清單項目可能指涉相同的結構,這表示有多個相同類型的記憶體介面連接埠可用。

表 8. Operator/IO


參數名稱

Type

描述

NrLut

Integer

operator 消耗的 FPGA LUT 元素數量

NrRegs

Integer

operator 消耗的 FPGA 暫存器數量

NrBlockRam

Integer

operator 消耗的 block RAM 元素數量

NrEmbeddedMult

Integer

operator 消耗的嵌入式乘法器數量

表 9. Operator/Properties


影像輸入連接埠規格是在設定檔中使用以下語法來完成:

<ImgIn name=”IMG_IN_IDENTIFIER”> Parameters </ImgIn>;

此處 IMG_IN_IDENTIFIER 是上述參數中提供的 其中一個影像輸入連接埠名稱 Operator/IO/ImgInInfo. 該 內容 Parameters 是用來指定影像介面的屬性 連接埠:

參數名稱

Type

描述

Width

Integer

影像資料埠的寬度

FIFODepth

Integer

輸入資料的緩衝 FIFO 深度,該緩衝區至少須由 VA 核心提供。此值必須為 15 至 1023 之間的二的冪減 1。

Formats

記錄陣列

圖像格式記錄清單 ImgFormat 連接埠支援的影像格式。如需影像格式的命名規則,請參閱下方說明。

表 10. Operator/ImgIn


影像格式記錄具有以下結構:

<ImgFormat name=”FORMAT” maxWidth=”X1” maxHeight=”Y1” alias=”NAME1”/>

項目 FORMAT 是一個字串值,用於表示透過下方討論的影像格式命名規則所編碼的影像格式。屬性 maxWidth 和 maxHeight 是選填的,用於固定影像大小的限制。如果未提供,使用者稍後可以在 VisualApplets 中自由選擇影像大小限制。屬性 alias 同樣是選填的;若存在,則定義該格式在 GUI 中顯示的名稱。

影像輸出連接埠規格是透過組態檔中的以下語法來完成:

<ImgOut name=”IMG_OUT_IDENTIFIER”> Parameters </ImgOut>;

此處 IMG_OUT_IDENTIFIER 是上方參數中提供的其中一個影像輸出連接埠名稱 Operator/IO/ImgOutInfo。 內容 Parameters 用於指定影像介面連接埠的 Property:

參數名稱

Type

描述

Width

Integer

影像資料埠的寬度

FIFODepth

Integer

輸出資料的緩衝區 FIFO 深度,VA 核心至少需提供此深度。該值必須是介於 15 到 1023 之間的 2 的冪次方減 1。

Formats

記錄陣列

圖像格式記錄清單 ImgFormat 連接埠支援的影像格式。如需影像格式的命名規則,請參閱下方說明。

表 11. Operator/ImgOut


影像格式採用以下命名規則進行編碼:

{BaseFormat}{BitsPerPixel}x{Parallelism}

選填的後綴可用於指定影像維度以及有號元件資料的通知:

{BaseFormat}{BitsPerPixel}x{Parallelism}x{Dimension}{Sign}

該維度的含義如下:

  • Dimension = 2 – 二維影像表示該影像同時由行結尾 (end-of-line) 和影格結尾 (end-of-frame) 標記所建構。

  • Dimension = 1 – 一維影像表示沒有任何影格結尾標記將傳入的行劃分為影格。

若未指定維度,則預設值為二。後綴 {Sign} 可以是 s 用於有號像素元件,或 u 用於無號數值,若未提供此類後綴,則預設值為 u 支援的 Color Format 有 rgb, yuv, hsi, lab 和 xyz.

範例包括:

  • gray8x4 – 8 位元像素且 Parallelism 為 4 的灰階格式

  • rgb24x2 – 3x8 位元像素且 Parallelism 為 2 的 RGB Color Format

  • gray16x1 – 16 位元像素的灰階格式,資料字中僅包含單一像素

  • gray8x4x1 – 每像素 8 位元且 Parallelism 為 4 的一維灰階影像

  • gray16x1s – 具備帶號 16 位元組件的灰階影像,資料字中僅包含單一像素

暫存器輸入埠規格透過組態檔中的下列語法來完成:

<RegIn name=”REG_IN_IDENTIFIER”> Parameters </RegIn>;

此處 REG_IN_IDENTIFIER 是上述參數中提供的其中一個暫存器輸入埠名稱 Operator/IO/RegInInfo。 內容 Parameters 正在指定暫存器介面埠的 Property:

參數名稱

Type

描述

Width

Integer

暫存器埠的寬度

表 12. Operator/RegIn


暫存器輸出埠規格透過組態檔中的下列語法來完成:

<RegOut name=”REG_OUT_IDENTIFIER”> Parameters </RegOut>;

此處 REG_OUT_IDENTIFIER 是上述參數中提供的其中一個暫存器輸出埠名稱 Operator/IO/RegOutInfo。 內容 Parameters 正在指定暫存器介面埠的 Property:

參數名稱

Type

描述

Width

Integer

暫存器埠的寬度

表 13. Operator/RegOut


Memory 介面規格透過組態檔中具有下列語法的區段來完成:

<Mem name=”MEM_IDENTIFIER”> Parameters </MEM>

此處 MEM_IDENTIFIER 是在上述參數中提供的其中一個 Memory 埠名稱 Operator/IO/MemInfo. 該 內容 Parameters 正在指定 Memory 介面的 Property:

參數名稱

Type

描述

DataWidth

Integer

資料寬度

AddrWidth

Integer

位址寬度

WrFlagWidth

Integer

標記寫入存取的旗標寬度。此參數必須 >= 1。

RdFlagWidth

Integer

標記讀取存取的旗標寬度。此參數必須 >= 8。

WrCntWidth

Integer

用於通訊可用寫入指令數量的埠寬度

RdCntWidth

Integer

用於通訊可用讀取指令數量的埠寬度

SyncMode

String

此參數用來發出 Memory 介面時脈與設計時脈之間關係的信號。可能的值如下:

SyncToDesignClk – Memory 介面埠與以下項目同步 iDesignClk.

SyncToDesignClk2x – Memory 介面埠與以下項目同步 iDesignClk2x.

表 14. Operator/Mem


IP 核心網list的規格是在設定檔中使用以下語法按區段進行的:

<Core name=”CORE_IDENTIFIER”> Parameters </Core>

此處 Core_IDENTIFIER 是在上述參數中提供的其中一個核心名稱 Operator/Cores。該內容 Parameters 用於指定 IP 核心的 Property:

參數名稱

Type

描述

Devices

字串陣列

核心支援的 FPGA 裝置名稱清單(範例: XC3S1600E XC3S4000)。

NetlistFile

String

網list的引號包圍的 UTF-8 編碼檔名。

ConstraintsFile

String

選用限制條件檔的引號包圍的 UTF-8 編碼檔名。

MinVersionISE

String

可以使用給定網list的 ISE 工具流程的最低版本號(範例: 14.6 適用於 ISE 14.6)。如果不安裝 ISE,則此字串為空白。

MinVersion

String

可以使用給定網list的 Vivado 工具流程的最低版本號(範例: 2014.4 適用於 Vivado 2014.4)。如果不安裝 Vivado,則此字串為空白。

表 15. Operator/Core