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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…