Verilog功能模塊--SPI主機和從機(02)--SPI主機設計思路與代碼解析

前言

上一篇文章介紹了SPI的四種工作模式及其時序特性,相信各位同學已經掌握了SPI通信的核心原理。

本文用純Verilog設計了功能完整的4線SPI主機,并詳細說明了模塊編碼思路和使用注意事項,最后分享了源碼。

一、模塊功能

本Verilog功能模塊——SPI主機實現了SPI協議要求的完整時序控制,具體功能如下:

  1. 支持所有4種SPI工作模式

  2. 支持任意數據位寬

  3. 支持任意串行時鐘頻率fsclk

  4. 支持指定CS下降沿到第一個SCLK邊沿的延時

  5. 支持指定最后SCLK邊沿到CS上升沿的延時

  6. 支持指定CS高電平持續時間

二、模塊框圖

三、信號接口

3.1 參數列表

參數名類型默認值說明
SPI_MODEinteger3SPI模式, 可選0, 1, 2, 3 (默認)
DATA_WIDTHinteger16單次通信發送或接收數據的位寬, 最小為2, 常見8/16
SCLK_PERIOD_CLK_NUMinteger4fSCLK, SCLK周期對應CLK數, 必須為偶數, 最小為2
CS_EDGE_TO_SCLK_EDGE_CLK_NUMinteger1TCC, CS_N下降沿到SCLK的第一個邊沿對應CLK數, 最小為1
SCLK_EDGE_TO_CS_EDGE_CLK_NUMinteger3TCCH, 最后一個SCLK邊沿到CS_N上升沿對應CLK數, 最小為3
CS_KEEP_HIGH_CLK_NUMinteger2TCWH, CS_N低電平后保持高電平的時間對應CLK數, 最小為2
CLK_FREQ_MHZinteger100模塊工作時鐘, 常用100/120

3.2 接口信號列表

信號分組信號名方向說明
外部控制SPI信號spi_begininputSPI單次通信開始, 高電平有效, 僅在spi_is_busy為低時起作用
spi_endoutputSPI單次通信結束, 高電平有效, 只會持續一個時鐘周期
spi_is_busyoutputSPI繁忙指示, 高電平表示SPI正在工作
spi_master_tx_data[DATA_WIDTH-1:0]inputSPI發送數據, 數據總是高位先發
spi_master_rx_data[DATA_WIDTH-1:0]outputSPI接收數據, 最先讀出的數據在最高位
spi_master_rx_data_validoutputSPI接收數據有效指示,高電平有效
SPI硬線鏈接spi_cs_noutput片選, 低電平有效
spi_sclkoutputSPI時鐘, 主機提供
spi_mosioutput主機輸出從機輸入
spi_misoinput主機輸入從機輸出
時鐘與復位clkinput模塊工作時鐘
rstninput模塊復位, 低電平有效

