Custom Operator Libraries

透過 VisualApplets,您可以將在 VHDL 中設計的影像處理模組轉換為 VisualApplets 運算子。

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

為了讓自訂運算子能在 VisualApplets 圖形使用者介面上使用,您還需要定義一或多個包含自訂運算子的自訂程式庫。每個自訂運算子都必須屬於某個特定的自訂程式庫。

工作流程

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

  1. 直接在 VA 圖形使用者介面上指定自訂運算子的主要屬性及其介面(運算子名稱、運算子版本、所需影像輸入、影像輸出、記憶體連接埠的數量與屬性等)。

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

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

  4. 建立您實作內容的網路清單。如有需要,也請建立限制條件檔案。

  5. 選擇性地建立運算子說明文件(用於運算子說明視窗)以及模擬模型(後續可用於模擬包含自訂運算子的 VA 設計)。

  6. 再次在 VA 中編輯自訂運算子:新增產生的網路清單,並選擇性地新增說明檔案與模擬模型。

完成這些步驟之後,您的影像處理模組就會直接作為自訂運算子在 VisualApplets 中提供,並且可以像任何其他運算子一樣使用。自訂程式庫會儲存為 *.val 或 *.vl 檔案(類似於使用者程式庫)。它們可以透過此格式進行部署與散布。

VisualApplets Custom Operator Functionality

在此工作流程中,VisualApplets(亦即 VisualApplets 自訂運算子功能)會使用兩次:

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

  2. 透過新增合成所需的檔案以及(選擇性地)模擬與說明內容來完成運算子。

產生運算子原型:VA 自訂運算子功能可讓您建立運算子原型,該原型可立即用於在 Visual Applets 中實例化運算子。針對此運算子原型,可以匯出黑箱介面以及用於模擬所產生運算子介面之通訊連接埠的 RTL 層級模擬實體。接著您可以開始編碼(也就是實作符合黑箱介面的 HDL 程式碼)並模擬您的自訂運算子設計。然後,將產生的 FPGA 設計合成至 EDIF 或 NGC 網路清單。您可以選擇性地新增限制條件檔案、建立用於 VisualApplets 高階模擬的動態連結程式庫,以及為 VisualApplets 圖形使用者介面編寫 HTML 說明文件。

完成運算子定義:VA 自訂運算子功能可讓您指定網路清單、模擬程式庫和說明文件檔案。補充這些檔案後,運算子即可立即使用。

Operator 類型

根據底層的流量控制機制,VisualApplets 包含不同類型的運算子和連接埠。運算子可以是 O 類型或 M 類型。

[提示] 自訂運算子類型:M

自訂運算子一律為 M 類型。

Synchronous and Asynchronous Operator Ports

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

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

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

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

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

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

[提示] 定義多個輸出

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

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

RemoveImage

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

SYNC

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

Interface Architecture

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

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

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

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

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

  • 時脈 (Clock):接收時脈脈衝的連接埠會針對每個自訂算子自動設定。

  • 重設/啟用連接埠 (Reset/Enable port):接收重設或啟用指令的連接埠會針對每個自訂算子自動設定。

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

Clock Interface

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

Reset and Enable

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 介面沒有影響。

Register Interface

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

Interfaces for Image Data

Image Protocols

