程式碼下載
版本 1.2:spi_slave.vhd (8.1 KB)
略微修改了架構,使其能夠使用更多工具進行綜合
版本 1.1:spi_slave_v1_1.vhd (8.0 KB)
添加了異步低態動作重置
版本 1.0:spi_slave_v1_0.vhd (7.5 KB)
初始版本
特點
- 使用者可定義 SPI 模式
- 使用者可定義資料寬度
- 狀態暫存器包含傳送就緒、接收就緒和接收超出錯誤位元
- 狀態暫存器位元可透過 SPI 傳輸和/或獨立引腳中斷供主機使用
- 狀態暫存器位元可供使用者邏輯使用
介紹
本文詳細介紹了一個用於 CPLD 和 FPGA 的 SPI 從設備元件,該元件採用 VHDL 語言編寫。此組件使用 Quartus II 11.1 版設計。資源需求取決於具體實作(即資料寬度)。圖 1 展示了整合到系統中的 SPI 從設備的典型範例。
圖 1. 範例應用
背景
SPI 通訊方案是一種全雙工資料連結,使用四線。主機透過將從屬選擇(SS)線拉低來發起傳輸。主機驅動的串列時脈(SCLK)線提供同步時脈來源。主機透過主機輸出、從屬輸入(MOSI)線發送數據,並透過主機輸入、從屬輸出(MISO)線接收數據。
主機可以透過多種技術與多個從屬通訊。在最常見的配置中,每個從屬都有獨立的 SS 線,但與其他從機共享 SCLK、MISO 和 MOSI 線。當 SS 線未拉低時,每個從屬都會忽略共用線路。
SPI 有四種工作模式,基於兩個參數:時脈極性(CPOL)和時脈相位(CPHA)。主控和從屬必須使用相同的模式才能清楚地通訊。如果 CPOL 為零,則 SCLK 通常為低,且第一個時脈緣為上升緣。如果 CPOL 為 1,SCLK 通常為高電平,第一個時脈緣為下降緣。CPHA 定義資料對齊方式。如果 CPHA 為 0,則第一個資料位元在 SS 下降緣寫入,並在第一個 SCLK 緣讀取。如果 CPHA 為 1,則資料在第一個 SCLK 緣寫入,並在第二個 SCLK 緣讀取。圖 2 中的時序圖描述了四種 SPI 模式。
圖 2. SPI 時序圖
連接埠描述
表 3 描述了 SPI 從屬的連接埠。從屬的工作模式由通用參數 cpol 和 cpha 定義。發送和接收資料匯流排寬度由通用參數 d_width 聲明。
表 3. 連接埠描述
功能描述
使用者使用 VHDL 實體中的 cpol 和 cpha GENERIC 參數設定從屬組件的 SPI 模式。
此 SPI 從屬元件與 SPI 主控元件之間的每個傳輸必須包含一個 8-bit 命令,隨後是 N-bit 資料傳輸。資料傳輸的大小 N 由 VHDL 實體中的 GENERIC d_width 參數決定,並由使用者設定。圖 3 展示了 cpol = 0、cpha = 0 和 d_width = 8 的傳輸。
圖 3. 8-Bit 傳輸
8-bit 命令
表 1 定義了主機透過 MOSI 發送的 8-bit 命令。主控必須先發送命令的 MSB。
![]()
表 1. 8-bit 命令格式
SPI 從屬元件包含三個暫存器:接收暫存器、傳送暫存器和狀態暫存器。wr_addr 位元標識在資料傳輸過程中 MOSI 線寫入哪個從元件暫存器,rd_addr 位元標識 MISO 線將資料傳回主控的哪個暫存器。表 2 列出了每個暫存器的位址。