四、編碼思路

  1. 通過參數控制SPI模式、數據位寬、時鐘頻率與三種時序參數

    parameter?integer?SPI_MODE?????????????????????=?3,??//?SPI模式,?可選0,?1,?2,?3?(默認)
    parameter?integer?DATA_WIDTH???????????????????=?16,?//?單次通信發送或接收數據的位寬,?最小為2,?常見8/16
    parameter?integer?SCLK_PERIOD_CLK_NUM??????????=?4,??//?fSCLK,?SCLK周期對應CLK數,?必須為偶數,?最小為2
    parameter?integer?CS_EDGE_TO_SCLK_EDGE_CLK_NUM?=?1,??//?TCC,?CS_N下降沿到SCLK的第一個邊沿對應CLK數,?最小為1
    parameter?integer?SCLK_EDGE_TO_CS_EDGE_CLK_NUM?=?3,??//?TCCH,?最后一個SCLK邊沿到CS_N上升沿對應CLK數,?最小為3
    parameter?integer?CS_KEEP_HIGH_CLK_NUM?????????=?2,??//?TCWH,?CS_N低電平后保持高電平的時間對應CLK數,?最小為2
    parameter?integer?CLK_FREQ_MHZ?????????????????=?100?//?模塊工作時鐘,?常用100/120

    注意這里的時延并不是真實值,而是以模塊時鐘CLK為單位的相對值,且因為三段式狀態機輸出時序邏輯的限制,時延參數并不能到0,有最小值的限制。這對于實際應用是沒有影響的,實際應用中這些參數也不可能為0,且即使延時略長(如TCCH=30ns)同樣可以正常工作。

  2. 對參數進行有效性檢查,限制參數賦值

    //++?參數有效性檢查?++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    initial?begin
    ??if?(SPI_MODE?!=?0?&&?SPI_MODE?!=?1?&&?SPI_MODE?!=?2?&&?SPI_MODE?!=?3)
    ????$error("SPI_MODE?must?be?0,?1,?2,?3");
    ??if?(DATA_WIDTH?<?2)
    ????$error("DATA_WIDTH?must?be?>=?2");
    ??if?(SCLK_PERIOD_CLK_NUM?<?2?||?(SCLK_PERIOD_CLK_NUM?%?2?!=?0))
    ????$error("SCLK_PERIOD_CLK_NUM?must?even?and?>=?2");
    ??if?(CS_EDGE_TO_SCLK_EDGE_CLK_NUM?<?1)
    ????$error("CS_EDGE_TO_SCLK_EDGE_CLK_NUM?must?>=?1");
    ??if?(SCLK_EDGE_TO_CS_EDGE_CLK_NUM?<?3)
    ????$error("SCLK_EDGE_TO_CS_EDGE_CLK_NUM?must?>=?3");
    ??if?(CS_KEEP_HIGH_CLK_NUM?<?2)
    ????$error("CS_KEEP_HIGH_CLK_NUM?must?>=?2");
    end
    //--?參數有效性檢查?------------------------------------------------------------
  3. 使用三段式狀態機控制整個SPI傳輸過程,狀態機如下圖所示

五、使用說明

//?外部控制SPI信號
input??wire?spi_begin,???//?SPI單次通信開始,?高電平有效,?僅在spi_is_busy為低時起作用
output?wire?spi_end,?????//?SPI單次通信結束,?高電平有效,?只會持續一個時鐘周期
output?wire?spi_is_busy,?//?SPI繁忙指示,?高電平表示SPI正在工作
input??wire?[DATA_WIDTH-1:0]?spi_master_tx_data,?//?SPI發送數據,?數據總是高位先發
output?reg??[DATA_WIDTH-1:0]?spi_master_rx_data,?//?SPI接收數據,?最先讀出的數據在最高位
output?reg???????????????????spi_master_rx_data_valid,?//?SPI接收數據有效,高電平有效

外部模塊通過以上信號控制SPI讀寫,相關說明如下:

  1. spi_is_busy為高時,此SPI主機模塊不響應任何外部信號,所以,外部模塊需要監測spi_is_busy信號,在它為低電平時,發送spi_begin控制spi控制開始

  2. SPI主機模塊在會在spi_begin高電平且spi_is_busy低電平時,鎖存spi_master_tx_data,作為待發送數據

此接口和AXI Stream接口用法基本一致。

六、仿真驗證

見本系列文章——Verilog功能模塊--SPI主機和從機(04)--SPI主機從機回環仿真與實測。

七、源碼分享

源碼在Gitee與Github開源,兩平臺同步:

