FPGA即插即用Verilog驅動系列——SPI發送模塊

實現功能:

按字節以spi模式3發送數據,如果要stm32接收,請在cubemx中將對應的spi接口設置為模式3,詳情見代碼開頭注釋

// spi_byte_master.v
// 經過優化的SPI主設備模塊,每次使能發送一個字節。
// 它實現了SPI模式3 (CPOL=1, CPHA=1),即時鐘空閑為高電平,在第二個邊沿(上升沿)采樣數據。module spi_byte_master(input              clk,        // SPI 工作時鐘 (例如 10MHz)input              rst_n,      // 異步復位,低有效input              ena_mo,     // 模塊使能,一個高脈沖觸發一次字節傳輸input      [7:0]   spi_tdata,  // 要發送的8位數據input              spi_miso,   // SPI MISO 信號output reg         spi_mosi,   // SPI MOSI 信號output reg         spi_sck,    // SPI SCK 信號output reg         spi_nss,    // SPI 片選信號output reg [7:0]   spi_rdata,  // 接收到的8位數據output             tr_done     // 一字節傳輸完成信號
);// 狀態機狀態定義localparam S_IDLE  = 2'b00; // 等待使能localparam S_TX_L  = 2'b01; // SCK 低電平,改變數據localparam S_TX_H  = 2'b10; // SCK 高電平,采樣數據localparam S_DONE  = 2'b11; // 傳輸完成// 狀態機寄存器reg [1:0] state, next_state;// 位計數器reg [3:0] bit_cnt;// 用于鎖存待發送數據的寄存器reg [7:0] tdata_reg;// FSM - 狀態轉移邏輯 (組合邏輯)always @(*) beginnext_state = state; // 默認保持當前狀態case (state)S_IDLE: beginif (ena_mo)next_state = S_TX_L;endS_TX_L: beginnext_state = S_TX_H;endS_TX_H: begin// 發送完8位后進入完成狀態if (bit_cnt == 4'd7)next_state = S_DONE;elsenext_state = S_TX_L;endS_DONE: begin// 完成后立即返回IDLE,等待下一次觸發next_state = S_IDLE;enddefault: next_state = S_IDLE;endcaseend// FSM - 狀態輸出和數據處理邏輯 (時序邏輯)always @(posedge clk or negedge rst_n) beginif (!rst_n) beginstate <= S_IDLE;bit_cnt <= 4'd0;spi_sck <= 1'b1;    // SPI模式3: 空閑時SCK為高spi_mosi <= 1'b0;spi_nss <= 1'b1;    // 片選默認無效spi_rdata <= 8'd0;tdata_reg <= 8'd0;end else beginstate <= next_state;// 根據狀態執行操作case (state)S_IDLE: beginspi_nss <= 1'b1; // 在IDLE狀態,取消片選if (ena_mo) beginspi_nss <= 1'b0; // 使能,立即拉低片選,選中從設備bit_cnt <= 4'd0; // 準備發送第一位tdata_reg <= spi_tdata; // 鎖存待發送數據endendS_TX_L: begin// 在SCK下降沿改變數據 (CPHA=1)spi_mosi <= tdata_reg[7 - bit_cnt];spi_sck <= 1'b0;endS_TX_H: beginspi_sck <= 1'b1;// 在SCK上升沿采樣數據 (CPHA=1)spi_rdata[7 - bit_cnt] <= spi_miso;bit_cnt <= bit_cnt + 1;endS_DONE: begin// 傳輸完成,為下一次傳輸做準備bit_cnt <= 4'd0;// nss 信號將會在下一個周期的 IDLE 狀態被拉高endendcaseendend// 完成信號,在S_DONE狀態時拉高一個時鐘周期assign tr_done = (state == S_DONE);endmodule

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

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

相關文章

C++ 排序指南

