当我实现一个I2C从的时候,这里显示了一个问题。我的sda是一个入/出端口。在画面中用红色圈出的时间164ns处,从机将ack=1写入sda。之后,测试平台将数据写入sda,从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发布于 2016-01-04 08:11:09
根据您的duplicate post,我认为您进入READ_DATA状态还为时过早。添加另一个介于RW和READ_DATA之间的状态(ACK_R)。
ACK_R: begin
sda_reg <= 0;
sda_vin <= 1;
bus_state_next = READ_DATA;
end这将创建一个时钟周期,在该时钟周期中,无需SRAM读取数据即可执行ACK。如果您在其他地方设置了ACK信号,则应将其删除。你的计数器现在不应该数到9,而应该数到8。对于ACK_W也应该这样做。
https://stackoverflow.com/questions/34407734
复制相似问题