【问题标题】:verilog timing error happens in I2C designI2C设计中发生verilog时序错误
【发布时间】:2015-12-22 02:50:50
【问题描述】:

当我实现一个 I2C 从设备时,这里显示了一个问题。我的sda 是一个输入端口。在时间164ns,即图中红圈区域,从机将ack=1写入sda。之后,测试台将数据写入sda,从SRAM 读取sda。 但是,似乎红色圈出的区域也被SRAM读取,这使得SRAM在蓝色表示的区域的MSB中显示为1。在实践中,SRAM 应该从红圈区域之后的区域读取。导致此错误的原因可能是什么?

部分代码如下所示

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

【问题讨论】:

  • 请按“在此处输入图片描述”查看图片
  • ROM&lt;=DATA_IN_ROM; 是什么意思?似乎您正在根据cnt 值逐位填充SRAM,那么cnt 值增量在哪里?你能再贴一些代码吗?
  • READ_ADDR: 开始 // rw
  • 假设您正在推断寄存器(基于您使用&lt;=,因为没有足够的代码知道),您不需要任何signal&lt;=signal; 语句。

标签: verilog


【解决方案1】:

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

ACK_R: begin
  sda_reg <= 0;
  sda_vin <= 1;
  bus_state_next = READ_DATA; 
end

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    相关资源
    最近更新 更多