深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第三篇:Verilog实现I2C Master核

news2025/6/9 20:38:46

第三篇:Verilog实现I2C Master核

副标题 :从零构建工业级I2C控制器——代码逐行解析与仿真实战


1. 架构设计

1.1 模块分层设计

  • 三层架构
层级功能描述关键信号
PHY层物理信号驱动与采样sda_oe, scl_oe
控制层协议状态机与数据流控制state, fifo_ctrl
接口层AXI-Lite/APB寄存器配置接口reg_addr, reg_wdata
  • 模块互联图
    在这里插入图片描述

1.2 可配置参数设计

  • 用户可调参数
    verilog
  parameter CLK_FREQ   = 100_000_000;  // 输入时钟频率  
  parameter I2C_FREQ   = 400_000;      // I2C目标速率  
  parameter ADDR_MODE  = 7'b10;        // 7位/10位地址模式  
  parameter FIFO_DEPTH = 16;           // FIFO深度  
  • 动态配置接口
    verilog
  // 时钟分频系数实时计算  
  localparam DIVIDER = (CLK_FREQ/(5*I2C_FREQ)) - 1;  

2. 关键代码解析

2.1 状态机核心逻辑

  • 状态转移图

    9大状态IDLE, START, ADDR, ACK1, DATA, ACK2, STOP, ERROR, WAIT
    Verilog状态机代码

  always @(posedge clk) begin  
    case(state)  
      IDLE:  
        if (start) begin  
          state <= START;  
          sda_dir <= 1'b1;  // 主机控制SDA  
        end  
      START:  
        if (scl_high) begin  
          sda_out <= 1'b0;  
          state <= ADDR;  
        end  
      ADDR:  
        if (bit_cnt == (ADDR_MODE[0] ? 10:7)) begin  
          sda_dir <= 1'b0;  // 释放SDA  
          state <= ACK1;  
        end  
      // ...其他状态转移逻辑  
    endcase  
  end  

2.2 SDA双向端口控制

  • 三态驱动实现
    verilog
  assign sda = (sda_dir) ? sda_out : 1'bz;  
  assign sda_in = sda;  // 输入采样  
  • 亚稳态防护
    verilog
  always @(posedge clk) begin  
    sda_sync <= {sda_sync[0], sda_in};  // 双寄存器同步  
  end  

2.3 SCL时钟生成器

  • 占空比调节逻辑
    verilog
  reg [15:0] clk_cnt;  
  always @(posedge clk) begin  
    if (clk_cnt == DIVIDER) begin  
      scl <= ~scl;  
      clk_cnt <= 0;  
    end else begin  
      clk_cnt <= clk_cnt + 1;  
    end  
  end  

3. 仿真验证方案

3.1 自动化测试平台

  • 测试用例矩阵
测试场景覆盖点预期结果
单字节写正常ACK状态机返回IDLE
多字节读时钟拉伸处理数据无误
地址无应答NACK处理触发ERROR状态
总线竞争仲裁丢失恢复自动重传
  • 自动化断言示例
    verilog
  assert property (  
    @(posedge clk)  
    (state == ACK1) |-> ##[1:5] $fell(sda_in)  
  ) else $error("ACK未收到!");  

3.2 覆盖率分析

  • 覆盖率目标
覆盖率类型目标值实际达成
行覆盖率100%98.7%
状态机覆盖率100%100%
条件覆盖率95%92.3%
  • 未覆盖代码分析
  1. 超高速模式(5MHz)下的时序路径  
  2. 从机主动发起传输的异常处理  

4. 实战案例:AT24C04 EEPROM读写

4.1 写操作波形分析

  • 写时序图
    在这里插入图片描述

  • 关键阶段:

    1. START + 设备地址(0xA0)
    2. 字地址(0x12)
    3. 数据字节(0x55)
    4. STOP

4.2 读操作代码实现

verilog

