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

前言

上一篇文章介紹了Verilog功能模塊——SPI主機,包括主機設計思路與使用方法。

本文則用純Verilog設計了功能完整的4線SPI從機,與網上一些以高頻率clk時鐘模擬從機不同,本文中的SPI從機工作時鐘來源于主機的sclk,符合SPI同步通信的原則。

本文詳細說明了模塊編碼思路和使用注意事項,最后分享了源碼。

一、模塊功能

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

  1. 同步通信,工作時鐘來源于主機的sclk
  2. 支持所有4種SPI模式,通過SPI_MODE參數配置;
  3. 數據位寬通過DATA_WIDTH參數可配置(1-32位);
  4. 采用異步復位設計。

二、模塊框圖

三、信號接口

3.1 參數列表

參數名類型默認值說明
SPI_MODEinteger3SPI模式, 可選0, 1, 2, 3 (默認)
DATA_WIDTHinteger16單次通信發送或接收數據的位寬, 最小為2, 常見8/16

3.2 接口信號列表

信號分組信號名方向說明
外部控制SPI信號spi_slave_tx_is_busyoutputSPI繁忙指示, 高電平表示SPI正在工作
spi_slave_tx_data[DATA_WIDTH-1:0]inputSPI發送數據, 數據總是高位先發
spi_slave_rx_data[DATA_WIDTH-1:0]outputSPI接收數據, 最先讀出的數據在最高位
spi_slave_rx_data_validoutputSPI接收數據有效指示,高電平有效
SPI硬線鏈接spi_cs_ninput片選, 低電平有效
spi_sclkinputSPI時鐘, 主機提供
spi_mosiinput主機輸出從機輸入
spi_misooutput主機輸入從機輸出
復位arstninput異步復位, 低電平有效

四、編碼思路

  1. 通過參數控制SPI模式和數據位寬

    parameter integer SPI_MODE   = 3, // SPI模式, 可選0, 1, 2, 3 (默認)
    parameter integer DATA_WIDTH = 16 // 單次通信發送或接收數據的位寬, 最小為1, 常見8/16
    
  2. 對參數進行有效性檢查,限制參數賦值

    //++ 參數有效性檢查 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    initial beginif (SPI_MODE != 0 && SPI_MODE != 1 && SPI_MODE != 2 && SPI_MODE != 3)$error("SPI_MODE must be 0, 1, 2, 3");if (DATA_WIDTH <= 0)$error("DATA_WIDTH must be >= 1");
    end
    //-- 參數有效性檢查 ------------------------------------------------------------
    
  3. 暫存cs_n信號的上一狀態,作為加載發送數據的控制信號

    //++ 片選狀態跟蹤 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    reg spi_cs_n_old; // 片選跳變前一瞬間的狀態, 跳變結束后會變為新值
    always @(posedge spi_cs_n or negedge spi_cs_n or negedge arstn) beginif (~arstn)spi_cs_n_old <= 1'b1;elsespi_cs_n_old <= spi_cs_n;
    end
    //-- 片選狀態跟蹤 ------------------------------------------------------------//++ 發送數據 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /*
    原則是先采樣再移位
    */
    reg [$clog2(DATA_WIDTH+1)-1:0] sample_cnt; // 采樣計數
    reg [DATA_WIDTH-1:0] tx_data_lsfr;// 移位寄存器generate
    if (SPI_MODE == 0 || SPI_MODE == 3) begin // 下降沿移位, 第一個下降沿移位always @(negedge spi_sclk or negedge spi_cs_n) beginif (spi_cs_n_old)tx_data_lsfr <= spi_slave_tx_data;  // 片選下降沿加載發送數據else if (~spi_cs_n && sample_cnt != 'd0)tx_data_lsfr <= tx_data_lsfr << 1;elsetx_data_lsfr <= tx_data_lsfr;end
    end else begin // 上升沿移位, 第一個上升沿不移位always @(posedge spi_sclk or negedge spi_cs_n) beginif (spi_cs_n_old)tx_data_lsfr <= spi_slave_tx_data;  // 片選下降沿加載發送數據else if (~spi_cs_n && sample_cnt != 'd0)tx_data_lsfr <= tx_data_lsfr << 1;elsetx_data_lsfr <= tx_data_lsfr;end
    end
    endgenerateassign spi_miso = spi_slave_tx_is_busy ? tx_data_lsfr[DATA_WIDTH-1] : 1'bz; // 三態輸出控制
    //-- 發送數據 ------------------------------------------------------------
    

    注意這里的spi_cs_n_old,它是SPI同步從機最關鍵的代碼,如果用~spi_cs_n,那么在整個傳輸中,spi_cs_n都是低電平,后續代碼都無法執行了,所以只能用spi_cs_n_old,它只在spi_cs_n下降沿執行一次。

