在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 7258|回复: 10

[求助] 关于IIC通信协议的从机Verilog实现

[复制链接]
发表于 2017-8-30 00:00:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
大家好,本小白最近遇到一个搞不明白的问题。希望大神指点江山~      目前项目涉及到IIC通信协议,主机部分是实现发送8位器件地址,8位的寄存器地址,16位数据的读写。主机的功能通过一个EEPROM的行为模型仿真验证通过,但是行为模型不可以综合。项目里涉及到的主机由于是非标准IIC协议,就是发送字节的时序不是按照标准的IIC时序。相对应的从机也是根据非标准的IIC进行写的。目前遇到的主要问题是把主机修改成标准IIC协议时序,这一块的工作已经完成。
      亟待解决的问题是,从机代码修改。之前使用的从机主要是有两个问题需要解决:一,时序按照标准IIC主机进行修改。二,之前使用的从机代码用的是自己的晶振clk进行驱动,标准的IIC从机应该是根据主机发送过来的SCL进行数据流的控制,不要自己再加时钟。但是起始信号和终止信号,以及向主机发送应答信号和接受主机发送过来的应答信号该如何用SCL进行数据控制呢?如果是在SCL的上升沿就行数据的读取,SCL的下降沿进行SDA数据总线的数据变化,那么起始信号和结束信号如何用可综合的代码实现呢?
发表于 2017-8-30 16:38:20 | 显示全部楼层
之前也一直遇到这个问题,从机如果只有SCL时钟驱动的话,从机中所有信号肯定也是跟随SCL跳变的,包括SDA信号,这样就很难满足iic的时序要求了。一直不知道这块怎么解决,实际IIC项目中是只有SCL这一个时钟吗?忘大神解答
发表于 2017-8-31 17:40:55 | 显示全部楼层
标准的IIC主机和从机,都不会以SCL所为实际时钟去驱动逻辑。SCL和SDA的逻辑都是在另外的较高频率时钟下产生得到的。
发表于 2017-8-31 21:53:10 | 显示全部楼层
回复 3# 杰克淡定

原来如此,现在遇到的问题是i2c协议要求的scl和sda都是线与逻辑,但是这个线与逻辑verilog不好定义啊,我现在想把这个scl和sda定义为wand线型,这种线型可用于前仿真,但是不能综合,实际工程应该怎么做这一块呢?
发表于 2017-9-1 08:53:13 | 显示全部楼层
回复 4# renfz


   不论主从设备,SCL/SDA的PAD都做成开漏即可,这样在一个master多个slave的应用中就不会出现总线冲突了,不是你理解的那种线与。
发表于 2017-9-1 09:50:10 | 显示全部楼层
回复 5# 杰克淡定


  那如果前期写代码的时候我想看看仿真功能对不对,但是nc和modlesim都不能仿真这种开漏的器件啊,我要怎么看波形呢?
发表于 2017-9-10 12:41:05 | 显示全部楼层
If IIC used SCL as clock source only, it must use real gate IP cell and design as full custom way
发表于 2017-9-11 10:45:12 | 显示全部楼层
lsss讲的绝对了点,其实可以用scl作为时钟,但是复位信号要比较特殊,要用sda作为时钟来产生scl,opensource上有参考设计的,暂时找不到链接了, 给你贴部分代码

assign sas_resetn = scl | sda_in;
//I2C start
always @(negedge sda_in or negedge sas_resetn)
begin
    if(!sas_resetn)     i2c_start <= 1'b0;
    else if(scl)        i2c_start <= 1'b1;
    else                i2c_start <= 1'b0;
end

//I2C stop
always @(posedge sda_in or negedge sas_resetn)
begin
    if(!sas_resetn)     i2c_stop <= 1'b0;
    else if(scl)        i2c_stop <= 1'b1;
    else                i2c_stop <= 1'b0;
end

再用start和stop产生复位信号
assign comb_reset = i2c_start | i2c_stop ;
就可以用来复位scl做始终所驱动的逻辑了
 楼主| 发表于 2017-9-12 19:08:24 | 显示全部楼层
回复 8# joysymbol
非常的感谢,我现在对从机的思路还是很不明显。比如,根据标准的IIC协议,在主机对从机进行read操作的时候,需要有第二次的起始信号的检测,如果是这样的话和第一次的起始信号怎么分别呢?用状态机进行从机的描述还是数据流?状态机的话我从机的状态跳转就有些分不清楚,数据流的话我都算用计数器,对SCL的边沿进行计数,然后根据计数器进行数据的收发, 但是面对的问题是write和read计数器怎么弄?read的前几个字节和write是一样的,就是在第二次启动信号之后开始写入read控制字节,然后进行read从机的数据。这个计数器怎么弄?如果是用状态机的话,状态的跳转是基于scl还是基于sda呢?
发表于 2017-9-13 13:34:19 | 显示全部楼层
买夏宇闻的数字电路设计,有IIC设计的RTL设计验证实例,你看看就明白了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 20:49 , Processed in 0.027986 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表