当前位置: 首页 > article >正文

I2C总线协议实战:从零开始用Verilog实现一个I2C主设备(附完整代码)

I2C总线协议实战从零开始用Verilog实现一个I2C主设备附完整代码在嵌入式系统和FPGA开发中I2C总线因其简单的两线制结构和灵活的多主设备支持成为最常用的串行通信协议之一。本文将带您从零开始用Verilog HDL实现一个完整的I2C主设备控制器涵盖状态机设计、时序精确控制和数据帧处理等核心环节并提供可直接集成到项目中的完整代码。1. I2C协议核心要点解析I2C(Inter-Integrated Circuit)总线由Philips(现NXP)开发仅需两根信号线即可实现多设备通信SCL串行时钟线由主设备驱动SDA串行数据线双向传输协议的关键时序特征包括起始条件SCL为高时SDA从高到低跳变停止条件SCL为高时SDA从低到高跳变数据有效性SDA数据在SCL低电平时变化高电平时稳定典型传输序列如下[起始] → [地址方向] → [ACK] → [数据1] → [ACK] → ... → [数据N] → [NACK] → [停止]2. Verilog状态机设计与实现2.1 状态机架构设计我们采用五状态有限状态机(FSM)实现协议控制parameter IDLE 5b00001; // 空闲状态 parameter START 5b00010; // 起始条件 parameter TXDATA 5b00100; // 数据传输 parameter ACK 5b01000; // 应答检测 parameter STOP 5b10000; // 停止条件状态转移逻辑如下IDLE → START → TXDATA → ACK → (TXDATA/STOP)2.2 时钟生成与同步为简化时序设计我们采用系统时钟分频生成SCLalways (posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) sck 1b1; else if (state START !sck_phase) sck 1b1; else if ((state TXDATA || state ACK) sck_phase) sck ~sck; end这里sck_phase是内部时钟分频信号确保每个SCL周期包含两个系统时钟周期。3. 完整I2C主设备实现代码3.1 顶层模块设计module i2c_master ( input sys_clk, // 系统时钟(50MHz) input sys_rst_n, // 异步复位 input [7:0] dev_addr, // 从设备地址 input [7:0] reg_addr, // 寄存器地址 input [7:0] data_in, // 写入数据 input wr_en, // 写使能 output reg busy, // 忙标志 inout SDA, // 双向数据线 output reg SCL // 时钟线 ); // 状态机变量定义 reg [4:0] state, next_state; // 数据计数器 reg [3:0] bit_cnt; // 数据移位寄存器 reg [7:0] shift_reg; // SDA控制信号 reg sda_out, sda_oe; // 时钟相位控制 reg sck_phase; // 三态SDA控制 assign SDA sda_oe ? sda_out : 1bz; // 主状态机实现... endmodule3.2 状态机核心逻辑always (posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) begin state IDLE; bit_cnt 0; shift_reg 0; sda_out 1b1; sda_oe 1b1; busy 1b0; end else begin state next_state; case (state) IDLE: begin if (wr_en) begin shift_reg {dev_addr[6:0], 1b0}; // 地址写位 busy 1b1; end end START: begin sda_out 1b0; // 产生起始条件 if (sck_phase) begin shift_reg reg_addr; // 加载寄存器地址 end end TXDATA: begin if (sck_phase) begin sda_out shift_reg[7]; shift_reg {shift_reg[6:0], 1b0}; bit_cnt bit_cnt 1; end end ACK: begin sda_oe 1b0; // 释放SDA检测ACK if (sck_phase bit_cnt 8) begin if (bit_cnt 8) begin shift_reg data_in; // 加载写入数据 end end end STOP: begin sda_out 1b1; // 产生停止条件 busy 1b0; end endcase end end4. 关键实现技巧与调试方法4.1 时序精确控制技巧SCL占空比控制通过系统时钟分频确保SCL高低电平时间符合规范数据建立保持时间在SCL低电平期间改变SDA数据起始/停止条件检测使用双边沿检测确保信号完整性4.2 常见问题排查从设备无应答检查设备地址是否正确确认从设备电源和上拉电阻正常用逻辑分析仪捕获实际波形数据采样错误确保SCL频率不超过从设备支持的最大速率检查SDA信号是否受到干扰4.3 测试平台设计module tb_i2c_master; reg clk, rst_n, wr_en; reg [7:0] dev_addr, reg_addr, data_in; wire SDA, SCL; // 实例化被测模块 i2c_master uut ( .sys_clk(clk), .sys_rst_n(rst_n), .dev_addr(dev_addr), .reg_addr(reg_addr), .data_in(data_in), .wr_en(wr_en), .SDA(SDA), .SCL(SCL) ); // 时钟生成 initial begin clk 0; forever #10 clk ~clk; end // 测试序列 initial begin rst_n 0; #100 rst_n 1; dev_addr 8h50; // 假设从设备地址 reg_addr 8h00; data_in 8hAA; #50 wr_en 1; #20 wr_en 0; wait(uut.busy 0); #100 $finish; end endmodule5. 高级功能扩展5.1 多字节传输实现通过扩展状态机可实现连续读写多个字节parameter MULTI_TX 5b100000; // 新增状态 always (*) begin case (state) // ...其他状态... ACK: begin if (multi_mode byte_cnt byte_total-1) begin next_state TXDATA; byte_cnt byte_cnt 1; end else begin next_state STOP; end end endcase end5.2 时钟拉伸处理为支持从设备时钟拉伸需添加SCL检测逻辑wire scl_stretched (SCL 1b0 sck 1b1); always (posedge sys_clk) begin if (scl_stretched) begin sck_hold 1b1; end else if (sck_phase) begin sck_hold 1b0; end end5.3 错误恢复机制添加超时检测和自动重试reg [15:0] timeout_cnt; always (posedge sys_clk) begin if (state ! IDLE) begin timeout_cnt timeout_cnt 1; if (timeout_cnt 16d50000) begin next_state STOP; error_flag 1b1; end end else begin timeout_cnt 0; end end

