www.mikrocontroller.net

Forum: FPGA, VHDL & Co. I2C Softcore von OpenCore.org mit WISHBONE


Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich bin auf dem Gebiet der Softcores relativ neu. Habe etwas Erfahrung 
mit VHDL und will nun fertige Interfaces nutzen und konfigurieren.

Angefangen mit dem I2C Softcore von OpenCores.org, der Softcore ist ja 
laut Webseite sehr populär, vielleicht nutzt ihn ja auch jemand von 
euch.


Ich habe mir mal einen Tag Zeit genommen um mich einzuarbeiten und nun 
habe ich eine Hand voll fragen bezüglich des Cores an sich und dem 
WISHBONE Interface. Die Dokumente zu beiden habe ich natürlich im 
Vorfeld gelesen ;)

Ich hoffe ihr könnt mir weiterhelfen!


1. Bezogen auf WISHBONE:
So wie ich das verstanden habe ist WISHBONE ein standardisiertes 
Interface zur Verbindung unterschiedlicher Module und (auf VHDL bezogen) 
unterschiedlicher Entitys? An sich eine tolle Sache. Wie verbreitet ist 
denn WISHBONE? Lohnt es sich das genauer kennenzulernen oder ist das 
mehr so eine Randerscheinung?

2. Bezogen auf den I2C Softcore:
Man arbeitet mit dem Softcore ja indem man bestimmte Register beschreibt 
und liest. Soviel ist mir klar.
Funktioniert das dann so, wie ab Seite 47 der WISHBONE Spezification ( 
http://www.opencores.org/projects.cgi/web/wishbone... ) 
beschrieben? Kann ich damit mit [wb_adr_i] die Register des Softcores 
auswählen und dann lesen oder beschreiben (unter Einhaltung des gesamten 
Schreib/Lese Ablaufs)?

Und welche Register ich schreiben/lesen muss damit was zustande kommt 
kann ich ja dem Datenblatt für dem i2c-Softcore entnehmen, letzte 2 
Seiten.

3. Bezogen auf den I2C Softcore:
Im Konkreten binde ich die Top-Entity des Cores als Komponente in meine 
"Master"-Entity ein und steuere den Core dann über diese Entity und über 
das WISHBONE-Interface?



Ich glaube wenn das soweit stimmt hab ichs geschnallt und kann loslegen 
;)

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nutze den I2C-Softcore zwar (noch) nicht, aber vielleicht trotzdem 
zwei Sätze:

1. Richtig Wishbone ist für FPGAs sowas wie ISA bzw. PCI für PCs. Also 
eine standardisierte Busschnittstelle. Genutzt wird das wohl in vielen 
Projekten auf OpenCores. Im kommerziellen Umfeld wird es wohl u.a. vom 
Microblaze unterstützt.

Also wenn Du vorhast ein paar OpenCores-Sachen zu nutzen, ist ein 
bisschen Einarbeitung nicht verkehrt.

2. Ganz genau.

3. Genau. Und wenn etwas C-Quelltext dabei ist, kannst Du den gleich in 
Dein Programmverzeichniss verlinken/kopieren. Ein paar Anpassungen, an 
welcher Hardware-Adresse Dein Core zu finden ist und die Sache sollte 
laufen.

Rick

Autor: Timo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab das jetzt mal ausprobiert aber irgendwie funktioniert das 
überhaupt nicht so wie gewünscht.


Hier mal der Code für den Simulator:
        --Taktgenerator (50 MHz)
  clock : PROCESS
  BEGIN
    wb_clk_i <= '1';
    wait for 10 ns;
    wb_clk_i <= '0';
    wait for 10 ns;
  END PROCESS;
  
        --Reset Impuls zu Beginn erzeugen
  reset : PROCESS
  BEGIN
    wait for 20 ns;
    wb_rst_i <= '1';
    wait for 20 ns;
    wb_rst_i <= '0';
    wait;
  END PROCESS;
  
        --Prozess für das Schreiben von Daten
  data_write : PROCESS
  BEGIN
  wait for 100 ns;
  
        --Erster Schreibprozess
  --Clock Edge 0
  wb_adr_i <= "000";            -- Prescale-Register für SCL Takt
  wb_dat_i <= X"63";            -- Presclae Wert Hex 63
  wb_we_i <= '1';  
  wb_cyc_i <= '1';
  wb_stb_i <= '1';  
  
  wait for 20 ns;               -- Eine Clock-Periode warten
  --Clock Edge 1
  wb_stb_i <= '0';
  wb_cyc_i <= '0';  

  wait for 40 ns;               -- Etwas warten...
  
        --Zweiter Schreibprozess
  --Clock Edge 0
  wb_adr_i <= "011";            -- Transmit Register für Byte senden
  wb_dat_i <= X"A2";            -- Zu sendendes Byte (Slave Addr.)
  wb_cyc_i <= '1';
  wb_stb_i <= '1';  
  
  wait for 20 ns;              -- Eine Clock-Periode warten
  
  --Clock Edge 1
  wb_stb_i <= '0';
  wb_cyc_i <= '0';  
  
  wait for 40 ns;             -- Etwas warten...
  
        --Dritter Schreibprozess
  --Clock Edge 0
  wb_adr_i <= "100";          -- Command Register, STA u. WR Bit
  wb_dat_i <= X"90"; 
  wb_cyc_i <= '1';
  wb_stb_i <= '1';  
  
  wait for 20 ns;            -- Eine Clock-Periode warten
  
  --Clock Edge 1
  wb_stb_i <= '0';
  wb_cyc_i <= '0';  
  
        wait;  

  END PROCESS;

