信息与通信]带有源代码基于fpga的模拟i2c接口设计与实现内容摘要:

y t e_R eadPage_W rit ePage_R eadsclac k f lag[ 2. . 0]out dat a[ 7. . 0]s daI I C _I nt erf ac e_Busins tn1 100000 S i g n e d In t e g e rP a r a m e t e r V a l u e T y p ec lkres et _nda t ain [ 7. . 0]ac k f lag [ 2. . 0]s eg _d at a[ 7. . 0]s eg _c om [ 3. . 0]Led_Seg_D is playins t 4VCCk e y _ w i d 4 S i g n e d In t e g e rn2 500000 S i g n e d In t e g e rP a r a m e t e r V a l u e T y p ec lkrs t _nk ey _in[ k ey _w id1. . 0]k ey _out [ k ey _w id1. . 0]Sy n_SignKey F ilt er_C hec kins t 7k ey v alue[ 0]k ey v alue[ 1]k ey v alue[ 2]k ey v alue[ 3]k ey v alue[ 3. . 0] 图 13 硬件模块总体电路图 2. 2 IIC 模块 的 verilog HDL 代码设计 本 IIC 模块 的 软件设计是基于 QuartusII9. 0 建立 Division_1_500HZ ,IIC_Interface_Bus , KeyFilter_Check , Led_Seg_Display 等 Verilog HDL 文件。 由于 IIC 总线传输协议可知 , IIC 在传输过程中存在着几个固定的状态 ,因此我们采用同步状态机来设计 IIC 模块。 主状态机 从的大的方面 共有 5个状态 :空闲 (Idle) , 开始 (Start) , 发送数据 (Tx), 接收数据 (Rx), 停止 (Stop)。 但是具体细分后 的状态有 17 个,它们的具体功能 及地址分别 如下。 IDLE: 1739。 b0_0000_0000_0000_0001。 // IIC 总 线处在空闲状态 START1: 1739。 b0_0000_0000_0000_0010。 //当 scl 信号为高电平 , sdl 由高电平 13 到低电平变化 时开始运作 IIC 模块 , 且根据 (r/ w)判断进入下一状态 ADD1: 1739。 b0_0000_0000_0000_0100。 //写入器件地址 ACK1: 1739。 b0_0000_0000_0000_1000。 // 写入器件地址 后的 应答 ADD2: 1739。 b0_0000_0000_0001_0000。 //写入字节地址 ACK2: 1739。 b0_0000_0000_0010_0000。 // 写入字节地址 后的 应答 START2: 1739。 b0_0000_0000_0100_0000。 //读操作开始前的起始信号 ADD3: 1739。 b0_0000_0000_1000_0000。 //写入器件地址 ACK3: 1739。 b0_0000_0001_0000_0000。 //应答 状态 ACKR: 1739。 b1_0000_0000_0000_0000。 //fpga 给应答 状态 DATA: 1739。 b0_0000_0010_0000_0000。 //字节读写 状态 PAGER: 1739。 b0_0000_0100_0000_0000。 //页读 状态状态 PAGEW: 1739。 b0_0000_1000_0000_0000。 //页写 状态 ACK4: 1739。 b0_0001_0000_0000_0000。 //应答 状态 HIGH: 1739。 b0_0010_0000_0000_0000。 //高电平 状态 STOP1: 1739。 b0_0100_0000_0000_0000。 //停止位 状态 ( 当数据传输完毕 , 跳入STOP1 状态。 ) STOP2: 1739。 b0_1000_0000_0000_0000。 //延时同步 由上面的 17 个 状态 组成的状态 转移图如图 14 所示。 14 图 14 IIC 模块主状态机状态转移图 3 IIC 接口 模块的 功能 实物 测试 (基 于 EP2C20Q240C8) 根据 IIC 协议中传输过程的特点, IIC 模块可以划分为字节发送模块、字节接收模块、开始条件模块、停止条件模块。 其中,字节发送模块、字节接收模块和停止条件模块为基本模块。 在 开始条件模块中,因为需要发送从器件地址,所以要调用字节发送模块。 下面给出用 Verilog HDL 语言实现字节发送模块的关键程序。 相关变量的声明在此略去。 程序 在 环境 下编译、调试、仿真。 然 后将生成的 .sof文件下载到 EP2C20Q240C8 目标板上进行实物测试,得到如下的测试图。 IDLE START1 ADD1 ACK1 ADD2 ACK2 START21 DLE ADD3 ACK3 ACKR DATA HIGH PAGEW PAGER STOP2 STOP1 ACK4 15 图 15 写一个 字节为十进制 78 的 字节 操作 图 16 连续写 2 个字节 (十进制 2 32)的页操作 16 4 IIC 接口 模块 设计的改进 由于 24C01/02/04/08/16 器件可以不考虑应答位, 所以本次设计中没有设定应答接口,因此没有进行仿真测试,所编写的 IIC 接口模块的 Verilog HDL 代码是可综合的,仅仅是将此代码直接下载到 altera 公司 EP2C20Q240C8 器件 中后,进行 了 实物模拟 IIC 总线接 口功能 ,基本实现项目要求。 为此我们将 IIC 模块 设计进行改进, 可以 达到 直观地利用时序图来观察 IIC总线接口协议 的目的 , 可以观察本设计是否满足 IIC 总线接口功能。 具体的操作是:可以 实例化了两个模块 master(主机) 和 slave(从机) ,并设计了顶层模块调用 master 和 slave ,使用了 进行了仿真。 从图 17和图 18 明显可知 ,当 master 的 drive 线置高电平且 r/w 线为低电平时 , IIC 模块运作 ,产生起始信号 Start ,且在 sda 线发送 8 位数据 ,且在 scl 线发送 9 个时 钟脉冲信号 ,等待 相应信号 mcf ,若 slave 响应 ,则 mcf 为高电平 ,继续发送下一字节数据 ,直到产生终止信号 Stop ,sda 线和 scl 线置高电平 ,发送数据终止 ,等待下一个起始信号 Start。 同样的 ,当 slave 的 drive 线置高电平时 , IIC 模块运作 ,r/w 线为 ’1’时接收数据功能启动。 当 mcf 为 ’1’时 ,slave 响应 master ,且在这时刻才能保证接收数据的准确性 ,当出现终止信号 Stop 时数据接收终止 ,等待下一个起始信号 Start。 图17 和图 18 准确反映了 master 发送 3 字节数据和 slave 准确接收 3 字节数据的功能。 图 17 master 时序仿真图 图 18 slave 时序仿真图 17 参考文献 [1] 夏宇闻 . Verilog 数字系统设计教程 [ M ] . 北京航空航天大学出版社 , 2020. [2] 何立民 . IIC 总线应用系统设计 [ M ] . 北京航空航天大学出版社 , 2020. [3] 吴继华 , 王诚 . Altera FP GA/ CPLD 设计 (高级篇 ) [ M ] . 人民邮电出版社 ,2020. [4] 路永坤.用 Verilog HDL 实现 IIC 总线功能[ J].:电子技术应用 , 2020. [5] IIC 总线规范[ E].:电子技术论坛, 2020. 18 附录 部分源代码 /************************************************************************************/ //IIC 接口时序模拟部分 module IIC_Interface_Bus( clk, rst_n, Syn_Sign, Byte_Write, Byte_Read, Page_Write, Page_Read, scl, sda, ackflag, outdata )。 /************************************************************************************/ //AT24C08 的地址和数据 , 根据硬件进行更改 . `define DEVICE_READ 839。 b1010_0001//被寻址器件地址(读操作) `define DEVICE_WRITE 839。 b1010_0000//被寻址器件地址(写操作) /******************************************************************** 19 ****************/ //写入 EEPROM 的数据 `define WRITE_DATA0 839。 d78//839。 b0110_0010 0x62 `define WRITE_DATA1 839。 d32//839。 b0010_0001 0x21 `define WRITE_DATA2 839。 d26//839。 b0100_0011 0x43 `define WRITE_DATA3 839。 d79//839。 b0110_0101 0x45 `define WRITE_DATA4 839。 d43//839。 b1000_0111 0x87 /************************************************************************************/ `define BYTE_ADDR 839。 b0000_0100 //要写入 /读出 EEPROM 的地址寄存器 /************************************************************************************/ /************************************************************************************/ input clk。 //50MHz input rst_n。 //复位信号,低电平有效 input Syn_Sign。 //同步信号 input Byte_Write, Byte_Read, Page_Write, Page_Read。 //按键 1 按下执行写入操作, 2 按下执行读操作, 3 按下执行连写操作 , 4 按下执行连读操作 output scl。 //AT24C08 的时钟端口 inout sda。 //AT24C08 的数据端口 20 output [2:0]ackflag。 //后面显示接收到数据的标志 output [7:0] outdata。 //数码管显示的数据 /************************************************************************************/ //分频部分 , 通过分频获取串行总线器件的时钟信号 reg[2:0] t。 //t=0:scl 上升沿, t=1:scl 高电平中间, t=2:scl 下降沿,t=3:scl 低电平中间 reg[8:0] t_delay。 //500 循环计数,产生 iic 所需要的时钟 100khz Max:400KHZ reg scl_r。 //时钟脉冲寄存器 parameter pre_t = 500。 // /************************************************************************************/ always @ (posedge clk or negedge rst_n) if(!rst_n) t_delay = 939。 d0。 else if(t_delay == 939。 d499) t_delay = 939。 d0。 //计数到 10us 为 scl 的周期,即 100KHz。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。