相关文章:

I2C总线协议实战:从零开始用Verilog实现一个I2C主设备(附完整代码)

I2C总线协议实战:从零开始用Verilog实现一个I2C主设备(附完整代码) 在嵌入式系统和FPGA开发中,I2C总线因其简单的两线制结构和灵活的多主设备支持,成为最常用的串行通信协议之一。本文将带您从零开始,用Ver…...

Pixel Language Portal快速部署:Hunyuan-MT-7B支持ONNX Runtime加速推理

Pixel Language Portal快速部署:Hunyuan-MT-7B支持ONNX Runtime加速推理 1. 项目概述 像素语言跨维传送门(Pixel Language Portal)是一款基于Tencent Hunyuan-MT-7B核心引擎构建的创新翻译工具。与传统翻译软件不同,它将语言转换过程重新设计为一场16-…...

从豆瓣到StyleTalk:手把手教你用真实场景数据微调你的中文对话模型

从豆瓣到StyleTalk:手把手教你用真实场景数据微调你的中文对话模型 当你已经掌握了基座模型微调的基础技能,如何让模型真正理解特定领域的专业术语,或是模仿某种独特的说话风格?本文将带你深入实战,从数据清洗到效果评…...

GPIO输出模式详解:推挽与开漏对比与应用

1. GPIO输出模式基础概念在嵌入式系统开发中,GPIO(General Purpose Input/Output)是最基础也是最常用的外设之一。作为硬件工程师,深入理解GPIO的不同工作模式对于电路设计和程序开发都至关重要。今天我们就来详细剖析GPIO的两种主要输出模式&#xff1a…...

吃透哈希槽:Redis集群核心分片机制,从原理到实战避坑

在分布式Redis集群中,“数据如何均匀分片、节点如何高效协同”是核心难题。上一篇我们详解了一致性哈希,它通过环形结构解决了传统哈希的节点迁移痛点,但在Redis集群的实际落地中,官方并没有采用一致性哈希,而是选择了…...

如何用Python免费下载B站4K大会员视频:bilibili-downloader完整指南

如何用Python免费下载B站4K大会员视频:bilibili-downloader完整指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为…...

Android设备指纹采集指南:从get_token协议看短视频SDK如何生成唯一设备ID

Android设备指纹生成机制深度解析:从基础原理到合规实践 在移动应用生态中,设备指纹技术扮演着至关重要的角色。它不仅关系到用户体验的连贯性,更是风控系统的基础支撑。本文将系统性地剖析Android平台下设备指纹的生成逻辑、技术实现方案以及…...