task read_eeprom;  
  input [7:0] addr;  
  output [7:0] data;  
  begin  
    // 发送写命令设置地址  
    i2c_start();  
    i2c_send_byte(8'hA0);  
    i2c_send_byte(addr);  
    i2c_stop();  

    // 发送读命令  
    i2c_start();  
    i2c_send_byte(8'hA1);  
    data = i2c_recv_byte();  
    i2c_nack();  
    i2c_stop();  
  end  
endtask  

4.3 实测性能数据

操作类型理论耗时(400kHz)实测耗时误差
单字节写2.7ms2.81ms+4.1%
页写入(16B)4.1ms4.25ms+3.7%
随机读3.2ms3.28ms+2.5%

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2386225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM笔记-嵌入式系统基础

第一章 嵌入式系统基础 1.1嵌入式系统简介 1.1.1嵌入式系统定义 嵌入式系统定义&#xff1a; 嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可剪裁&#xff0c;对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统 ------Any devic…

upload-labs通关笔记-第19关文件上传之条件竞争

系列目录 upload-labs通关笔记-第1关 文件上传之前端绕过&#xff08;3种渗透方法&#xff09; upload-labs通关笔记-第2关 文件上传之MIME绕过-CSDN博客 upload-labs通关笔记-第3关 文件上传之黑名单绕过-CSDN博客 upload-labs通关笔记-第4关 文件上传之.htacess绕过-CSDN…

第5章:任务间通信机制(IPC)全解析

💬 在多线程开发中,线程之间如何协作?如何让一个线程产生数据,另一个线程消费数据?本章聚焦 Zephyr 提供的多种任务间通信机制(IPC)及实战使用技巧。 📚 本章导读 你将学到: Zephyr 提供的常用 IPC 接口:FIFO、消息队列、邮箱、信号量 每种机制适用场景和用法对比…

CAPL自动化-诊断Demo工程

文章目录 前言一、诊断控制面板二、诊断定义三、发送诊断通过类.方法的方式req.SetParameterdiagSetParameter四、SendRequestAndWaitForResponse前言 本文将介绍CANoe的诊断自动化测试,工程可以从CANoe的 Sample Configruration 界面打开,也可以参考下面的路径中打开(以实…

SVN被锁定解决svn is already locked

今天遇到一个问题&#xff0c;svn 在提交代码的时候出现了svn is already locked&#xff0c;解决方案

【深度学习】1. 感知器,MLP, 梯度下降,激活函数,反向传播,链式法则

一、感知机 对于分类问题&#xff0c;我们设定一个映射&#xff0c;将x通过函数f(x)映射到y 1. 感知机的基本结构 感知机&#xff08;Perceptron&#xff09;是最早期的神经网络模型&#xff0c;由 Rosenblatt 在 1958 年提出&#xff0c;是现代神经网络和深度学习模型的雏形…

云原生安全:网络协议TCP详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 &#xff08;注&#xff1a;文末附可视化流程图与专有名词说明表&#xff09; 1. 基础概念 TCP&#xff08;Transmission Control Protocol&#xff09;是…

使用CentOS部署本地DeekSeek

一、查看服务器的操作系统版本 cat /etc/centos-release二、下载并安装ollama 1、ollama下载地址&#xff1a; Releases ollama/ollama GitHubGet up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 3, Mistral Small 3.1 and other large language models. - Re…

LLMs之Qwen:《Qwen3 Technical Report》翻译与解读

LLMs之Qwen&#xff1a;《Qwen3 Technical Report》翻译与解读 导读&#xff1a;Qwen3是Qwen系列最新的大型语言模型&#xff0c;它通过集成思考和非思考模式、引入思考调度机制、扩展多语言支持以及采用强到弱的知识等创新技术&#xff0c;在性能、效率和多语言能力方面都取得…

从工程实践角度分析H.264与H.265的技术差异

作为音视频从业者&#xff0c;我们时刻关注着视频编解码技术的最新发展。RTMP推流、轻量级RTSP服务、RTMP播放、RTSP播放等模块是大牛直播SDK的核心功能&#xff0c;在这些模块的实现过程中&#xff0c;H.264和H.265两种视频编码格式的应用实践差异是我们技术团队不断深入思考的…

如何设计一个高性能的短链设计

1.什么是短链 短链接&#xff08;Short URL&#xff09; 是通过算法将长 URL 压缩成简短字符串的技术方案。例如将 https://flowus.cn/veal/share/3306b991-e1e3-4c92-9105-95abf086ae4e 缩短为 https://sourl.cn/aY95qu&#xff0c;用户点击短链时会自动重定向到原始长链接。其…

提升工作效率的可视化笔记应用程序

StickyNotes桌面便签软件介绍 StickyNotes是一款极为简洁的桌面便签应用程序&#xff0c;让您能够快速记录想法、待办事项或其他重要信息。这款工具操作极其直观&#xff0c;只需输入文字内容&#xff0c;选择合适的字体大小和颜色&#xff0c;然后点击添加按钮即可创建个性化…

11|省下钱买显卡,如何利用开源模型节约成本?

不知道课程上到这里&#xff0c;你账户里免费的5美元的额度还剩下多少了&#xff1f;如果你尝试着完成我给的几个数据集里的思考题&#xff0c;相信这个额度应该是不太够用的。而ChatCompletion的接口&#xff0c;又需要传入大量的上下文信息&#xff0c;实际消耗的Token数量其…

机器学习圣经PRML作者Bishop20年后新作中文版出版!

机器学习圣经PRML作者Bishop20年后新书《深度学习&#xff1a;基础与概念》出版。作者克里斯托弗M. 毕晓普&#xff08;Christopher M. Bishop&#xff09;微软公司技术研究员、微软研究 院 科学智 能 中 心&#xff08;Microsoft Research AI4Science&#xff09;负责人。剑桥…

吴恩达机器学习笔记:逻辑回归3

3.判定边界 现在说下决策边界(decision boundary)的概念。这个概念能更好地帮助我们理解逻辑回归的假设函数在计算什么。 在逻辑回归中&#xff0c;我们预测&#xff1a; 当ℎθ (x) > 0.5时&#xff0c;预测 y 1。 当ℎθ (x) < 0.5时&#xff0c;预测 y 0 。 根据…

docker中使用openresty

1.为什么要使用openresty 我这边是因为要使用1Panel&#xff0c;第一个最大的原因&#xff0c;就是图方便&#xff0c;比较可以一键安装。但以前一直都是直接安装nginx。所以需要一个过度。 2.如何查看openResty使用了nginx哪个版本 /usr/local/openresty/nginx/sbin/nginx …

Java 中的 super 关键字

个人总结&#xff1a; 1.子类构造方法中没有显式使用super&#xff0c;Java 也会默认调用父类的无参构造方法 2.当父类中没有无参构造方法&#xff0c;只有有参构造方法时&#xff0c;子类构造方法就必须显式地使用super来调用父类的有参构造方法。 3.如果父类没有定义任何构造…

PCM音频数据的编解码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a…

Ubuntu 通过指令远程命令行配置WiFi连接

前提设备已经安装了无线网卡。 1、先通过命令行 ssh 登录机器。 2、搜索wifi设备&#xff0c;指令如下&#xff1a; sudo nmcli device wifi 3、输入需要联接的 wifi 名称和对应的wifi密码&#xff0c;指令如下&#xff1a; sudo nmcli device wifi connect wifi名称 passw…

8天Python从入门到精通【itheima】-41~44

目录 41节-while循环的嵌套应用 1.学习目标 2.while循环的伪代码和生活情境中的应用 3.图片应用的代码案例 4.代码实例【Patrick自己亲手写的】&#xff1a; 5.whlie嵌套循环的注意点 6.小节总结 42节-while循环的嵌套案例-九九乘法表 1.补充知识-print的不换行 2.补充…