bidirectioneel I2C pinnetje in verilog, het lukt niet

voor een opensource project waar ik aan meewerk heb ik een stuk voorbeeldcode van terasic voor het interfacen van de I2C codec aan boord van de DE1 herschreven (I.V.M. copyright), maar het vervelende is: hij doet het niet. onderaan 2 linkjes voor hetdownloaden van het voorbeeldproject van terasic en mijn implementatie.
de module i2cinterface is de module die de initialisatiecode via I2C naar de codec stuurt. dit hoeft alleen 1 keer bij het opstarten te gebeuren. het rottige is nu dat de I2C_SDAT pin (de bidirectionele I2C data pin) de hele tijd laag blijft als ik kijk via signaltap, het lijkt dus alsof hij nooit in tristate gaat.

hoe zit het in elkaar: als de reset 0 wordt, start er een statemachientje dat 1 voor de 1 de waardes op het pinnetje I2Cdat zet, dit is de waarde die bij de I2C slave moet aankomen. dat werkt ook , dat draadje wordt ook 1.
als I2Cdat een waarde van 1 heeft wordt het pinnetje I2C_SDAT (de pin die naar de slave gaat) getristate, als hij waarde 0 heeft wordt I2C_SDAT 0.
het rottige is nu, als ik via signaltap kijk blijft I2C_SDAT de hele tijd 0.
hoe komt dit? ik kom er niet meer uit. het vreemde is dat als ik via signaltap naar het origineel van terasic kijk, dat het dan wel gewoon werkt en I2C_SDAT wordt daar ook 1 (tristate). wie ziet het verschil?


in allebei zit de signaltap kant en klaar ingebouwd.
het originele terasic project als zipje: klikkie

mijn versie: klikkerdeklik (alleen module i2cinterface hoort bij het initialisatiedeel, de rest is weer wat anders.)



een printscreen van de signaltap van het origineel, I2C_SDAT is de I2C data pin, SDO is het pinnetje wat de data aangeeft die op de data pin moet staan.


en de signaltap van mijn versie, hier is I2Cdat het draadje dat de gewenste waarde aangeeft.

[Bericht gewijzigd door DanielBakker op 2 juli 2009 18:26:30 (11%)]

Quidquid latine dictum sit, altum viditur
laat de statemachien 2 signalen genereren :

-signal_out is de data die je wilt plaatsen. ( de uitgang van je shifter in princiepe)
-drive is een signaal dat aangeeft dat JIJ aan het sturen bent
in rust ( als je de bus vrijgeeft moet je drive op 0 zetten ) , zolang je babbelt laat je drive hoog.

en dan heb je een klein combinatorisch blokje dat het werk doet.


code:

inout SDA;

...
always_comb
  if  (drive)  SDA <=signal_out
  else SDA <= 1'bz
end
[code]
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... 7,714,746 / 7,355,303 / 7,098,557 / 6,762,632
dit is heel vreemd! ik heb precies gedaan wat free zei en ik krijg hetzelfde resultaat!
Quidquid latine dictum sit, altum viditur
Quidquid latine dictum sit, altum viditur
Wat doet het in simulatie?

Niet gesimuleerd = fout.
weerstandjes er wel op hoop ik?
En heb je ook de betreffende pinnen als opendrain pins toegevoegd in Quartus? (assignment editor)