SQL Server服务启动失败?手把手教你用Local System账户解决SQLEXPRESS报错126

SQL Server服务启动失败?手把手教你用Local System账户解决SQLEXPRESS报错126 当你正准备开始一天的工作,突然发现SQL Server服务无法启动,屏幕上赫然显示着错误代码126,这种突如其来的技术故障往往让人措手不及。作为数据库管理员…...

雪花算法替代MurmurHash后的提升(短链接项目中的唯一性设计)

短链接服务的核心功能,是将一个长网址(比如几百个字符的 URL)转换成一个短码,用户访问短码时,服务端会将其重定向回原始的长链接。 考虑到快速生成(防止高并发下,性能变差)和长变短的…...

GEC6818嵌入式Linux智能车库系统开发实战

1. 项目概述这个基于GEC6818嵌入式Linux的智能车库系统,是我去年为一个商业停车场改造项目开发的解决方案。当时客户的主要痛点在于传统人工管理效率低下,经常出现收费纠纷和停车位利用率不高的问题。经过三个月的开发和调试,最终实现了这套集…...

抖音视频批量下载高效解决方案实战指南

抖音视频批量下载高效解决方案实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具&…...

快速原型构建遇阻?用快马AI一键绕过npm error 128,聚焦核心功能验证

最近在尝试用Node.js快速验证一个Web服务原型时,遇到了烦人的npm error code 128问题。这个错误通常和Git仓库权限相关,会直接卡住依赖安装流程。经过一番折腾,我总结出一套在InsCode(快马)平台快速绕开这个坑的实践方案,分享给同…...

音乐版权侵权避坑指南:明星翻唱踩的红线,这些行为也在踩

短视频/直播/门店公播全场景合规方案 正版商用音乐授权平台推荐央广网北京3月30日消息(记者费权)近日,歌手单依纯在深圳演唱会上未经授权演唱李荣浩原创作品《李白》,而此前李荣浩方已明确婉拒其版权授权申请,中国音乐…...

ADNS3080光学传感器驱动开发与聚焦校准实战

1. ADNS3080光学运动传感器底层驱动技术解析ADNS3080是Avago(现Broadcom)推出的一款高精度、低功耗CMOS光学运动传感器,专为机械鼠标、轨迹球及工业位移检测等场景设计。其核心优势在于集成化程度高——片内集成了LED驱动电路、图像采集阵列&…...

避开这3个坑!Cortex-M3/M4使用DWT计数器时的常见错误与解决方法

Cortex-M3/M4开发实战:DWT计数器避坑指南与高阶应用技巧 在嵌入式系统开发中,精确的时间测量往往是性能优化和调试的关键。Cortex-M3/M4内核内置的DWT(Data Watchpoint and Trace)组件,特别是其CYCCNT计数器,为开发者提供了一个零…...

救命!电路板维修高频故障排查口诀,背会秒上手,修板快准稳

修板半天没头绪?工控伺服板一修就慌?测遍元件还烧板?其实电路板故障排查不用死磕,一套好记的速记口诀,能帮你少走弯路、少赔成本,新手能快速上手,老手直接拉高效率,刷到这篇干货&…...

Z-Image Atelier 跨平台部署:应对不同操作系统的环境配置要点

Z-Image Atelier 跨平台部署:应对不同操作系统的环境配置要点 最近在帮几个朋友部署Z-Image Atelier这个挺有意思的AI图像工具,发现大家用的系统五花八门,有Windows、有Ubuntu,还有用Mac的。结果就是,照着同一个教程走…...

Linux内核container_of宏解析与应用

1. 理解container_of宏的核心作用在Linux内核开发中,container_of宏是一个极其重要且频繁使用的工具。它的核心功能是通过结构体成员的地址反推出整个结构体的起始地址。想象一下,你手里只有一张照片的某个局部,却能准确找到这张照片在相册中…...

【NX二次开发】cam对象类型

//此函数的功能是打印当前坐标系试图的所有坐标系名称 static void geom_list_name(tag_t group_tag) { //ask_member_list int count=0; tag_t *list=NULL; //ask_name char name[UF_OBJ_NAME_LEN+1]; //ask_type_and_subtype int type=0; in…...