您可以定義自訂算子的影像輸入和影像輸出連接埠將支援的影像協定。您的算子未來的使用者將能夠從您提供的影像協定清單中進行選擇。

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

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

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

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

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

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

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

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

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

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

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

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] 中,順序如下:紅色使用 bits [0..Y/3-1],綠色使用 bits [Y/3..2*Y/3-1],藍色使用 bits [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 中,任何連接都帶有最大影像寬度和最大影像高度的屬性。VisualApplets 允許您為自訂算子所支援的任何影像協定,分別定義最大寬度和高度的選用限制條件。

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

  • 資料類型 uint 或 int

  • Pixel data bit width N = [1..64]

  • Gray or 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 中使用最終運算子時,您的運算子使用者可以針對相關的影像通訊連接埠,選擇您在此處列出的任何格式。根據 VisualApplets 使用者所做的選擇,對應的 ID 將會輸出至相關的自訂運算子連接埠。

這可讓自訂運算子將其行為調整為所選的格式。

Image Input Ports

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

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

  • 資料類型 uint 或 int

  • Pixel data bit width N = [1..64]

  • Gray or 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 中使用最終運算子時,使用者可以針對相關的影像通訊連接埠,選擇您在此處列出的任何格式。根據 VisualApplets 使用者所做的選擇,對應的 ID 將會輸出至相關的自訂運算子連接埠。這可讓自訂運算子將其行為調整為所選的格式。

Image Output Ports

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

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

  • 資料類型 uint 或 int

  • Pixel data bit width N = [1..64]

  • Gray or 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 中使用最終運算子時,使用者可以針對相關的影像通訊連接埠,選擇您在此處列出的任何格式。根據 VisualApplets 使用者所做的選擇,對應的 ID 將會輸出至相關的自訂運算子連接埠。這可讓自訂運算子將其行為調整為所選的格式。

General purpose I/O

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

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

[提示] 不支援雙向接腳

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

Memory Interface

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

透過 GUI 定義個別 Custom Operator

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

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

您透過 VisualApplets 圖形使用者介面(GUI)輸入個別自訂運算子的組態。即使運算子規格在網表、模擬模型和說明文件方面尚不完整,VisualApplets 也會立即提供指定的運算子以供在設計中使用。

[提示] 自訂程式庫檔案

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

此檔案可以進行散布並直接在 VisualApplets 中應用。它只需要複製到 VisualApplets 設定中指定的「自訂程式庫」目錄中。

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

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

建立新的 Custom Library

在開始定義新的自訂運算子之前,您需要建立一個新的自訂程式庫,以便將該新運算子歸類其中。

如果您已經有可用且適合該新自訂運算子的自訂程式庫,請跳過本節並直接前往 「建立新自訂運算子」一節。

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

  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 來進行此設定。

Creating a New Custom Operator

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

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

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

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

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

    [提示] 遵守 VHDL 命名慣例

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

    VHDL 的有效名稱定義如下:

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

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

    有關定義新自訂運算子屬性的詳細資訊,請參閱 「定義自訂運算子的基本資訊」。

  6. 按一下 Create 按鈕。

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

  7. 按一下 Save 按鈕。

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

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

[提示] 改用運算子範本

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

定義 Custom Operator 的基本資訊

第一步是定義自訂運算子的介面。

  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 標籤頁。

Defining the Image Input Ports

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

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

[提示] Synchronous and Asynchronous Operator Ports

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

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

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

同步輸入:

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

非同步輸入:

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

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

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

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

RemoveImage

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

SYNC

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

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

  1. 按一下 加號 按鈕 以建立第一個影像輸入(ImgIn) 連接埠。

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

    隨後,程式視窗中的運算子圖示即會顯示所輸入的 ImgIn 連接埠陣列:

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

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

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

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

    • 灰階或色彩格式(單一或三個資料元件,具備彙總寬度 N)

    • Color Format 的類型(RGB、HSI、HSL、HSV、YUV、YCrCb、LAB、XYZ)

    • Pixel data bit width N = [1..64]

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

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

    • 資料類型 uint 或 int

    • 最大影像尺寸

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

    列出的通訊協定從零開始編號,藉此定義一個 ID(如下圖所示,位於 Properties 面板表格的左側欄中)。

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

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

  6. 在 Format 下,指定通訊協定的 Color Format。

    允許使用下列 Color 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 位元。

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

  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 的單一字組中。資料採用 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] 的位元。

    • 對於 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 (Area)、1D (Line) 或 0D (Raw) 影像。

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

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

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

定義 Image Output Ports

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

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

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

  2. 為 ImgOut 連接埠命名。

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

    隨後,程式視窗中的運算子圖示會顯示所輸入的 ImgOut 連接埠陣列:

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

    在 Port Width 下,指定 ImgOut 連接埠的寬度。

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

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

    • Gray or Color Format(單一或三個資料元件,總合寬度為 N)

    • Color Format 的類型(RGB、HSI、HSL、HSV、YUV、YCrCb、LAB、XYZ)

    • Pixel data bit width N = [1..64]

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

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

    • 資料類型 uint 或 int

    • 最大影像尺寸

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

    列出的通訊協定從零開始編號,藉此定義一個 ID(如下圖所示,位於 Properties 面板表格的左側欄中)。

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

    自訂運算子的使用者可以在特定的 ImgOut 連接埠上選取想要使用的通訊協定。根據 VA 使用者所做的選取,相對應的 ID 將會輸出至相關的自訂運算子連接埠。這使得自訂運算子能夠調整其行為以適應所選的通訊協定。

  6. 在 Format 下,指定通訊協定的 Color Format。

    允許使用下列 Color 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 位元。

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

  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 的單一字組中。資料採用 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] 的位元。

    • 對於 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 (Area)、1D (Line) 或 0D (Raw) 影像。

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

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

  12. 重複步驟 1 至 11,以定義您希望自訂運算子支援的任意數量 ImgOut 連接埠。