表 2. 暫存器位址。
接收暫存器
接收暫存器是一個緩衝區,用於保存透過 MOSI 線從主設備接收的資料。為了讓使用者邏輯存取結果數據,使用者必須在元件未執行傳輸時(即當 busy 輸出為低電平時)觸發 rx_req 輸入脈衝。然後,從裝置將接收暫存器的內容輸出到 rx_data 連接埠。
發送暫存器
發送暫存器是一個緩衝區,用於保存從屬通過 MISO 線發送給主控的待發送資料。使用者邏輯透過將資料傳送到 tx_load_data 連接埠並在元件未執行傳輸(即 busy 輸出為低電平)時觸發 tx_load_en 輸入脈衝來填入此暫存器。
狀態暫存器
SPI 從屬無需使用狀態暫存器即可運作。此暫存器為使用者提供有關從屬組件狀態的訊息,但並非使用該組件的必要條件。
狀態暫存器包含三個狀態位元。主控可以透過指向該暫存器的傳輸來讀取、設定或清除這些位元。在讀取或寫入狀態暫存器的傳輸期間,發送的前三個資料位元分別對應於 trdy、rrdy 和 roe。從屬元件會忽略傳輸期間發送或接收的其餘位元。使用者邏輯可以透過指定名稱的連接埠存取這些位元。使用者邏輯也可以透過在 st_load_trdy、st_load_rrdy 和 st_load_roe 輸入上呈現所需值,並在元件未執行傳輸(即 busy 輸出為低電平)時向 st_load_en 輸入發送脈衝來設定或清除這些位元。
trdy
trdy(傳送就緒)位元表示使用者邏輯在上一次 SPI 傳輸執行後已將新資料寫入傳送暫存器,因此主控尚未讀取目前資料。下次主控讀取傳送暫存器時,元件會清除 trdy 位元。
rrdy
rrdy(接收就緒)位元表示使用者邏輯在上一次讀取接收暫存器後已將新資料寫入接收暫存器,因此使用者邏輯尚未接收到最新資料。一旦使用者邏輯請求數據,元件就會清除 rrdy 位元。
roe
roe(接收超出錯誤)位元表示主控在用戶邏輯讀取資料之前覆蓋了最後接收的資料。主控可以透過 SPI 傳輸寫入狀態暫存器來清除 roe 位元,或者使用者邏輯可以透過 st_load 輸入寫入狀態暫存器來清除該位,如上所述。
中斷
trdy、rrdy 和 roe 連接埠還提供了一種透過改變 SPI 從屬設備狀態來中斷 SPI 主控設備或使用者邏輯的方法,而無需執行 SPI 傳輸。使用者可以將這些連接埠連接到 SPI 主控、使用者邏輯、兩者兼有或都不連接。
傳輸範例
圖 4 展示了一個傳輸範例(在 ModelSim Altera Starter Edition 10.0c 中模擬)。從屬配置為工作在模式「00」。當從屬空閒時,使用者邏輯向 tx_load_en 輸入發送脈衝,同時在 tx_load_data 總線上呈現資料「10101010」。trdy 訊號立即變為高電平,表示有新的資料需要發送。然後,主機使用指令「00000000」啟動傳輸,指示從屬將後續的 MOSI 資料載入到接收暫存器,並將發送暫存器的內容輸出到 MISO。發送完最後一個資料位元後,trdy 訊號變為低電平,表示發送暫存器的目前值已傳送給主控。同樣,當從屬將最後一個資料位元讀入接收暫存器時,rrdy 訊號宣告,表示新資料已接收。然後,使用者邏輯向 rx_req 輸入發送脈衝,從屬透過在 rx_data 匯流排上輸出接收到的資料「10110001」來回應。然後,rrdy 輸出解除宣告,表示接收暫存器中包含的資料已被使用者邏輯讀取。
圖 4. 範例傳輸
重置
reset_n 輸入連接埠必須為邏輯高電平,SPI 從屬組件才能運作。此連接埠上的低電平訊號會非同步重置組件。重置期間,miso 輸出將呈現高阻態,rx_data 輸出埠將清除。發送、接收、發送就緒、接收就緒和接收超出錯誤暫存器將全部清零。
結論
此 VHDL SPI 從屬提供使用者可定義的模式和資料寬度。它包含發送就緒、接收就緒和接收超出錯誤的狀態訊號。
相關主題
SPI 轉 I2C 橋接器 (VHDL) - 本設計使用本頁所述的 SPI 從屬實作 SPI 轉 I2C 橋接器。




