PLAY_STORED_START has an immediate handoff that bypasses start-condition hold time
-- line 310-312
if sample_r.state = SAMPLE_START and cpu_scl_in = '1' then
v.state := CPU_HAS_BUS;
v.playback_done := '1';
CPU_HAS_BUS immediately clears dimm_sda_oe, releasing SDA. The start condition hold time (t_HD;STA, minimum 600 ns for Fast Mode) requires SDA to stay low while SCL is high for that duration. Releasing SDA after a single system clock cycle will not satisfy this hold time. We have a state ENSURE_PLAYBACK_HOLD that exists specifically to cover this gap but this path bypasses it.
Possible Fix: route through ENSURE_PLAYBACK_HOLD here too, same as the other branches.
Reproduced in simulation, not caught in hardware by me.
PLAY_STORED_STARThas an immediate handoff that bypasses start-condition hold timeCPU_HAS_BUSimmediately clearsdimm_sda_oe, releasing SDA. The start condition hold time (t_HD;STA, minimum 600 ns for Fast Mode) requires SDA to stay low while SCL is high for that duration. Releasing SDA after a single system clock cycle will not satisfy this hold time. We have a stateENSURE_PLAYBACK_HOLDthat exists specifically to cover this gap but this path bypasses it.Possible Fix: route through
ENSURE_PLAYBACK_HOLDhere too, same as the other branches.Reproduced in simulation, not caught in hardware by me.