Defining the GPIO Ports

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

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

  1. 前往 GPIO 標籤頁。

  2. 使用以下功能新增任意數量的 GPI 和 GPO: 加號 按鈕 .

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

所定義的 GPI 和 GPO 會立即顯示在程式視窗左上角面板的自訂運算子圖示中:

[提示] 不支援雙向接腳

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

定義 Memory Ports

可以設定自訂運算子以存取一個或多個記憶體庫(DRAM、SRAM 等)。

所有記憶體連接埠皆具備類似 FIFO 的介面,可用於寫入和讀取指令。這些 FIFO 位於自訂運算子的 VA 部分中,因此您只需實作流量控制,而無需實作 FIFO。將 FIFO 內容轉發至連接至自訂運算子的記憶體控制器的時序完全由 VisualApplets 控制。

在 Memory 標籤頁下,您可以定義運算子存取外部記憶體的權限。您可以指定最多 4 個連接埠,並指定運算子所需的記憶體介面屬性。

[提示] 符合目標平臺的記憶體配置

請留意潛在目標平臺(執行包含自訂運算子之 applet 的平臺)的記憶體配置。

參數名稱

Type

描述

Data Width

整數

資料寬度

Address Width

整數

位址寬度

Number of Write Flags (Width)

整數

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

Number of Read Flags (Width)

整數

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

SyncMode

字串

此參數指出記憶體介面時脈與設計時脈之間的關係。可能的值如下:

SyncToDesignClk – 記憶體介面連接埠與以下項目同步: iDesignClk.

SyncToDesignClk2x – 記憶體介面連接埠與以下項目同步: iDesignClk2x.

Defining the Registers of the Custom Operator

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

  1. 前往 Registers 標籤頁。

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

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

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

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

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

  6. 按一下 Save.

Generation of VHDL Black Box and 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 Interface Ports

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

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

時脈系統、重設與啟用

VisualApplets 支援兩個時脈網域。包含一個基礎設計時脈以及一個與該時脈同相且頻率加倍的衍生時脈。因此,自訂算子有兩個時脈輸入。此外,還有一個 Reset 進行明確的生命週期管理即呼叫 Enable 輸入,如上所述。

Port

方向

Width

描述

iDesignClk

在

1

基礎設計時脈

iDesignClk2x

在

1

時脈同步至 iDesignClk 但頻率加倍

iReset

在

1

算子重設

iEnable

在

1

啟用處理

Parameter Interface

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

Port

方向

Width

描述

ivReg_PORTID_D

在

PORTIDWidth

暫存器資料

iReg_PORTID_Wr

在

1

信號寫入存取

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

Port

方向

Width

描述

ovReg_PORTID_D

Out

PORTIDWidth

暫存器資料

iReg_PORTID_Rd

在

1

信號讀取存取

影像通訊介面

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

ImgIn 類型的介面

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

Port

方向

Width

描述

ivPORTIDXData

在

PORTIDWidth

進入自訂運算子的資料

oPORTIDXRead

Out

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 Fill 水平將完全相符,因此運算子只需要根據多個 O-synchronous 輸入中其中一個的 Fill 水平來實作流量控制。

ImgOut 類型的介面

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

Port

方向

Width

描述

ovPORTIDXData

Out

PORTIDWidth

輸出資料

oPORTIDXValid

Out

1

輸出資料有效

oPORTIDXEndOfLine

Out

1

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

oPORTIDXEndOfFrame

Out

1

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

iPORTIDXFIFOFull

在

1

緩衝區 FIFO 已滿,不接受進一步資料

ivPORTIDXFIFOCnt

在

Ceil Log2(PORTIDFIFODepth)

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

ivPORTIDX_FID_D

在

Ceil Log2(N)

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

下圖說明了 ImgOut 連接埠的資料流。波形顯示大小為 3x2 的二維影格之輸出。當 ImgOut 連接埠屬於多個 O 同步輸出連接埠之一時,所有這些連接埠都必須同時發出資料。

Memory Interfaces

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

名稱

方向

Width

描述

ovMemWrDataX

Out

MemDataWidthX

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

ovMemWrFlagX

Out

MemWrFlagWidthX

寫入旗標輸出

ovMemWrAddrX

Out

MemAddrWidthX

寫入位址

oMemWrAddrValidX

Out

1

發出寫入指令

oMemWrPriorityX

Out

1

請求此寫入連接埠的優先權

iMemWrAlmostFullX

在

1

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

iMemWrFullX

在

1

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

iMemWrEmptyX

在

1

寫入指令的 FIFO 為空

ivMemWrCntX

