I tell you my experience to communicate with a I2C memory. I used 2 pins of the FPGA to communicate with the chip. One output for clock, and other bidirectional ( inout std_logic ) for data. The pin has an external pull-up and behaves like an open-collector as I2C needs.
First I wrote a component, based on a state machine, to send a byte to the memory. I used this component in other state machine to send some bytes, and make a complete trasaction of writing a byte in the memory. In a similar fashion a make a component to read a byte from the memory and used in the read operation.
You need a lot of pacience and a digital oscilloscope to debug this.