CodiodeCodiode
Home
Problem Solving
Skill Tracks
My Assignments
Contests
Leaderboard
Community
Settings
Codiode/Problems/Sequential Logic

I2C ACK Generator

MediumLogic CircuitBuild

I2C buses rely on receivers acknowledging successful byte transfers to keep the data flowing. The receiver must pull the data line low at a precise moment to tell the transmitter to continue.

Design a synchronous sequence controller that triggers the acknowledge signal on the 9th clock pulse of a transfer. The circuit tracks the clock cycles following a start pulse and asserts the ack_pull output at the correct time.

Behavioral contract: * When rst is 1, the circuit enters an idle state. * When start is 1, the circuit begins a new transfer sequence at cycle 0. * While active (not idle), the circuit advances one cycle per clock. * The ack_pull output must be 1 during exactly cycle 9. * On cycle 10, the circuit must return to the idle state and wait for the next start pulse.

Constraints

  • All state elements must be synchronous to the rising edge of the clock.
  • Do not use asynchronous resets.
  • The circuit must hold its idle state indefinitely until start is asserted.

Topics

countersstate-machinei2c

Solve this problem

Place the gates, wire them up and watch the signals settle. Every submission runs on the same simulation engine that grades it.

This problem is part of Codiode Pro. The statement above is free to read.

Sign in to solveSee what Pro unlocks

The circuit builder and code editor need a desktop screen. On a phone, read the problem here and open it on a laptop to solve.

Related problems

  • 3-bit Ripple Counter from Toggle Flip-FlopsEasy
  • D Latch from a 2:1 MUXEasy
  • 2-bit Ring CounterEasy
  • T Flip-Flop from a D Flip-FlopEasy
  • Handshake Deadlock Due to Early ResetHard
  • Reconvergence of Individually Synchronized BitsHard
  • Debug: Asynchronous Clear GlitchHard
  • Clock Gate Enable Crossing DomainsHard

Browse all problems · Learning tracks