在

4

已緩衝的寫入指令數量

ivMemWrFlagX

在

MemWrFlagWidthX

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

iMemWrFlagValidX

在

1

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

ovMemRdFlagX

Out

MemRdFlagWidthX

讀取旗標

ovMemRdAddrX

Out

MemAddrWidthX

讀取位址

oMemRdAddrValidX

Out

1

發出讀取指令

oMemRdPriorityX

Out

1

請求此讀取連接埠的優先權

iMemRdAlmostFullX

在

1

僅接受單一後續讀取命令

iMemRdFullX

在

1

由於對應的 FIFO 已滿,不接受任何讀取命令

iMemRdEmptyX

在

1

讀取命令的 FIFO 為空

ivMemRdCntX

在

4

緩衝的讀取命令數量

ivMemRdFlagX

在

MemRdFlagWidthX

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

ivMemRdDataX

在

MemDataWidthX

讀取資料輸入

iMemRdDataValidX

在

1

讀取資料有效

上圖說明了 Memory 介面協定的波形。

通用 I/O 接腳

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

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

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

VHDL 模擬與驗證

為了模擬包含自訂運算子模組的 VisualApplets 設計,VisualApplets 會針對連接至自訂運算子的介面建立模擬測試平台。

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

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

  • 連接至 ImgIn 類型連接埠的影格來源模擬器。在檔案的刺激下,這些類型的模組會將影格資料輸出至 ImgIn。

  • 連接至 ImgOut 類型連接埠的影格儲集區模擬器。這類型的模組會模擬連接至 ImgOut 的運算子。該模組會將接收到的資料寫入檔案。

  • Memory 連接埠模擬器。

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

模擬架構

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

此套件包含以下元件 <OPERATORNAME> 進行明確的生命週期管理即呼叫 <OPERATORNAME>_TB 其中後者是 VisualApplets 設計與自訂運算子之間介面的測試平台。以下顯示名為的簡單自訂運算子的產生程式碼 RegExample 僅由一個讀取與寫入暫存器連接埠組成(Ctrl 進行明確的生命週期管理即呼叫 Status),每個連接埠寬度為 4 bit:

 
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;
 

測試平台會建立自訂算子(custom operator)的實例,並將協定模擬模組連接至各個介面連接埠。以下章節將說明不同類型的模擬器、如何透過激勵檔案(stimuli files)進行控制,以及如何產生輸出檔案。

Emulation of Register Interface

產生的測試平台會針對暫存器存取介面實作一個模擬器。此模擬器經設定可用於定址單一處理程序的設計。寫入與讀取暫存器的位址從 0x4 開始,且暫存器位址會根據給定自訂算子元件中暫存器介面連接埠的順序,以 1 的增量向上遞增(如上述範例元件 RegExample)。讀取與寫入的暫存器位址是獨立計算的。此模擬器由一個文字檔案驅動,該檔案由實體參數(entity parameter)設定 Register_StimuliFileName 如上述 VHDL 程式碼中所提供。

激勵檔案中可能會包含以下指令:

命令

描述

REM

行中剩餘的部分為註解

GRS

模擬全域重置(global reset)

PRS

模擬處理程序重置。此指令的語法如下: PRS <procNr> 其中參數 <procNr> 必須永遠為 0。

PEN

啟用處理程序。其語法如下: PEN <procNr> <value> 與 <procNr> 永遠為 <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 的影像通訊介面模擬是由激勵檔案(stimuli file)驅動,該檔案提供進入自訂 operator 的資料序列相關資訊。對於任何存在的 ImgIn 連接埠,測試平台(test bench)皆具有通用 <PORTIDX>_StimuliFileName where <PORTIDX> 是對應的影像輸入連接埠型別名稱,後接連接埠編號。給定檔案中的每一行都必須遵循以下語法:

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

其中 <Command> 是一個三個字母的指令, <Data> 提供一個十六進位資料字組,其餘三個參數則對應至影像協定旗標。

下表說明可用的指令:

命令

描述

DAT

資料指令。此指令提供的資料將成為連接埠 ivPORTIDXData 以及關聯的影像協定旗標連接埠的輸入。

WCK

等待指令。參數 <Data> 提供指令解譯器暫停的時脈週期數。

FID

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

任何指令行都可以新增註解,前面須加上 “#”。

下列程式碼是一個激勵檔案範例,會觸發 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 狀態序列的相關資訊。對於任何存在的 ImgOut 連接埠,VA_Design_Emulator 實體(entity)皆具有通用 <PORTIDX>_StimuliFileName 其中 <PORTIDX> 是對應的影像輸出連接埠型別名稱,後接連接埠編號。其語法與 ImgIn 介面的激勵完全相同,只是沒有 DAT 指令可用。簡單的激勵檔案可能如下所示:

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 介面模擬器的刺激檔案格式。