提升物业服务满意度的物业管理小程序

一、首页核心服务入口基础功能模块:物业缴费、我的房产、通知公告、投诉建议、维修申报、小区活动、家政服务、优惠好物,覆盖业主日常高频需求信息与活动展示:顶部搜索栏:支持关键词检索,快速定位所需服务物业公告&…...

消费增值生态:从规则设计到商业价值实现

还在为用户复购低、留存弱、平台难长效而困扰?当多数商家还困在传统经营思路里止步不前,一套依托真实消费、贴合政策导向的增值生态已然崛起。它以合规为底、以价值为核、以闭环为骨架,正在重新定义平台与商家的增长逻辑,成为数字…...

音频驱动面部动画:Audio2Face技术原理与实践指南

音频驱动面部动画:Audio2Face技术原理与实践指南 【免费下载链接】FACEGOOD-Audio2Face http://www.facegood.cc 项目地址: https://gitcode.com/gh_mirrors/fa/FACEGOOD-Audio2Face 在虚拟人技术快速发展的今天,面部动画的自然度成为提升用户体验…...

Vivado 时序约束文件 (.xdc) 管理与维护实战指南:从单文件到团队协作

Vivado 时序约束文件 (.xdc) 管理与维护实战指南:从单文件到团队协作 在FPGA设计流程中,时序约束文件(.xdc)如同交通信号灯,为设计指明方向与规则。随着项目规模扩大和团队协作需求增加,如何高效管理这些约…...

CYBER-VISION零号协议互联网舆情智能监测与分析系统

CYBER-VISION零号协议:构建你的互联网舆情智能监测雷达 最近和几个做市场、公关的朋友聊天,他们都在抱怨同一个问题:每天花大量时间刷新闻、看社交媒体,就为了捕捉行业动态和用户反馈,生怕错过什么重要信息。人工监测…...

SEO_避开这些SEO误区,优化效果事半功倍

SEO误区:避开这些误区,优化效果事半功倍 在当今竞争激烈的互联网环境中,搜索引擎优化(SEO)成为了每一个网站主的必修课。不少人在SEO实践中却犯下了一些常见的误区,这些误区不仅没有提升网站的排名&#x…...

seo白帽优化会不会被搜索引擎识别和惩罚_网站使用seo白帽优化会有什么风险

SEO白帽优化会不会被搜索引擎识别和惩罚 在当今互联网时代,网站的流量和排名直接关系到企业的市场竞争力。作为提升网站排名的重要手段,SEO优化被广泛应用。其中,SEO白帽优化是最为推崇的一种方法。SEO白帽优化会不会被搜索引擎识别和惩罚呢…...

Qwen3-4B-Thinking开源镜像教程:Chainlit前端对接企业微信机器人

Qwen3-4B-Thinking开源镜像教程:Chainlit前端对接企业微信机器人 1. 引言:当大模型遇到企业级应用 想象一下这个场景:你刚部署好一个强大的AI模型,它能帮你写代码、分析问题、生成文档。但每次使用,你都得打开一个特…...

高数值孔径物镜焦斑分析

背景介绍在显微成像、激光加工、光存储与单分子探测等应用中,高数值孔径物镜承担着“把光压缩到极小空间”的关键任务。物镜聚焦后的焦斑尺寸、形状、能量分布以及偏振特性,直接决定系统的分辨率、加工精度和探测灵敏度。因此,如何准确分析高…...

Python内存监控体系搭建:Prometheus+Custom Metrics+内存火焰图,实现OOM前15分钟精准预警

第一章:Python智能体内存管理策略 Python智能体(如基于LLM的Agent、ReAct架构或Tool-Calling Agent)在运行过程中频繁创建临时对象、缓存推理上下文、序列化工具调用结果,导致内存压力显著高于常规脚本。其内存管理需兼顾GC效率、…...

路由器、交换机、光猫有什么区别?网络设备基础入门

路由器、交换机、光猫有什么区别?网络设备基础入门前言一、光猫、路由器、交换机分别是干什么的二、三者最核心的区别到底是什么1.它是否直接面对运营商网络?2.它是否负责“让多台设备上网”?3.它是否主要用于扩展有线接口?三、先…...