教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 互联网资料 >

[精品]基于FPGA的I2C接口程序实现毕业论文(4)

来源:网络收集 时间:2026-09-27
导读: 6、触发IIC总线的状态信号。 采用FPGA模拟IIC总线,由IIC总线规则可以看出,IIC在传输过程中有5个固定的状态,空闲、开始、响应、接收发送、停止。传输的过程也就是状态间进行变换的过程,因此很自然联想到在编程时

6、触发IIC总线的状态信号。

采用FPGA模拟IIC总线,由IIC总线规则可以看出,IIC在传输过程中有5个固定的状态,空闲、开始、响应、接收发送、停止。传输的过程也就是状态间进行变换的过程,因此很自然联想到在编程时使用状态机的方法。同时状态间转换要受到来自微控制器的信号的控制,因此需要采用Mealy型状态机。并串转换器,在这个模块里,通过8 bit计数器来实现。为了对运行状态进行更一步的细分,在本设计中定义了15个状态,下面把各个状态的定义如下解释:

idle IIC总线空闲 en_clk 时钟启动 start1,start2,stop1 开始和停止 dev_add1,dev_add2 传输器件地址 ack1,ack2,ack3,ack4 发送响应 w_add 字地址 wait1 等待 dis_clk1 暂停 data 传输数据

当系统复位时,初始化状态为idle,当复位无效,地址信号为00时,指向字地址寄存器,这时产生一个启动状态机的信号,状态机由空闲状态进入开始状态,当分频器过来的脉冲信号从低向高跳变时,传输开始,同时位计数器也开始启动读总线的动作一定要读完一个字节才结束。那么先传输的是7位器件地址,并产生一个响应位,然后传输8位字地址和数据,如果有中断进入等待或暂停状态,需要重新状态机启动。控制器根据所处状态读写总线器件。主机要读取总线器件上的数据也必须通过状态机来实现,当状态机处于数据状态时,如果这时8位计数器的值为5,那么读出数据的第5位就是当时SDA上的逻辑值。以此类推,其它的同样。 其状态机程序见附录。

简单的流程图如图4.9所示。

图4.9 状态机工作流程图

其生成的RTL级描述图比较庞大,因此就不贴出了。用Quartus II软件生成一个电路模块图如图4.10。

图

4.10 时序控制模块图

4.3.5输出缓冲器

根据IIC总线的传输规范,总线的电气特性为开漏极输出驱动,但是多数的可编程器件不提供开漏极输出特性,为了使SDA,SCL便于移植,均使用了三态驱动模用Quartus II软件生成一个电路模块图如图4.12。

图4.12 输出缓冲模块

4.3.6 顶层文件

顶层文件可以用电路图的输入方式把5个子模块连接起来,也可以通过硬件语言的例化语句来描述,在本设计中主要运用语言描述的方法。

5 IIC总线接口的仿真

5.1 验证流程

IIC总线接口的验证流程如图5.1所示 。

功能仿真修改RTL代码Npass?Y综合后仿真Npass?YPAR后仿真Npass?YFPGA验证Npass?Y 图5.1 IIC总线接口验证流程

在图5.1中,功能仿真就是常说的前仿真,用于检查RTL代码的正确性,综合后仿真用于检查网表是否正确,疏忽大意或代码风格不严谨很容易导致综合出来的网表的功能和预想不一致,综合后仿真能发现这样的问题。PAR后仿真的意思是布局布线,Place and Route,后仿真,也就是常说的后仿真或时序仿真,它可以检查网表和时序的正确性。

结束5.2 整体构思

为了确认IIC总线接口是否能够正确运行,仿真验证时需要建立Testbench(测试环境),IIC总线接口验证的环境的结构如图5.2所示。整个结构设计分为三个部分:第一部分是主设备仿真模块,第二部分是IIC总线接口可仿真综合模块,第三部分是从设备仿真模块。然后用一个测试台程序将三个模块连接起来,并产生激励信号对IIC模块的功能进行仿真测试。

5.3 测试模块搭建

1、micro module: 微处理器部分可以采用ZYE1502D实验箱上有的AT89C51单片机,或者编写Testbench实现。为了仿真方便,在仿真时采用Testbench搭建。该micro模型给出了微处理器与IIC接口通讯的仿真程序。该模型能产生相应的读写信号,地址信号,并行数据信号,并能接收从器件的应答信号,来调节发送或接收数据的速度。在这个程序中,为了保证IIC接口的正确性,可以进行完整的测试,

写操作时输入的地址信号和数据信号的数据由于较少,直接写入程序中。读操作时,将读数对比可以验证程序的正确性。该程序通过调用四个任务实现上述功能,write,monitor_iic_rdy,read_data,kill_time。

2、iic_slave module: 该iic_slave模型提供了一个IIC存储器。该从模型能够侦测起始和终止命令,在地址控制字时序后产生ACK,在数据读之后置IIC总线三态。另外它通过比较“Slave Data Receive on Write”和“Slave Data Transmitted on Read”的信息,实现仿真时数据正确性的检查。

3、clk_rst module:clk_rst模块给测试平台提供时钟和复位信号。编辑clk_period参数更改时钟频率,改变reset_time参数就能改变复位信号的有效时间。

4、iic_tb,iic_tb是测试台的顶层文件。它将IIC接口模型iic和测试程序的模型clk_rst、micro、iic_slave实例化,并连接起来。其主要程序:

i2c

I2C(.data(data),.addr(addr),.rst_l(rst_l),.clock(clock),.cs_l(cs_l),

.ack_l(ack_l),.rd_wr_l(rd_wr_l),.scl_pin(scl_pin),.sda_pin(sda_pin));

clk_rst CLK(.clk(clock),.rst_l(rst_l)); micro

MICRO(.clk(clock),.rst_l(rst_l),.data(data),.addr(addr),.cs_l(cs_l),

.ack_l(ack_l),.rd_wr_l(rd_wr_l)); i2c_slave

SEP(.sda(sda_pin),.scl(scl_pin));

5.4时序仿真

做功能仿真时,在Modelsim中建立工程,把IIC的所有verilog ,scl_tick); 端口列表

input clock;外部系统处理器时钟 input rst_l;外部复位信号,低有效

input scl_cnt_en;来自时序控制器的计数使能信号 output scl_tick;状态机的工作时钟

registers&wires reg scl_tick; reg [7:0] cntr;分频计数值 分频

always@(posedge clock or negedge rst_l) if(!rst_l) cntr<= #1 8'b0; else if(scl_cnt_en) cntr<= #1 8'b0; else cntr<=8'b0;

always@(posedge clock or negedge rst_l) if(!rst_l)

scl_tick<= #1 1'b0; else if(cntr= =8'hFA) cl_tick<= #1 1'b1; else

scl_tick<= #1 1'b0; endmodule

附录2

数据接收模块程序

…… 此处隐藏:1115字,全部文档内容请下载后查看。喜欢就下载吧 ……
[精品]基于FPGA的I2C接口程序实现毕业论文(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/446286.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)