五、使用說明

// SPI從機外部控制信號
output wire spi_slave_tx_is_busy, // 指示SPI從機正在發送, 高電平有效
input  wire [DATA_WIDTH-1:0] spi_slave_tx_data,        // 發送數據
output reg  [DATA_WIDTH-1:0] spi_slave_rx_data,        // 接收數據
output reg                   spi_slave_rx_data_valid,  // 接收數據有效

外部模塊只需控制spi_slave_tx_data即可,此信號會在每個spi_cs_n下降沿鎖存。

六、仿真驗證

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

七、源碼分享

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

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

Github:zhengzhideakang/Verilog–SPI-Master-Slave: verilog-function-module–SPI-Master-Slave https://github.com/zhengzhideakang/Verilog–SPI-Master-Slave


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

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


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

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

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

相關文章

【Big Data】Hadoop YARN 大數據集群的 “資源管家”

Apache Hadoop YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Hadoop生態系統中的核心資源管理框架&#xff0c;通過解耦資源管理和任務調度&#xff0c;提供了一個通用的分布式計算資源調度平臺&#xff0c;使Hadoop從單一的MapReduce框架演進為支持多種計算…

【計組】總線與IO

總線同步定時方式采用公共時鐘信號協調發送方和接收方的傳送異步定時方式采用握手信號來實現定時控制不互鎖對于主設備&#xff1a;請求&#xff0c;隔一段時間自動撤銷請求對于從設備&#xff1a;回答&#xff0c;隔一段時間自動撤銷回答半互鎖對于主設備&#xff1a;請求&…

技術速遞|Model Context Protocol (MCP) 支持已上線 JetBrains、Eclipse 和 Xcode

模型上下文協議&#xff08;MCP&#xff09;與 GitHub Copilot 的集成現已全面支持 JetBrains、Eclipse 和 Xcode&#xff01;MCP 使 GitHub Copilot 能夠與外部工具和數據源集成&#xff0c;從而提升更深入的上下文感知能力和編碼智能。 借助 JetBrains、Eclipse 和 Xcode 中…

深入淺出理解支持向量機:從原理到應用,解鎖分類算法的核心密碼

????在機器學習的廣闊領域中&#xff0c;分類算法猶如一個個精準的 “決策官”&#xff0c;幫助我們從海量數據中挖掘規律、做出判斷。而在眾多分類算法里&#xff0c;支持向量機&#xff08;Support Vector Machine&#xff0c;簡稱 SVM&#xff09;憑借其出色的泛化能力、…

相關法律、法規知識(五)

一、著作權法&#xff1a;軟件知識產權風險條款核心要求召回風險場景軟件著作權歸屬&#xff08;11&#xff09;委托開發軟件無書面合同 → 著作權歸受托方代工生產的設備預裝未授權軟件 → 侵權訴訟 → 強制下架召回&#xff08;如工業PDA盜用第三方代碼&#xff09;侵權行為&…

PWM控制實現呼吸燈

一.呼吸燈原理 呼吸燈指燈光的亮度隨著時間由暗到亮逐漸增強&#xff0c;再由亮到暗逐漸衰減&#xff0c;很有節奏感地一起一伏&#xff0c;就像是在呼吸一樣&#xff0c;被廣泛應用于手機、電腦、電視等電子設備的指示燈中。 通過調節PWM占空比實現呼吸燈效果。通過調節定…

MySQL LIKE查詢終極指南:模糊匹配的利刃與性能深淵

引言 LIKE是MySQL中最強大的模糊匹配操作符&#xff0c;也是性能陷阱最多的查詢之一。本文將系統解析其高效使用方法&#xff0c;通過實測數據揭示不同場景下的性能表現&#xff0c;并提供企業級優化方案。一、基礎語法與通配符解析 1.1 四種匹配模式詳解 -- 前綴匹配&#xff…

開發者工具與效率提升指南

開發者工具與效率提升指南介紹 在軟件開發過程中&#xff0c;選擇適當的開發工具和配置優化是提升效率的關鍵。本指南旨在提供關于常用開發工具、IDE配置、自動化流程及效率腳本的全面資源與建議&#xff0c;以幫助開發者更高效地進行編碼和項目管理。 開發工具和IDE配置 常用開…

Python 輕量級的 ORM(對象關系映射)框架 - Peewee 入門教程

