0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Modelsim仿真I2C控制器

友晶FPGA 来源:友晶FPGA 2026-01-10 14:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

ModelSim是Model Technology(Mentor Graphics的子公司)的HDL硬件描述语言的仿真软件。该软件可以用来实现对设计的VHDL、Verilog HDL 或是两种语言混合的程序进行仿真。这里的仿真是对设计进行功能仿真(也称之为前仿真),其目的是验证电路功能是否符合设计要求。

本篇主要是对I2C_Controller模块进行功能仿真。test_bench的核心是模拟FPGA给出数据24'h729803,同时也模拟I2C外设来接收该数据并给出应答反馈。

505e9206-eb67-11f0-92de-92fbcf53809c.png



1. 首先用Quartus打开HDMI_block_move工程(HDMI_block_move工程下载链接:https://pan.baidu.com/s/1XxFFj-3UTfB_Er-yz0f_Cg提取码: tera),然后在该工程路径下新建一个Verilog test bench仿真文件。右击File——New, 选择Verilog HDL File,然后点击OK:

50c61ad4-eb67-11f0-92de-92fbcf53809c.png

2. 将下面代码拷贝到新建的.v文件当中:

`timescale 1ns/1ps


module tb_I2C_Controller();
 // 输出信号定义
 regCLOCK;
 reg [23:0]I2C_DATA;
 regGO;
 regRESET;


// 双向信号定义(I2C_SDAT需要上拉电阻模拟总线特性)
 wireI2C_SDAT;
 reg sdat_drive; // 用于模拟从机应答的驱动信号


// 输入信号定义
 wireI2C_SCLK;
 wireEND;
 wireACK;


// 上拉电阻模拟(I2C总线默认高电平)
 assignI2C_SDAT=sdat_drive?1'bz :1'b0;


// 例化被测试模块
I2C_Controlleruut (
 .CLOCK(CLOCK),
 .I2C_DATA(I2C_DATA),
 .GO(GO),
 .RESET(RESET),
 .I2C_SDAT(I2C_SDAT),
 .I2C_SCLK(I2C_SCLK),
 .END(END),
 .ACK(ACK)
);


reg [7:0] cnt_I2Cclk;  
// 时钟生成(100MHz,周期10ns)
initial begin
CLOCK=0;
 forever #5CLOCK=~CLOCK;
end


// 主仿真过程
initial begin
// 初始化信号
I2C_DATA=24'h729803; // 待写入的目标数据
GO=0;
RESET=0;
 sdat_drive=1; // 初始释放总线(上拉为高)


// 复位过程
 #20RESET=1; // 20ns后释放复位


// 等待模块进入空闲状态
 #50;


// 启动I2C写入过程
GO=1;
 #10GO=0;   // 提供一个时钟周期的GO脉冲
 cnt_I2Cclk=0;   
// 模拟从机应答(在每个字节传输的第9个时钟周期拉低SDA)
// 监控时钟线,在需要应答时拉低SDA
 forever @(negedgeI2C_SCLK) begin
  cnt_I2Cclk<= cnt_I2Cclk +1 ;
    if (cnt_I2Cclk == 29) begin
      $stop;
    end
    if (uut.CNT == 8) begin  // 第9位传输时
      sdat_drive = 0;  // 产生应答信号(低电平)
    end 
    else begin
      sdat_drive = 1;  // 其他时间释放总线
    end
  end        
end
endmodule


3. 点击Save按钮,将文件保存为tb_I2C_Controller.v。
4. 安装Quartus软件的时候也记得安装Modelsim 工具(这些安装步骤在后期文章里面会发布),接下来要将Modelsim 的安装路径设置一下就才可以在仿真时自动调用指定的仿真工具。首先是在Tools菜单下面找到Options:

513c3e44-eb67-11f0-92de-92fbcf53809c.png

5. 在弹出的对话框中选择EDA Tool Options ,点击...指定软件路径: D:intelFPGA_lite17.1modelsim_asewin32aloem:

51982fba-eb67-11f0-92de-92fbcf53809c.png

6. 接下来设置仿真文件路径。点击Assignments——Settings:

51f5e86c-eb67-11f0-92de-92fbcf53809c.png

7. 点击 Simulation,仿真工具选择ModelSim-Altera, 然后点选Compile test bench圆圈,点击Test Benches...

5279a6fc-eb67-11f0-92de-92fbcf53809c.png

8. 点击New...

52d8e554-eb67-11f0-92de-92fbcf53809c.png

9. 然后填写Test bench name 名称为tb_I2C_Controller,接着点击File name处对应的...按钮:

533111a2-eb67-11f0-92de-92fbcf53809c.png

10. 选择tb_I2C_Controller.v文件,然后点击Open:

539dd300-eb67-11f0-92de-92fbcf53809c.png


11. 接着点击Add将仿真文件添加到Test Bench,依次点击OK、OK、Apply和 OK退出窗口:

53f9e064-eb67-11f0-92de-92fbcf53809c.png

54574bf0-eb67-11f0-92de-92fbcf53809c.png

54c91c9e-eb67-11f0-92de-92fbcf53809c.png

12. 在仿真之前要先点击Start Analysis&Synthesis按钮进行分析和综合:

5524db42-eb67-11f0-92de-92fbcf53809c.png

13. 再点击Tools——Run Simulation Tool_RTL Simulation进行仿真:

5586c80c-eb67-11f0-92de-92fbcf53809c.png

14. 点击Zoom Full按钮将显示全部波形。

55f96fce-eb67-11f0-92de-92fbcf53809c.png

15. 最后波形生成如下:

5655eeac-eb67-11f0-92de-92fbcf53809c.png

通过波形可以看到,用于触发I2C写操作的GO信号拉高一个时钟周期后,I2C开始写数据的操作。现在要写的数据是24'h729803,二进制是0111_0010_1001_1000_0000_0011, 将波形放大分三段截图将看到如下内容:

56b4aabe-eb67-11f0-92de-92fbcf53809c.png

571e36b4-eb67-11f0-92de-92fbcf53809c.png

5779bc64-eb67-11f0-92de-92fbcf53809c.png

数据发送的状态循环是ST=2 → ST=3 → ST=4 → ST=5 → ST=2,这个循环发送1位数据,共循环9次(8位数据+ACK),第9位(1'b1)是确保在第9个时钟周期主机释放SDA总线。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1664

    文章

    22504

    浏览量

    639350
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1563

    浏览量

    131752
  • ModelSim
    +关注

    关注

    5

    文章

    175

    浏览量

    49481
  • 仿真软件
    +关注

    关注

    21

    文章

    287

    浏览量

    31992

原文标题:6-DE10-Nano的HDMI方块移动案例——使用Modelsim仿真I2C控制器

文章出处:【微信号:友晶FPGA,微信公众号:友晶FPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于FPGA的I2C控制模块设计

    I2C_WRITE_WDATA.v模块实现I2C写时序,I2C_Controller (I2C控制器)例化了
    的头像 发表于 12-26 09:48 6052次阅读
    基于FPGA的<b class='flag-5'>I2C</b><b class='flag-5'>控制</b>模块设计

    基于FPGA的I2C SLAVE模式总线的设计方案

    。经过实际应用,证实了本方案操作简便,实用性强。##I2C SLAVE 控制器的接口部分主要包括,信号异步时钟域的转换。输入滤波,用来抑制毛刺。及SDA 线的双向转换。
    发表于 02-26 11:39 2.1w次阅读

    新手求助,I2C总线从机的应答信号不能用modelsim仿真出?

    关于I2C总线,I2C总线从机的应答信号是不是不能用modelsim直接仿真出哦?所谓从机将SDA拉低的应答信号,是不是要在实际的电路里才有,要么就用软件编程模拟从机?反正我直接用编
    发表于 04-15 13:04

    实现I2C总线控制器的VHDL源代码

    I2C总线控制器 altera提供 The I2C Controller was designed for the MC68307 uC, provides a simplified
    发表于 05-20 10:25 251次下载

    LM3S系列微控制器I2C应用文档

    LM3S系列微控制器I2C应用文档基于LM5749的I2C从机功能,模拟24C02传输协议操作。
    发表于 04-03 14:29 52次下载

    基于Verilog的I2C控制器的设计与综合

    为满足嵌入式系统中专用芯片功能不能达到系统要求的现状,设计出一种功能可扩展的I2C slave控制器,这种控制器与传统的专用I2C芯片不同。专用的I
    发表于 10-25 16:58 60次下载
    基于Verilog的<b class='flag-5'>I2C</b><b class='flag-5'>控制器</b>的设计与综合

    I2C总线控制器的工作原理及EEPROM的Linux驱动程序的设计

    I2C (Inter-Integrated Circuit1总线是一种由Philips公司开发的2线式串行总线,用于连接微控制器及其外围设备。它是同步通信的一种特殊形式,具有接口线少、控制
    发表于 10-26 15:37 7次下载
    <b class='flag-5'>I2C</b>总线<b class='flag-5'>控制器</b>的工作原理及EEPROM的Linux驱动程序的设计

    使用FPGA实现I2C总线主机控制器的应用实例资料免费下载

    I2C总线协议的串行数据,实现I2C主机控制器功能。同时,应用MaxPlus软件对设计进行时序仿真,分析设计可行性与存在的不足,该设计能够满足预定目标,拓展FPGA应用。
    发表于 08-19 08:00 3次下载
    使用FPGA实现<b class='flag-5'>I2C</b>总线主机<b class='flag-5'>控制器</b>的应用实例资料免费下载

    Firefly-RK3128主板I2C控制器

    Firefly-RK3128 开发板上有 4 个片上 I2C 控制器。本文主要描述如何在该开发板上配置 I2C
    的头像 发表于 11-29 08:47 2314次阅读
    Firefly-RK3128主板<b class='flag-5'>I2C</b><b class='flag-5'>控制器</b>

    fireflyFace-RK3399主板I2C控制器介绍

    Face-RK3399 开发板上有 9 个片上 I2C 控制器
    的头像 发表于 12-04 09:17 3881次阅读
    fireflyFace-RK3399主板<b class='flag-5'>I2C</b><b class='flag-5'>控制器</b>介绍

    浅谈PCA9564 I2C 总线控制器评估板

    PCA9564 I2C 总线控制器连接在 P89LV51RD2I2C 总线之间。 飞利浦 PCA9531 I2C 8 位 LED 调
    的头像 发表于 06-17 17:26 4651次阅读
    浅谈PCA9564 <b class='flag-5'>I2C</b> 总线<b class='flag-5'>控制器</b>评估板

    i2c总线用来做什么_i2c总线数据传输过程

    I2C总线控制器为微控制器或微处理提供控制I2C总线的接口,它
    发表于 11-24 14:16 9094次阅读

    硬件I2C与模拟I2C

    配置;而软件I2C是没有寄存这个概念的。 软件I2C一般是使用GPIO管脚,用软件控制SCL,SDA线输出高低电平,模拟i2c协议的时序
    发表于 12-28 19:14 83次下载
    硬件<b class='flag-5'>I2C</b>与模拟<b class='flag-5'>I2C</b>

    Linux I2C驱动入门知识科普

    I2C 总线驱动, I2C总线驱动就是SOC的 I2C控制器驱动,也叫做 I2C适配器驱动。
    的头像 发表于 12-29 13:59 2850次阅读

    I2C控制器驱动介绍

    控制器驱动 I2C 总线驱动重点是 I2C 适配器驱动,这里要用到两个重要的数据结构:i2c_adapter 和 i2c_algorithm
    的头像 发表于 07-22 15:38 3393次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>控制器</b>驱动介绍