Und im Anhang findet sich die dazu entpsrechende Simulation.

Und dazu gehört wieder die WISHBONE Spezifikation Seite 49:
http://www.opencores.org/projects.cgi/web/wishbone...

Außerdem folgendes Beispiel aus dem I2C-Softcore Datenblatt 
(Ausschnitt), das oben in Code umgesetzt wurde. Ab 100ns wird dieses 
Beispiel umgesetzt:
Commands:
1) write 0xA2 (address + write bit) to Transmit Register, set STA bit, set WR bit.
-- wait for interrupt or TIP flag to negate --
2) read RxACK bit from Status Register, should be ‘0’.


Nun mir ist da jetzt einiges unklar...


1. Das ACK vom I2C Softcore dürfte eigentlich erst im 2. Takt (Clock 
Edge 1) kommen, es kommt aber immer schon beim 1. Takt (Clock Edge 
0)...??

2. Warum sendet der I2C Softcore bei [wb_dat_o] Daten?? Ich lese 
nirgends, dass es das tun soll, es würde mir auch nicht einleuchten 
warum. Zudem sind die Werte X"FF" und X"00" stark fehlerverdächtig.

3. Der Wert X"A2", der zu dem I2C-Softcore übertragen wird ist die 
Slave-Adresse (+ Write Bit). Diese sollte eigentlich über die 
I2C-Leitungen gesendet werden, aber diese bleiben total regungslos.

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zu 3.:
Wie lange simulierst Du?
Dir ist schon klar das I2C mit 100 kHz oder 400kHz abläuft und Du bei 50 
MHz Systemtakt etwas warten musst, eh da was rauskommt.

Hast Du eine echte Hardware zum Testen? Mit Oszi?

Rick

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend

Meinst du dass es soweit von der Programmierung stimmen müsste?

Ich habe eine echte Hardware zum Testen, habs an der aber noch nicht 
ausprobiert, da müsste ich das ganze erst synthesefähig machen, das habe 
ich noch nicht.
Wenn ich das machen würde ja, Logic Analyzer hätte ich da, Oszi könnte 
ich besorgen wenn nötig. Aber es muss ja auch durch die Simulation 
gehen, kann ja nicht sein.


Ich habe die Simulation sehr lange laufen lassen. Wie lange weis ich 
nicht aber ich glaube ca. 1,5s und es kam nichts. Binnen 1,5s sollte 
sich aber auf jeden Fall was regen.


Hat vielleicht jemand einen Codeschnippsel wie ihr das WISHBONE 
Interface ansteuert? Ich habe leider noch nie so eine Referenz gesehen 
und weis gar nicht ob das was ich hier mache stimmt oder grottenfalsch 
ist.

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Echte Hardware ist schon mal gut. Ich würde es einfach ausprobieren.
Man kann nämlich auch zu viel simulieren. Und eine Testbench ist zwar 
wichtig und gut, aber "echte" Signale sind manchmal eben doch anders, 
als die von der Testbench generierten.

Wer stößt bei Dir eigentlich die I2C-Kommunikation an? Eine 
State-Machine? Ein uC-SoftCore? Simulierst Du die mit?

Rick

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Das I2C Interface sollte nur testweise implementiert werden. Es gibt 
dazu weder Softcore noch eine FSM oder sowas in der Art.

Ich wollte gerade den Umgang mit Softcores und auch dem WISHBONE 
Interface lernen. Desshalb habe ich mir einen Core rausgesucht, dessen 
Tun ich bereits verstehe (in dem Fall das I2C Interface).

Wenn ich jetzt einen zusätzlichen Softcore einbinde komme ich keinen 
Schritt weiter, dann habe ich 2 Cores, die nicht funktionieren.

Evtl. werde ich mal eine FSM programmieren sobald ich wieder die 
Hardware vor mir habe. Aber ich glaube einfach nicht, dass es daran 
liegt. Vielmehr glaube ich, dass ich irgendetwas nicht beachtet habe und 
einen groben Denkfehler drin hab.

Desswegen wäre so ein "Referenzcodeschnippsel" zum WISHBONE auch so 
hilfreich. Damit ich zumindest das mal ausschließen kann. Bin immer noch 
auf der Suche danach ;)

Autor: Thomas R. (thomas9876)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

der Thread ist zwar schon etwas älter, ich stehe momentan aber vor dem 
selben Problem, dass ich nicht weiß, ob ich das WISHBONE Interface 
richtig ansteuere oder sonst einen Fehler mache.

Hat mittlerweile jmd. ein Codeschnipsel für die Ansteuerung des I2C 
Cores von opencores.org?

Ein Dankeschön im Voraus!


MFG

Thomas

Autor: Arndt Bußmann (Firma: Helion GmbH) (bussmann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Thomas,

bei Lattice (www.latticesemi.com) kannst Du kostenfrei den MICO32 
runterladen. Dieses Paket enthält den I2C Opencores Core mit Wishbone 
inkl, Doku und einigen Codebeispielen. Habe diese Komponenten dort auch 
benutzt, um den Wishbone näher kennenzulernen ;-)

Viele Grüße
Arndt

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Arndt,

danke für den Tipp!
Hab auf der Seite gleich noch einen I2C-Core gefunden, der besser 
geeignet ist!

Gruß
Thomas

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.