文章目錄基礎創建數據庫管理對象定義自己的模型連接數據庫并創建表插入數據查詢數據更新數據刪除數據進階復合主鍵模型示例復雜查詢示例(以Relation模型為例)基礎 創建數據庫管理對象 from peewee import *db MySQLDatabase(test_db, userroot, passwordpassword, hostlocal…

《Java反射與動態代理詳解:從原理到實踐》

1. 反射&#xff08;Reflection&#xff09; 1.1 反射的概述 反射是Java語言的核心特性之一&#xff0c;它允許程序在運行狀態下動態獲取類的信息并操作類的成員&#xff08;構造方法、成員變量、成員方法&#xff09;。 專業定義 對于任意一個類&#xff0c;都能夠知道這個類的…

golang7 數組切片

本視頻詳細講解了Go語言中的集合類型數據結構&#xff0c;重點介紹了數組、切片、map和list四種集合類型。特別強調了切片和map的重要性&#xff0c;以及它們在實際開發中的應用。同時&#xff0c;詳細闡述了數組的定義、操作及其與切片之間的區別&#xff0c;包括數組類型與元…

k8s-容器化部署論壇和商城服務(小白的“升級打怪”成長之路)

目錄 一、配置文件編寫 1、數據持久化 2、mysql主從復制 3、php解析環境 4、nginx服務 5、redis主從復制 6、tomcat服務 7、操作命令 8、在每個node節點操作上 9、更改服務文件加入redis緩存和實現訪問動靜分離 在存儲主機上查看 10、更改商城應用文件 二、實現域…

智慧AI消防通道占用檢測在危險區域的應用

智慧AI消防通道占用檢測&#xff1a;構建工廠與倉庫的安全防線在工業生產與物流倉儲領域&#xff0c;工廠安全與倉庫安全始終是企業運營的核心命題。消防通道作為緊急情況下的“生命通道”&#xff0c;其暢通性直接關系到人員疏散效率與火災撲救效果。然而&#xff0c;傳統人工…

LangGraph-2-Demo

狀態&#xff1a;一個共享數據結構&#xff0c;表示應用程序的當前快照。它可以是任何 Python 類型&#xff0c;但通常是 TypedDict 或 Pydantic BaseModel。 節點&#xff1a;Python 函數&#xff0c;用于編碼代理的邏輯。它們以當前 狀態 作為輸入&#xff0c;執行一些計算或…

基于硅基流動API構建智能聊天應用的完整指南

基于硅基流動API構建智能聊天應用的完整指南 一、引言&#xff1a;AI編程工具重塑開發范式 人工智能編程工具正在徹底改變軟件開發的方式&#xff0c;使開發者能夠快速構建以前需要大量專業知識的復雜應用。本文將深入探討如何使用硅基流動(SiliconFlow)的API&#xff0c;結合…

深入解析MyBatis中#{}和${}的區別與應用場景

在MyBatis框架的使用過程中&#xff0c;SQL映射文件的編寫是核心工作之一。而#{}和${}這兩種參數占位符語法&#xff0c;雖然看起來相似&#xff0c;卻有著本質的區別。正確理解和使用它們&#xff0c;不僅關系到應用程序的安全性&#xff0c;還會影響系統性能。本文將全面剖析…

ELKB日志分析平臺 部署

ElasticSearch ELKB 日志分析 介紹 docker-compose一鍵部署ELK(elasticsearchlogstashkibana) 以下是使用 Docker Compose 部署 Elasticsearch、Logstash、Kibana 和 Beats&#xff08;以 Filebeat 為例&#xff09; 的完整方案&#xff0c;涵蓋配置文件、關鍵參數說明及部署步…

File IO 字節流 | Java 學習日志 | 第 12 天

File 1.概述 File表示路徑&#xff0c;可以表示文件和文件夾&#xff0c;可以存在也可以不存在 相對路徑&#xff08;相對當前項目&#xff09;&#xff0c;絕對路徑。 構造方法File(file/string)&#xff0c;File(file/string,string)。 public static void main(String[] ar…

基于SpringBoot的服裝公司進銷存管理系統設計與開發(代碼+數據庫+LW)

摘要 隨著服裝行業競爭的加劇&#xff0c;傳統手工或簡單電子表格管理進銷存的方式已難以滿足現代企業的需求&#xff0c;效率低下且易出錯。基于SpringBoot框架的服裝公司進銷存管理系統應運而生&#xff0c;旨在通過信息化手段提升運營效率和服務質量。系統特別設計了銷售員…

openFeign用的什么協議,dubbo用的什么協議

簡單直接的答案是&#xff1a;?OpenFeign?&#xff1a;默認使用 ?HTTP? 協議&#xff08;通常是 HTTP/1.1&#xff0c;也支持 HTTP/2&#xff09;&#xff0c;通信格式為 ?RESTful JSON。?Dubbo?&#xff1a;默認使用 ?Dubbo 協議?&#xff08;一種自定義的、基于 TCP…