記憶體通訊模擬

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

GPIO Emulation

專用輸入訊號的模擬是針對每個訊號獨立進行,並由刺激檔案驅動。其中提供有關訊號狀態序列的資訊。刺激檔案可能包含多個指令,說明如下。對於任何現有的輸出訊號連接埠,測試平台實體都有一個通用 iSig_<NAME>_StimuliFileName 其中 <NAME> 是相關的連接埠名稱。

下表說明可用的指令:

命令

描述

SET

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

WCK

等待指令。其語法為: WCK <ticks> 其中參數 <ticks> 提供訊號將保持常數的時脈週期數。

RST

從頭重新開始。指令解譯器將從刺激檔案的第一行重新開始。此指令沒有任何參數。該指令將在同一個時脈週期執行檔案的第一個指令,允許組合無間隙的迴圈。

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 指令組成,這些指令完全對應至專用輸入訊號的刺激檔案指令。

Defining the Custom Operator’s Software Interface

必須提供高階模擬元件,以便將自訂運算子完全整合至 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 – 當運算子輸入連接埠彼此同步時,必須相應地擷取輸入影像。當定義了多個輸出時,必須同時輸出影像。對於模擬函式而言,這意味著當影格輸出至一個輸出連結時,在模擬函式返回之前,也必須將影格輸出至所有其他輸出連結。

由於運算子(operator)的行為通常取決於所設定的運算子參數,因此可以透過下列介面來查詢這些參數:

編號

功能

描述

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),並透過與給定連接埠相關聯的格式進行初始化。

13

vaSi_CustomOp_CopyImageFormat()

建立作為給定格式複本的新影像格式。

14

vaSi_CustomOp_DeleteImageFormat()

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

若要透過影像代碼來處理影像,可以使用下列函式:

編號

功能

描述

1

vaSi_Image_GetFormat()

取得影像格式。

2

vaSi_Image_SetProperty()

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

3

vaSi_Image_GetProperty()

取得畫格的屬性。

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 位元整數表示的 enum 項目

VA_INT32

32 位元有號整數

VA_UINT32

32 位元無號整數

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. 提供 char 陣列透過 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 將會包含所要求的 資訊。

Detailed Description of Interface Functions

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

功能

vaSi_CustomOp_GetParamValue

語法

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

參數 1

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

Parameter 2

參數名稱。

Parameter 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

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

Parameter 2

算子埠名稱。

Parameter 3

用於影像控制代碼的回傳參數。

描述

取得在指定埠進入算子的影像,並回傳參考該影像的控制代碼。在從模擬函式回傳之前,必須透過呼叫 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

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

Parameter 2

算子埠名稱。

Parameter 3

影像控制代碼。

描述

將影像輸出至指定的埠。

回傳值

0:操作已順利完成

<0: Cannot output image

功能

vaSi_CustomOp_InputHasImage

語法

bool vaSi_CustomOp_InputHasImage (va_custom_op_sim_handle simHandle, const char* portName)

參數 1

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

Parameter 2

算子輸入埠名稱。

描述

回傳指定名稱的埠是否有可用的輸入影像。

回傳值

true:影像可用

false:無可用影像

功能

vaSi_CustomOp_OutputReady

語法

bool vaSi_CustomOp_OutputReady (va_custom_op_sim_handle simHandle, const char* portName)

參數 1

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

Parameter 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

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

Parameter 2

新影像的影像格式。

Parameter 3

用於影像控制代碼的回傳參數。

描述

根據 Parameter 2 給定的格式建立空白影像。在從模擬函式回傳之前,必須透過呼叫以下項目來儲存此影像: vaSi_CustomOp_StoreImage() 來儲存此影像,或者透過呼叫 vaSi_CustomOp_DeleteImage().

回傳值

0:確定

<0 : Could not create image

功能

vaSi_CustomOp_DeleteImage

語法

int vaSi_CustomOp_DeleteImage (va_custom_op_sim_handle simHandle, va_image_handle imageHandle)

參數 1

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

Parameter 2