Gitee:[Verilog功能模塊--SPI主機和從機](https://gitee.com/xuxiaokang/verilog-function-module--SPI-Master-Slave)

Github:[zhengzhideakang/Verilog--SPI-Master-Slave](https://github.com/zhengzhideakang/Verilog--SPI-Master-Slave)


如果本文對你有所幫助,歡迎點贊、轉發、收藏、評論讓更多人看到,贊賞支持就更好了。

如果對文章內容有疑問,請務必清楚描述問題,留言評論或私信告知我,我看到會回復。


徐曉康的博客持續分享高質量硬件、FPGA與嵌入式知識,軟件,工具等內容,歡迎大家關注。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93203.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93203.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93203.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Decoder模型 向量模長表示什么

Decoder模型 向量模長表示什么 詞和其他詞的關系的強弱和關聯程度;生僻詞模長小 從實驗結果來看,Qwen2-7B-Instruct的向量模長規律與之前的預期(“模長與語義豐富度、確定性正相關”)完全相反,這反映了Decoder-only模型(尤其是指令微調模型)的表征特性與Encoder-only模…

STL容器及其算法

C 標準庫容器詳解&#xff1a;特性、用法與場景選型容器是 C 標準庫&#xff08;STL&#xff09;的核心組件&#xff0c;用于存儲和管理數據。不同容器因底層實現不同&#xff0c;在性能、功能和適用場景上差異顯著。本文系統梳理vector、list、set、map等常用容器&#xff0c;…

MySQL ZIP安裝教程:從解壓到啟動

金金金上線&#xff01; 話不多&#xff0c;只講你能聽懂的前端知識 前言 我這里不能下載安裝程序的mysql&#xff0c;由于電腦安全限制&#xff0c;安裝時會彈出需要管理員賬號密碼權限&#xff0c;此路行不通&#xff0c;所以琢磨著免安裝版本怎么個流程&#xff0c;好&#…

p2p打洞

p2p網絡穿透庫,它的C++版本目前只支持linux,不支持win,它最新版本的穿透用的tcp,老版本支持tcp/udp: https://libp2p.io/ P2P-udp的穿透教程: https://edu.51cto.com/lesson/731596.html 目前打洞機制最好的庫是webrtc,其次是libnice,它是輕量級的專門打洞的庫。 libni…

『“無恙心寬”,梗痛不常』——愛上古中醫(12)(健康生活是coder抒寫優質代碼的前提條件——《黃帝內經》伴讀學習紀要)

養心護心氣血通&#xff0c;無痛無梗全身松。 筆記模板由python腳本于2025-08-10 15:54:46創建&#xff0c;本篇筆記適合至少通曉一門語言&#xff0c;熟悉基本編程范式的coder翻閱。 學習的細節是歡悅的歷程 博客的核心價值&#xff1a;在于輸出思考與經驗&#xff0c;而不僅僅…

Spark 運行流程核心組件(一)作業提交

1、Job啟動流程1、Client觸發 SparkContext 初始化 2、SparkContext 向 Master 注冊應用 3、Master 調度 Worker 啟動 Executor 4、Worker 進程啟動 Executor 5、DAGScheduler 將作業分解為 Stage&#xff1a; 6、TaskScheduler 分配 Task 到 Executor 2、核心組件組件職責Spar…

MySQL 臨時表與復制表

一、MySQL 臨時表臨時表是會話級別的臨時數據載體&#xff0c;其設計初衷是為了滿足短期數據處理需求&#xff0c;以下從技術細節展開說明。&#xff08;一&#xff09;核心特性拓展1.生命周期與會話綁定會話結束的判定&#xff1a;包括正常斷開連接&#xff08;exit/quit&…

從配置到調試:WinCC與S7-1200/200SMT無線Modbus TCP通訊方案

測試設備與參數l 西門子PLC型號&#xff1a;S7-1200 1臺l 西門子PLC型號&#xff1a;S7-200Smart 1臺l 上位機&#xff1a;WinCC7.4 1臺l 無線通訊終端——DTD418MB 3塊l 主從關系&#xff1a;1主2從l 通訊接口&#xff1a;RJ45接口l 供電&#xff1a;12-24VDCl 通訊協議&a…

Android沉浸式全屏顯示與隱藏導航欄的實現

1. 總體流程以下是實現沉浸式全屏顯示和隱藏導航欄的流程&#xff1a;步驟描述步驟1創建一個新的Android項目步驟2在布局文件中定義需要展示的界面步驟3在Activity中設置沉浸式全屏顯示步驟4處理系統UI的顯示與隱藏步驟5運行應用并測試效果2. 詳細步驟步驟1&#xff1a;創建一個…

EN 62368消費電子、信息技術設備和辦公設備安全要求標準

EN 62368認證標準是一項全球性的電子產品安全標準&#xff0c;用于評估和認證消費電子、信息技術設備和辦公設備的安全性。該標準由國際電工委員會(IEC)制定&#xff0c;取代了傳統的EN60065和EN 60950兩個標準&#xff0c;成為國際電子產品安全領域的新指導。IEC /EN 62368-1是…

【unity實戰】使用Splines+DOTween制作彎曲手牌和抽牌動畫效果

最終效果 文章目錄最終效果前言實戰1、Splines的使用2、繪制樣條線3、DOTween安裝和使用4、基于樣條曲線&#xff08;Spline&#xff09;的手牌管理系統4.1 代碼實現4.2 解釋&#xff1a;&#xff08;1&#xff09;計算第一張卡牌的位置&#xff08;居中排列&#xff09;&#…

Flask模板注入梳理

從模板開始介紹&#xff1a;Flask中有許多不同功能的模板&#xff0c;他們之間是相互隔離的地帶&#xff0c;可供引入和使用。Flask中的模塊&#xff1a;flask 主模塊&#xff1a;包含框架的核心類和函數&#xff0c;如 Flask&#xff08;應用實例&#xff09;、request&#x…

企業級的即時通訊平臺怎么保護敏感行業通訊安全?

聊天記錄存在第三方服務器、敏感文件被誤發至外部群組、離職員工仍能查看歷史消息.對于金融、醫療、政務等對數據安全高度敏感的行業而言&#xff0c;“溝通效率與”信息安全”的矛盾&#xff0c;從未像今天這樣尖銳。企業即時通訊怎么保護敏感行業通訊安全&#xff1f;這個問題…

Java Spring框架最新版本及發展史詳解(截至2025年8月)-優雅草卓伊凡

Java Spring框架最新版本及發展史詳解&#xff08;截至2025年8月&#xff09;-優雅草卓伊凡引言今天有個新項目 客戶問我為什么不用spring 4版本&#xff0c;卓伊凡我今天剛做完項目方案&#xff0c;我被客戶這一句問了有點愣住&#xff0c;Java Spring框架最新版本及發展史詳解…

Android實現Glide/Coil樣式圖/視頻加載框架,Kotlin

Android實現Glide/Coil樣式圖/視頻加載框架&#xff0c;Kotlin <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permiss…

【k8s】pvc 配置的兩種方式volumeClaimTemplates 和 PersistentVolumeClaim

pvc配置實例 實例1在Deployment中配置 template:xxxxxxvolumeClaimTemplates:- metadata:name: dataspec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: nfsdev-storageclass (創建好的storageClassName)實例2#先創建一個pvc 然后在 Deploym…

Logistic Loss Function|邏輯回歸代價函數

----------------------------------------------------------------------------------------------- 這是我在我的網站中截取的文章&#xff0c;有更多的文章歡迎來訪問我自己的博客網站rn.berlinlian.cn&#xff0c;這里還有很多有關計算機的知識&#xff0c;歡迎進行留言或…

計算機網絡技術-知識篇(Day.1)

一、網絡概述 1、網絡的概念 兩個不在同一地理位置的主機&#xff0c;通過傳輸介質和通信協議&#xff0c;實現通信和資源共享。 2、網絡發展史 第一階段&#xff08;20世紀60年代&#xff09; 標志性事件&#xff1a;ARPANET的誕生關鍵技術&#xff1a;分組交換技術 第二…

工業元宇宙:邁向星辰大海的“玄奘之路”

一、從認知革命到工業革命&#xff1a;文明躍遷的底層邏輯1.1 認知革命&#xff1a;人類協作的基石時間線&#xff1a;約7萬年前&#xff0c;智人通過語言和想象力構建共同虛擬現實&#xff0c;形成部落協作模式。核心突破&#xff1a;虛構能力&#xff1a;創造神、國家、法律等…

9. React組件生命周期

2. React組件生命周期 2.1. 認識生命周期 2.1.1. 很多事物都有從創建到銷毀的整個過程&#xff0c;這個過程稱之為生命周期&#xff1b;2.1.2. React組件也有自己的生命周期&#xff0c;了解生命周期可以讓我們在最合適的地方完成想要的功能2.1.3. 生命周期和生命周期函數的關系…