簡介
mikroBus 是 Mikroe 推出的擴充板標準。mikroBus 最常用於 Mikroe 的「Click」開發板,它使開發人員能夠透過緊湊的硬體介面將各種組件插入開發板。開發板通常具有一到三個 mikroBus 插槽。對於只有一個插槽的小型開發板,連接多個外部模組可能會很麻煩。如果只插入一個 Click 開發板,可能就沒有剩餘的 I/O 介面來連接其他所需的裝置。mikroBus I/O 擴充器(或稱 mikroBridge)就是一個解決此問題的範例,它使用 FPGA 在多個 mikroBus 插槽之間建立橋接。
mikroBus 標準要求預留 I2C、SPI 和 UART 通訊引腳以及五個 GPIO 引腳。GPIO 引腳的標準分配包括模擬、重設、SPI 片選、中斷和 PWM。然而,這些引腳通常會根據附加板上的組件重新分配。通訊引腳(例如 SCL、TX、SCK、MOSI 等)在不使用時保持懸空,並且不會重新分配。因此,橋接系統必須考慮到這種可變性,以盡可能容納附加板。
有關 mikroBus 標準的更多資訊,請訪問 Mikroe 網站:mikroBus 標準規範
最終系統採用 Microchip IGLOO2 FPGA 實作。原始檔案可在下方找到,其中包含 Libero 專案、VHDL 程式碼、測試平台以及包含 Gerber 檔案的 KiCad 專案。
本文的其餘部分將詳細介紹 mikroBridge 系統的架構,並概述每個建置區塊。
功能概述
mikroBridge 的功能分為兩部分。它需要同時充當多工器和 I/O 擴充器。具體要求很簡單:
- 任何訊號或通訊匯流排都必須能夠直接路由到任意或所有擴充插槽上的對應引腳。(多工)
- 擴充插槽上用作輸出的引腳在運作時必須可寫入,且未被多工器選取。*(I/O 擴充)
- 非通訊引腳的引腳方向必須在運行時可編程。
預計頻繁變化的訊號(例如 PWM)將直接路由,而變化頻率較低的訊號(例如 RST)將透過 I/O 擴充功能間接控制。
*上述情況的例外是模擬引腳 AN。此處描述的實現使用外部模擬開關,該開關無法驅動未選取的引腳。但是,可以使用其他外部元件來開發這樣的電路。
簡化方塊圖
mikroBridge 架構
本節簡要概述了用於建立上述功能的各個元件。大多數元件實現了相當標準的行為(例如多工器、串行通訊等)。特殊功能在必要時會註明。
雙向 I/O 基元
相關 mikroBus 訊號:SCL、SDA、CS、RST、INT、PWM
在 I/O 引腳級別,雙向緩衝器十分重要。由於 5 個 GPIO 引腳實際上可以用於任何功能,因此 mikroBridge 必須將它們同時用作輸入和輸出。I2C 通訊匯流排也需要雙向訊號。這是設計中唯一依賴晶片製造商的元件,因為每個工具鏈處理雙向緩衝器實例的方式不同。
上圖是 Microchip Libero 設計工具中的 BIBUF。Y 表示 I/O 腳位上的邏輯電平。D 表示當 E 為高電位時,接腳上驅動的電位。如果 E 為低電平,Y 可以讀取為輸入。對於 I2C 引腳 SCL 和 SDA,雙向緩衝器的 D 輸入端被連接到低電平,因為 I2C 線路只會被拉低,而不會被驅動為高電平。
多工器/解多工器
相關 mikroBus 訊號:MISO、RX、TX
對於無法重新指派的通訊訊號,使用多工(Mux)和解多工(Demux)在主機和輸出之間路由訊號。它們有兩個用於配置寬度的通用參數:N 和 SEL_WIDTH。N 分別設定多工或解多工的 i 或 q 連接埠的寬度。SEL_WIDTH 設定 SEL 連接埠的寬度。必須指定 SEL_WIDTH,使可用位址數大於或等於 N。例如,如果 N 為 4,則 SEL_WIDTH 必須大於或等於 2。N 以外的位址將導致連接埠使用預設值,例如,多工為「0」,解多工為預設值。
解多工有 2 個額外的連接埠,以增加靈活性。第一個特殊參數是預設連接埠。此連接埠定義 q 側輸出目前未選取時的預設值或空閒值。這允許線路空閒時處於高電平而非低電平。第二個特殊參數是 demux_pass_all。如果為「1」,則在 sel =“11”時建立一個特殊條件,將 i 側的輸入傳遞到所有 q 側輸出。最常見的用途是同時向多個裝置發送重置訊號。
雙向 I/O 多工器
相關 mikroBus 訊號:SCL、SDA、CS、RST、INT、PWM
每個可任意分配的 GPIO 引腳都需要其自身的雙向多工/解多工來控制其方向(輸入或輸出)以及如何將其路由到主機 mikroBus 介面。在上圖中,前置碼為 i 的訊號代表主機側,前置碼為 q 的訊號代表橋接側。通常選擇的方向是使得橋接側的方向與主機側的方向相反。方向值為「1」表示輸出,「0」表示輸入。此區塊隨後將充當典型的多工或解多工,具體取決於具有上述兩個特殊解多工參數的配置。
範例:如果 CS 是主機的輸出,則將 i_dir 設為「0」(輸入),並將 q_dir 設為「11」(輸出)。然後,CS 訊號會根據 sel 從 i 傳遞到 q 輸出之一。SPI CS 線為低電平有效,空閒時需要為高電平,因此請設定 demux_defaults = “11”。
I2C 直通
相關 mikroBus 訊號:SCL、SDA
I2C 本質上是可尋址的,因此它不需要像 SPI 和 UART 那樣進行多工,但仍然必須將其路由到每個擴充插槽。在此硬體設計中,FPGA 是匯流排上的中介,可作為中繼器,為每個從屬裝置複製來自 I2C 主裝置的訊號。 I2C 匯流排可以實際連接到每個插槽,從而跳過此步驟,但從長遠來看,透過 FPGA 傳輸可以提供更大的靈活性。
為了在 I2C 訊號上創造直通效果,模組必須知道驅動訊號的是主控還是從屬。當從屬驅動某條線路時,BIBUF 的 Y 輸出為「0」,輸出啟用 (E) 也為「0」,表示該線路被外部拉低。主機側相應的輸出使能隨後設定為「1」,以將該線路拉低。在所有其他情況下,主機輸入 Y 會被反轉並連接到從機側 BIBUF 的輸出啟用,從而將主機線路上的電平複製到從屬線路。
應謹慎使用 I2C 上拉電阻。在這個系統的初步測試中,由於沒有專用的外部上拉電阻,因此使用了 FPGA 的內部上拉電阻。弱內部上拉電阻的值約為 10kohm,導致 I2C 線路的上升時間約為 1us。相對於系統的其他部分,這非常慢,需要補償以避免錯誤。為此,在輸出使能訊號上新增了一個 2-bit 移位暫存器來產生延遲。選擇 1MHz 的時脈頻率使總延遲與 1us 的上升時間相匹配,從而確保訊號在取樣時穩定。在判斷線路穩定並透過外部拉低之前,需要移位暫存器的兩個位元都為「0」。
此外,內部 I2C 介面的輸出啟用訊號在從控制系統的高頻時脈域跨越到直通模組的 1MHz 時脈域時,容易引發亞穩度問題。與上述輸出延遲緩衝器類似,在 int_slave_scl_e 和 int_slave_sda_e 訊號上使用 2-bit 同步鏈以確保穩定性。
如果沒有輸入同步和上升時間補償,內部 I2C 控制器最終會處於無效狀態,且 SDA 線可能會保持低電平,直到重設為止。
配置記憶體
修改後的 RAM 區塊用於保存系統的所有設置,例如 GPIO 方向、多工器選擇、解多工器預設值等。除了在模組頂層分解出連接到多工器的單一訊號之外,這裡沒有什麼特別的事情發生。
雖然記憶體被劃分為單字節字以匹配傳入的串列通訊,但大多數設定僅佔用幾個位,並根據需要從位元組的最低位元開始切片。這使得主機能夠透過串列介面讀回寫入記憶體的整個字節,這有助於偵錯。此外,如果需要,它還允許將設計輕鬆擴充到兩個以上的 mikroBus 插槽。
記憶體對應如下所示:
預設值根據 mikroBus 的預設分配選擇,並假設重置訊號為低電平有效。您可以根據需要在原始檔案中輕鬆調整這些值。
下面列出了每個「暫存器」設定的詳細說明。
SEL
此暫存器設定多工/解多工的位置。除 AN_SEL 外,每個 _SEL 暫存器均遵循此格式。
對於 AN_SEL 設定,
DEMUX_DEFAULTS
此暫存器用於設定未選取解多工輸出的電平。所有 _DEMUX_DEFAULTS 暫存器均遵循此格式。
DEMUX_PASS_ALL
此暫存器決定哪些解多工使用特殊的「全部通過」SEL 值 0xFF。值為「1」時,解多工啟用全部通過功能。
DIR
這些暫存器設定雙向 GPIO 引腳的方向。它與 BIBUF 的輸出啟用直接關聯。所有 _DIR 暫存器都遵循此格式。
「1」表示該訊號來自 FPGA 的輸出。
「0」表示該訊號是 FPGA 的輸入。
I2C 從屬
相關 mikroBus 訊號:SCL、SDA
I2C 是與 mikroBridge 介面的主要方式,因為它具有自然尋址特性,因此始終可用。它不需要像 SPI 和 UART 那樣與內部控制器多工。
此模組實現了基本的 I2C 通訊,採用 7-bit 尋址,無需時脈延長。模組的從屬位址可以透過通用配置。預設從屬位址為 0x25。
發送時,當 tx_load 為高電位時,tx_data 會在時脈上升緣載入到傳送緩衝區。當接收到一個位元組(包括從裝置位址位元組)時,rx_ready 會發出脈衝,在 rx_data 連接埠發出有效資料訊號。
內部 I2C 從設備沒有使用輸入輸出連接埠,而是設定為明確使用 BIBUF 訊號。這種方法在嘗試創造上述直通效果時,更加清晰易懂。
SPI從屬
相關 mikroBus 訊號:CS、SCK、MOSI、MISO
SPI 是與 mikroBridge 介面的可選方法。若要連接到內部 SPI 控制器,必須將 spi_sel 設定為「10」。預設情況下,內部 SPI 從屬工作在模式 0,但可以使用通用函數進行變更。
SPI 從屬的工作方式與 I2C 從屬幾乎相同。當 tx_load 為高電位時,資料會在時脈上升緣載入到發送緩衝區,且 rx_ready 會在每次接收位元組後發出脈衝。
UART
相關 mikroBus 訊號:TX、RX
UART 是另一種與 mikroBridge 介接的可選方法。若要連接到內部 UART 控制器,必須將 uart_sel 設定為「10」。波特率和其他參數可以使用通用配置。請記住設定正確的系統時脈頻率以獲得正確的波特率。預設情況下,波特率設定為 19,200,系統時脈為 25MHz。
UART 的 VHDL 程式碼及更多有關的詳細信息,請參考另一文章見:UART 通訊 (VHDL)
串列轉 RAM 介面
相關 mikroBus 訊號:SCL、SDA、CS、SCK、MOSI、MISO、TX、RX
每種串列協定都有一個獨特的封裝層,用於與配置 RAM 通訊。無論選擇哪種串列協議,此封裝層都能確保與 RAM 的交互幾乎完全相同。每當底層串列介面接收到一個位元組時,封裝層都會使用一個簡單的狀態機將其路由到 RAM 的正確連接埠。命令結構概述如下。
mikroBus 主機可以使用包含位址和資料的 2 個位元組指令來讀寫 RAM。位址位元組是一個 7-bit位址,其最上方有一個讀/寫位元。資料位元組只是一個普通位元組。超出配置 RAM 實際可尋址空間的位址位元可能被視為“無關”,並將被切片以匹配 RAM 位址連接埠的寬度。
命令位元組格式
對於寫入操作,R/W = ‘0’;對於讀取操作,R/W = ‘1’。更多詳情,請參閱以下範例。
寫入範例
閱讀範例
介面控制器
相關 mikroBus 訊號:SCL、SDA、CS、SCK、MOSI、MISO、TX、RX
介面控制器在層級結構中比串列轉 RAM 介面高一級。它是一個封裝器,將上一層的三個串列模組合併為一個統一的 RAM 介面。它允許 mikroBus 主機使用這三個介面中的任何一個,並在偵測到活動時自動切換到正確的介面。需要注意的是,在嘗試與 RAM 通訊之前,必須將 SPI 和 UART 重複使用到內部控制器 (sel = “10”)。
在極少數情況下發生衝突時,仲裁程序會根據以下優先順序(從高到低)分配 RAM 匯流排的控制權:I2C > SPI > UART。
模擬
在物理實作之前,mikroBridge 系統使用 Modelsim 進行了模擬。完整的 Libero 專案包含一個用於頂層 mikroBridge 系統的主測試平台,以及一些用於子模組的小型測試平台。
該測試平台並非詳盡無遺,但涵蓋了大多數用例。每個串列介面都經過測試,以確保其能夠讀寫配置 RAM。此外,也驗證了路由多工的每個可能位置。專案包含一個 TCL .do 腳本,用於自動格式化波形視圖,為每個模組劃分單獨的部分,以便於查看。
實現
使用 Microchip IGLOO2 FPGA 在 KiCad 中開發了一個實現 1:2 mikroBridge 設計的 PCB。
此 PCB 設計不符合 mikroBus 標準規範,因為任何標準尺寸都無法容納兩個完整的插槽。但是,由於此設計主要用於單插槽開發板,因此存在偏差是可以接受的。
為了進行測試,mikroBridge PCB 與單一 mikroBus 插槽的 AVR-IoT 開發板配對。我們開發了一個 Atmel Studio 專案來鏡像模擬測試台並驗證最終實現的行為。與主模擬測試台一樣,AVR 版本會逐步執行所有可能的路由場景,並驗證每個介面是否能夠讀寫配置記憶體。專案中包含一個標頭文件,其中包含用於 RAM 記憶體對應的 #defines。
在開發板上,SW0 用於推進測試案例,SW1 用於重置為初始狀態。LED 用於指示記憶體讀寫是否成功。訊號路由驗證需要示波器。
注意:擴充插槽上的 I2C 上拉電阻 (R13-R16) 在 PCB 的初始版本中不存在,後來新增。 IGLOO2 上的內部上拉電阻用於性能下降的測試。
原始碼下載
Libero 項目,包含 VHDL 原始檔、測試平台等:mikrobridge_wiki.zip (4.4 MB)
KiCad 原理圖和佈局來源檔案、BoM 檔案以及開發板的 Gerber 檔案可在此處下載:
mikrobridge_3.3.20.zip (734.2 KB)
AVR 測試平台原始碼:ClickBridgeTest.zip (283.5 KB)
總結
mikroBridge 是一款實用的開發工具,可用於擴展 I/O 受限的開發板。它演示了 FPGA 作為靈活 I/O 擴展器的應用。這種基本結構為進一步客製化以適應更廣泛的應用奠定了基礎。
在開發過程中,我們學到了許多有趣的經驗教訓,尤其是在 I2C 訊號通過 FPGA 的路由方面。考慮時序和訊號穩定性對於 I2C 通訊的正常運作至關重要。
雖然上述 IGLOO2 實作對於演示和學習來說很有效,但它遠非成本優化的解決方案。還有其他方案可以降低最終產品的成本和尺寸。目前的設計相容於大多數 Click 擴充板,但仍有提升靈活性的空間,尤其是在類比訊號引腳方面。