在I2C设计中发生verilog定时错误

时间:2015-12-22 02:50:51

标签: verilog

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

enter image description here

部分代码如下所示

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

1 个答案:

答案 0 :(得分:0)

根据您的duplicate post我认为您过早进入READ_DATA州。添加在ACK_RRW之间的另一个州(READ_DATA)。

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

这将创建一个时钟周期,在此时无需SRAM读取数据即可执行ACK。如果您已在其他位置设置了ACK信号,则应将其删除。您的计数器现在不应该计为9,而是计为8。这也应该针对ACK_W