在 C 中&#xff0c;std::sort 是一個非常強大且常用的函數&#xff0c;用于對容器或數組中的元素進行排序。它定義在 <algorithm> 頭文件中。 std::sort 的基本語法 std::sort 的基本語法有以下幾種形式&#xff1a;默認升序排序&#xff1a; std::sort(first, last);fi…

RS232串行線是什么?

RS232串行線是什么&#xff1f;RS232串行線是一種用于串行通信的標準化接口&#xff0c;廣泛應用于早期計算機、工業設備、儀器儀表等領域的短距離數據傳輸。以下是其核心要點解析&#xff1a;1. 基本定義 全稱&#xff1a;RS232&#xff08;Recommended Standard 232&#xff…

k8s-scheduler 解析

學習文檔 官網的k8s上關于scheduler的文檔基本可以分為這兩部分 介紹 scheduler 的基本概念 介紹 scheduler 的配置 KubeSchedulerConfiguration 的參數 介紹 scheduler 的命令行參數 調度框架解析 Scheduling-framework 解析 kube-scheduler 選擇 node 通過下面這兩步…

前端簡歷1v1修改: 優化項目經驗

今天有人找我優化前端簡歷&#xff0c;分享一下如何優化項目經驗描述。這是修改前的版本&#xff1a;項目為Web前端開發&#xff0c;但描述為APP應用&#xff0c;包含某某功能。起初我感到困惑&#xff0c;因為前端技術棧使用Vue&#xff0c;為何項目類型是APP&#xff1f;后來…

K8S企業級應用與DaemonSet實戰解析

目錄 一、概述 二、YAML文件詳解 三、企業應用案例 3.1 環境準備 3.2 擴縮容 3.3 滾動更新 3.4 回滾 四、自定義更新策略 4.1類型 4.2 設置方式 4.3 配置案例 一、 DaemonSet 概述 DaemonSet 工作原理 Daemonset 典型的應用場景 DaemonSet 與 Deployment 的區別…

Celery在Django中的應用

Celery在Django中的應用一、項目配置二、異步任務2.1 普通用法2.1.1 通過delay2.1.2 通過apply_async2.2 高級用法2.2.1 任務回調&#xff08;Callback&#xff09;2.2.2 任務鏈&#xff08;Chaining&#xff09;2.2.3 任務組&#xff08;Group&#xff09;2.2.4 任務和弦&…

DeepSeek生成的高精度大數計算器

# 高精度計算器&#xff08;精確顯示版&#xff09;1. **精確顯示優化**&#xff1a;- 新增print_mpfr()函數專門處理MPFR數值的打印- 自動移除多余的尾隨零和小數點- 確保所有浮點結果都以完整十進制形式顯示&#xff0c;不使用科學計數法2. **浮點精度修復**&#xff1a;- 所…

08--深入解析C++ list:高效操作與實現原理

1. list介紹1.1. list概述template < class T, class Alloc allocator<T> > class list;Lists are sequence containers that allow constant time insert and erase operations anywhere within the sequence, and iteration in both directions.概述&#xff1…

GraphQL從入門到精通完整指南

目錄 什么是GraphQLGraphQL核心概念GraphQL Schema定義語言查詢(Queries)變更(Mutations)訂閱(Subscriptions)Schema設計最佳實踐服務端實現客戶端使用高級特性性能優化實戰項目 什么是GraphQL GraphQL是由Facebook開發的一種API查詢語言和運行時。它為API提供了完整且易于理…

使用 Dockerfile 與 Docker Compose 結合+Docker-compose.yml 文件詳解

使用 Dockerfile 與 Docker Compose 結合的完整流程 Dockerfile 用于定義單個容器的構建過程&#xff0c;而 Docker Compose 則用于編排多個容器。以下是結合使用兩者的完整方法&#xff1a; 1. 創建 Dockerfile 在項目目錄中創建 Dockerfile 定義應用鏡像的構建過程&#xff1…

15 ABP Framework 開發工具