要刪除的影像代碼 (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

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

Parameter 2

影像控制代碼。

Parameter 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

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

Parameter 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

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

Parameter 2

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

Parameter 3

用於影像控制代碼的回傳參數。

描述

取得先前已儲存的影像。該影像會從影像儲存空間中移除。從模擬函式傳回之前,必須透過呼叫下列項目重新儲存此影像 vaSi_CustomOp_StoreImage() 或透過呼叫下列項目將其刪除 vaSi_CustomOp_DeleteImage().

回傳值

0:確定

<0 : Could not get image

功能

vaSi_CustomOp_GetNameOfStoredImage

語法

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

參數 1

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

Parameter 2

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

描述

傳回影像名稱的字串。

回傳值

非 NULL :值為影像名稱字串

NULL :無法查詢名稱

功能

vaSi_CustomOp_GetStoredImageByName

語法

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

參數 1

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

Parameter 2

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

Parameter 3

用於影像控制代碼的回傳參數。

描述

取得先前以給定儲存名稱儲存的影像。該影像會從影像儲存空間中移除。從模擬函式傳回之前,必須透過呼叫下列項目重新儲存此影像 vaSi_CustomOp_StoreImage() 來儲存此影像,或者透過呼叫 vaSi_CustomOp_DeleteImage().

回傳值

0:確定

<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

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

Parameter 2

算子埠名稱。

Parameter 3

格式代碼的傳回指標。

描述

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

回傳值

0:確定

<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

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

Parameter 2

正在複製的格式代碼。

Parameter 3

格式代碼的傳回參數。

描述

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

回傳值

非 NULL :值為格式代碼

NULL : 無法建立格式

功能

vaSi_CustomOp_DeleteImageFormat

語法

int vaSi_CustomOp_DeleteImageFormat (va_custom_op_sim_handle simHandle, va_image_format_handle formatHandle)

參數 1

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

Parameter 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

影像控制代碼。

Parameter 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

影像控制代碼。

Parameter 2

識別要設定之 Property 的字串。

Parameter 3

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

描述

設定由影像控制代碼所參照之影像的 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

影像控制代碼。

Parameter 2

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

Parameter 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

影像控制代碼。

Parameter 2

行號。

Parameter 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

影像控制代碼。

Parameter 2

行號。

Parameter 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

影像控制代碼。

Parameter 2

畫面內的位置。

Parameter 3

元件索引。

參數 4

像素元件值。

描述

將對應的像素元件設為指定的值。

回傳值

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

影像控制代碼。

Parameter 2

畫面內的位置。

Parameter 3

元件索引。

參數 4

像素元件值的傳回參數

描述

傳回對應的像素元件值。

回傳值

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

影像格式代碼。

Parameter 2

識別要設定之屬性的列舉值。

Parameter 3

指向儲存新屬性之資料結構的指標。

描述

設定由代碼參照的影像格式屬性。可以透過此函數設定下列 屬性:

Protocol:設定影像通訊協定,其中 *propData 的類型為 VA_ENUM 且設定為下列 其中一個值:

  • VALT_IMAGE2D

  • VALT_LINE1D

ColorFormat:設定影像通訊協定,其中 *propData 的類型為 VA_ENUM 且設定為下列 其中一個值:

  • VAF_GRAY

  • VAF_COLOR

ColorFlavor:設定影像通訊協定,其中 *propData 的 類型為 VA_ENUM 且設定為下列其中一個值:

  • FL_NONE

  • FL_HSI

  • FL_YUV

  • FL_LAB

  • FL_RGB

  • FL_XYZ

Parallelism:設定 Parallelism(類型 VA_INT32)

ComponentCount:設定像素元件數量(類型 VA_INT32)

ComponentWidth:設定像素元件寬度(類型 VA_INT32)

Arithmetic:設定像素元件 Arithmetic,其中 *propData 的類型為 VA_ENUM 且設定為下列 其中一個值:

  • UNSIGNED

  • SIGNED

MaxImgHeight:設定最大影像高度(類型 VA_INT32)

MaxImgWidth:設定最大影像寬度(類型 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

影像格式代碼。

Parameter 2

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

Parameter 3

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

描述

查詢由控制代碼參照的影像格式之屬性。可查詢的屬性與可透過該函式設定的屬性相同。 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

模擬控制代碼。

Parameter 2

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

描述

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

回傳值

0:確定

<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

模擬控制代碼。

Parameter 2

狀態訊息控制代碼。

Parameter 3

要設定的屬性名稱。

參數 4

新屬性值

描述

變更狀態訊息屬性。可透過此函式設定下列屬性:

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

模擬控制代碼。

Parameter 2

要提交之狀態訊息的控制代碼。

描述

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

回傳值

0:確定

<0: Can’t submit message

建立 Custom Operator 文件

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

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

請務必提供 CSS 檔案。同時請務必提供所有相關的影像檔案。

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

Completing the Custom Operator

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

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

    [提示] 僅當模組輸入確實連接至無法停止的來源時,才設定 Add IO Buffer = NO

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

    Add IO Buffer = NO

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

    [提示] 網表產生期間的警告

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

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

    \Examples\CustomLibrary

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

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

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

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

必要步驟:

  1. 前往 Cores 標籤頁。

  2. 指定您產生的網表檔案。

  3. 如果您定義了約束,請指定約束檔案。

  4. 指定支援的裝置:裝置名稱即為目標平台的 FPGA 類型名稱。請使用與 VisualApplets 專案資訊方塊中完全相同的拼寫。如果支援多種 FPGA 類型,請使用空格分隔的名稱清單。

    如果設計使用了自訂運算子,但目標平台上的 FPGA 不在此清單中,DRC 將回報錯誤,指出目標平台不支援該運算子。

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

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

    [提示] 定義多個核心

    您可以為同一個自訂運算子定義多個核心。這允許使用自訂運算子的裝置與工具特定實作,從而為不同的目標平台選擇適當的實作來建置 Applet。

    選用步驟:

  6. 選用步驟:輸入運算子消耗的邏輯資源。只需輸入 Xilinx 工具在產生網表期間估算的數值。

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

  8. 在 General 標籤頁下,指定圖示檔案的路徑。此檔案包含在 VisualApplets 中顯示自訂運算子時將使用的圖示。

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

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

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

    2. 輸入您的密碼。

    3. 按一下 OK。

    您也可以隨時在稍後的時間點,使用自訂函式庫元素的內容選單來保護您的自訂運算子設計。

    [提示] 保護選項

    啟用保護後,自訂運算子將變成一個 “黑箱”。保護自訂運算子設計有兩種方法:

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

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

    「One-Way」保護是不可逆的:如果您選擇保護模式 One Way(而非 Password),自訂庫元素將永遠無法再次開啟,即使您自己也無法開啟。如果您計劃在日後加強該元素,請務必改選保護模式 Password。或者,您可以在啟用此保護模式之前,先儲存該元素的副本(作為階層式方塊或未受保護的運算子)。

  11. 按一下 Save。

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

Using New Custom Operators

散布 Custom Library 或個別 Custom Operator

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

<LibaryName> 是自訂庫的名稱。

此檔案可以散布並直接應用於 VisualApplets 中。只需將其複製到 VisualApplets 設定中指定的「Custom Libraries」目錄即可( Settings → System Settings → Paths → Custom Libraries)

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

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

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

的現成庫,其中包含所有範例運算子。

Update from Custom Library

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

  1. 在運算子上按一下滑鼠右鍵。

  2. 從子功能表中選取 Update from Custom Library 或 Quick Update from Custom Library。

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

匯入與匯出個別 Custom Operator

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

若要匯入自訂運算子:

  1. 在您要匯入自訂運算子的自訂庫上按一下滑鼠右鍵。

  2. 從子功能表中選取 Import Operator → From XML。

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

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

  4. 按一下 Save。

    儲存後,匯入的運算子即可直接在自訂庫中使用:

Operator Template and Examples

範例

在安裝目錄中,您會找到三個已完成的自訂運算子,您可以將其用作參考。您可以在此處找到這些範例:

\Examples\CustomLibrary

Custom Operator Template

在安裝目錄中,您會找到一個自訂運算子範本,可用於定義您的自訂運算子。

\Examples\CustomLibrary 若要使用自訂運算子範本:

  1. 在您想要建立新自訂運算子的自訂函式庫上按一下滑鼠右鍵。

  2. 從子功能表中選取 Import Operator → From XML。

  3. 指定運算子範本的路徑。

  4. 按一下 Open。

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

  5. 為您的新自訂運算子命名,然後依照「透過 GUI 定義個別自訂運算子」一節中的說明進行操作。

用於 Custom Operator 規格的 XML 格式

自訂運算子的定義以 XML 格式儲存。相關的 XML 檔案可以從運算子函式庫匯出,或者可以使用先前匯出的 XML 檔案匯入運算子。

以下我們將說明所需的參數,其中的參數名稱對應到具有相同名稱的 XML 標籤。像這樣的參數 ImgInInfo 將會轉譯為如下的 XML 項目:

<ImgInInfo> ImgInPortNames </ImgInInfo> 其中 ImgInPortNames 是此處的值,在此情況下會是一串連接埠名稱。這些參數是按階層排序的。在下表中,具有灰色背景的行會指出預期參數所在的階層位置。

簡單的參數值可以是下列類型:

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

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

  • 整數

  • 浮點數 (Floating-point)

某些參數是由值的結構所組成,其中陣列或記錄是可用於建構的元素。陣列是透過以空白字元分隔的值清單來輸入,值本身也可以是有結構的。記錄是透過如下的方案來輸入,其中 RecordName 是記錄識別碼, attrX 是記錄項目的識別碼,而 attrXValue 是這些值:

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

一個範例是提供一個名為 port 的記錄,其中包含名稱和寬度的項目:

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

XML 格式的根標籤為 運算子 帶有屬性 name 應在其中提供自訂運算子名稱:

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

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

VHDL 的有效名稱定義如下:

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

參數名稱

Type

描述

Vendor

字串

供應商名稱。

Version

字串

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

Cores

字串陣列

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

LibraryFile

字串

包含運算子高階模擬模型的軟體庫(動態連結庫)之檔案名稱(加引號)。

IconFile

字串

包含運算子圖示的檔案名稱(加引號)。

HtmlHelpFiles

字串陣列

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

表 7. Operator/Info


參數名稱

Type

描述

RegInInfo

字串陣列

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

RegOutInfo

字串陣列

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

ImgInSyncMode

字串

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

ImgInInfo

字串陣列

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

ImgOutInfo

字串陣列

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

GPIn

字串陣列

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

GPOut

字串陣列

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

MemInfo

字串陣列

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

表 8. Operator/IO


參數名稱

Type

描述

NrLut

整數

運算子所消耗的 FPGA LUT 元素數量

NrRegs

整數

運算子所消耗的 FPGA 暫存器數量

NrBlockRam

整數

運算子所消耗的區塊 RAM 元素數量

NrEmbeddedMult

整數

運算子所消耗的嵌入式乘法器數量

表 9. Operator/Properties


影像輸入埠規格是在組態檔中使用以下語法進行:

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

這裡 IMG_IN_IDENTIFIER 是上述參數中提供的其中一個影像輸入埠名稱 Operator/IO/ImgInInfo。內容 Parameters 用於指定影像介面埠的屬性:

參數名稱

Type

描述

Width

整數

影像資料埠的寬度

FIFODepth

整數

輸入資料的緩衝區 FIFO 深度,至少需要由 VA 核心提供。此值必須是 15 到 1023 之間的 2 的冪次方減 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 用於指定影像介面埠的屬性:

參數名稱

Type

描述

Width

整數

影像資料埠的寬度

FIFODepth

整數

輸出資料的緩衝區 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 色彩格式

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

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

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

暫存器輸入埠規格是透過設定檔中的以下語法完成的:

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

這裡 REG_IN_IDENTIFIER 是上述參數中提供的其中一個暫存器輸入埠名稱 Operator/IO/RegInInfo。內容 Parameters 指定暫存器介面埠的屬性:

參數名稱

Type

描述

Width

整數

暫存器埠寬度

表 12. Operator/RegIn


暫存器輸出埠規格是透過設定檔中的以下語法完成的:

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

這裡 REG_OUT_IDENTIFIER 是上述參數中提供的其中一個暫存器輸出埠名稱 Operator/IO/RegOutInfo。內容 Parameters 指定暫存器介面埠的屬性:

參數名稱

Type

描述

Width

整數

暫存器埠寬度

表 13. Operator/RegOut


記憶體介面規格是透過設定檔中包含以下語法的區段來完成的:

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

這裡 MEM_IDENTIFIER 是上述參數中提供的其中一個 memory port 名稱 Operator/IO/MemInfo。內容 Parameters 正在指定 memory 介面的屬性:

參數名稱

Type

描述

DataWidth

整數

資料寬度

AddrWidth

整數

位址寬度

WrFlagWidth

整數

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

RdFlagWidth

整數

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

WrCntWidth

整數

用於傳遞可用寫入命令數量的通訊埠寬度

RdCntWidth

整數

用於傳遞可用讀取命令數量的通訊埠寬度

SyncMode

字串

此參數指出 memory 介面時脈與設計時脈之間的關係。可能的值如下:

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

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

表 14. Operator/Mem


IP 核心網表(netlists)的規格透過設定檔中具有以下語法的區段來完成:

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

這裡 Core_IDENTIFIER 是上述參數中提供的其中一個核心名稱 Operator/Cores。內容 Parameters 正在指定 IP 核心的屬性:

參數名稱

Type

描述

Devices

字串陣列

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

NetlistFile

字串

以引號括住的 UTF-8 編碼網表檔名。

ConstraintsFile

字串

以引號括住的 UTF-8 編碼選用條件約束檔檔名。

MinVersionISE

字串

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

MinVersion

字串

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

表 15. Operator/Core