首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >I2C设计中出现verilog时序错误

I2C设计中出现verilog时序错误
EN

Stack Overflow用户
提问于 2015-12-22 10:50:51
回答 1查看 111关注 0票数 2

当我实现一个I2C从的时候,这里显示了一个问题。我的sda是一个入/出端口。在画面中用红色圈出的时间164ns处,从机将ack=1写入sda。之后,测试平台将数据写入sda,从sda读取数据。然而,似乎红色圈出的区域也被SRAM读取,这使得SRAM在蓝色表示的区域中的MSB中显示1。实际上,SRAM应该从红色圆圈区域之后的区域读取。导致此错误的原因可能是什么?

下面是代码的一部分

代码语言:javascript
复制
READ_DATA:begin
    addr_x<=addr_x;
    ROM<=DATA_IN_ROM;      
    SRAM[SRAM_LEN-cnt]<=sda;  
end

READ_ADDR: begin // rw<=rw; 
    SRAM<=SRAM; 
    ROM<=DATA_IN_ROM; 
    addr_x[REG_LEN-cnt-1]<=sda; 
    cnt<=cnt+1; 
    sda_reg<=sda_reg; 
    sda_vid<=sda_vid; 
    freeze_cnt<= freeze_cnt; 
    freeze<=freeze; 
    rwcnt<=rwcnt; 
end
EN

回答 1

Stack Overflow用户

发布于 2016-01-04 08:11:09

根据您的duplicate post,我认为您进入READ_DATA状态还为时过早。添加另一个介于RWREAD_DATA之间的状态(ACK_R)。

代码语言:javascript
复制
ACK_R: begin
  sda_reg <= 0;
  sda_vin <= 1;
  bus_state_next = READ_DATA; 
end

这将创建一个时钟周期,在该时钟周期中,无需SRAM读取数据即可执行ACK。如果您在其他地方设置了ACK信号,则应将其删除。你的计数器现在不应该数到9,而应该数到8。对于ACK_W也应该这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34407734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档