ABP Framework 開發工具 概述 該頁面詳細介紹了 ABP Framework 提供的開發工具和命令行界面&#xff08;CLI&#xff09;&#xff0c;用于創建、管理和定制 ABP 項目。ABP CLI 是主要開發工具&#xff0c;支持項目腳手架、模塊添加、數據庫遷移管理及常見開發任務自動化。 ABP …

力扣top100(day02-01)--鏈表01

160. 相交鏈表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {/*** 查找兩個鏈表的相交節點* param headA 第一個…

LLM 中 語音編碼與文本embeding的本質區別

直接使用語音編碼,是什么形式,和文本的區別 直接使用語音編碼的形式 語音編碼是將模擬語音信號轉換為數字信號的技術,其核心是對語音的聲學特征進行數字化表征,直接承載語音的物理聲學信息。其形式可分為以下幾類: 1. 基于波形的編碼(保留原始波形特征) 脈沖編碼調制…

模型選擇與調優

一、模型選擇與調優在機器學習中&#xff0c;模型的選擇和調優是一個重要的步驟&#xff0c;它直接影響到最終模型的性能1、交叉驗證在任何有監督機器學習項目的模型構建階段&#xff0c;我們訓練模型的目的是從標記的示例中學習所有權重和偏差的最佳值如果我們使用相同的標記示…

vue+Django農產品推薦與價格預測系統、雙推薦+機器學習預測+知識圖譜

vueflask農產品推薦與價格預測系統、雙推薦機器學習價格預測知識圖譜文章結尾部分有CSDN官方提供的學長 聯系方式名片 文章結尾部分有CSDN官方提供的學長 聯系方式名片 關注B站&#xff0c;有好處&#xff01;編號: D010 技術架構: vueflaskmysqlneo4j 核心技術&#xff1a; 基…

數據分析小白訓練營:基于python編程語言的Numpy庫介紹(第三方庫)(下篇)

銜接上篇文章&#xff1a;數據分析小白訓練營&#xff1a;基于python編程語言的Numpy庫介紹&#xff08;第三方庫&#xff09;&#xff08;上篇&#xff09;&#xff08;十一&#xff09;數組的組合核心功能&#xff1a;一、生成基數組np.arange().reshape() 基礎運算功能&…

負載因子(Load Factor) :哈希表(Hash Table)中的一個關鍵性能指標

負載因子&#xff08;Load Factor&#xff09; 是哈希表&#xff08;Hash Table&#xff09;中的一個關鍵性能指標&#xff0c;用于衡量哈希表的空間利用率和發生哈希沖突的可能性。一&#xff1a;定義負載因子&#xff08;通常用希臘字母 λ 表示&#xff09;的計算公式為&…

監控插件SkyWalking(一)原理

一、介紹 1、簡介 SkyWalking 是一個 開源的 APM&#xff08;Application Performance Monitoring&#xff0c;應用性能監控&#xff09;和分布式追蹤系統&#xff0c;主要用于監控、追蹤、分析分布式系統中的調用鏈路、性能指標和日志。 它由 Apache 基金會托管&#xff0c;…

【接口自動化測試】---自動化框架pytest

目錄 1、用例運行規則 2、pytest命令參數 3、pytest配置文件 4、前后置 5、斷言 6、參數化---對函數的參數&#xff08;重要&#xff09; 7、fixture 7.1、基本用法 7.2、fixture嵌套&#xff1a; 7.3、請求多個fixture&#xff1a; 7.4、yield fixture 7.5、帶參數…

Flink Stream API 源碼走讀 - socketTextStream

概述 本文深入分析了 Flink 中 socketTextStream() 方法的源碼實現&#xff0c;從用戶API調用到最終返回 DataStream 的完整流程。 核心知識點 1. socketTextStream 方法重載鏈 // 用戶調用入口 env.socketTextStream("hostname", 9999)↓ 補充分隔符參數 env.socket…