www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Avalon Slave Read von HDL zu NIOS


Autor: Druide (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ich habe aktuell ein Problem das ich nicht ganz nachvollziehen kann, 
da ich das bereits in einem anderen Projekt genau auf die selbe Art 
gelöst hatte.

ich arbeite auf einem Altera NEEK Board und möchte den Altera Avalon 
Slave nutzen.

Hierzu habe ich ein eigene Verilogfile als Altera Avalon Slave 
eingebunden, mit WRITE,READ,ADDRESS, WRITEDATA und READDATA.

vom NIOS C++ in die Verilogfile schreiben funktioniert einwandfrei, nur 
lesen geht irgendwie nicht :(

hier mal mein C++ Code

//PICREADANDFIND_0_BASE ist die Base Adresse des eigenen HDL Blockes.

#define SCREENSHOT (0x02*4)
#define GRAY       (0x03*4)
#define THRESH   (0x04*4)
#define READOBJEKTX (0x06*4)
#define READOBJEKTY (0x07*4)
#define STARTFOUND (0x08*4)
#define START (0x09*4)

IOWR_32DIRECT(PICREADANDFIND_0_BASE,SCREENSHOT,0x00000001);
IOWR_32DIRECT(PICREADANDFIND_0_BASE,GRAY,0x00000001);
IOWR_32DIRECT(PICREADANDFIND_0_BASE,THRESH,0x00000001);

IOWR_32DIRECT(PICREADANDFIND_0_BASE,START,0x00000001);


 do{
    printf("|");
    start_found=IORD_32DIRECT(PICREADANDFIND_0_BASE,STARTFOUND);
    printf("startfound: %d\n",start_found);
    //nothing
 }while(start_found == 0);

BildX = IORD_32DIRECT(PICREADANDFIND_0_BASE,READOBJEKTX);
BildY = IORD_32DIRECT(PICREADANDFIND_0_BASE,READOBJEKTY);


im HDL habe ich in Verilog  geschrieben: (alles andere hab ich mal 
rausgelassen.)

module(
MYADDR,
MYWRITEDATA,
MYREADDATA,
MYWRITE,
MYREAD
);

input  [7:0]   MYADDR;
input  [31:0]   MYWRITEDATA;
input     MYWRITE;
input     MYREAD;

output  reg [31:0]   MYREADDATA;



parameter RGB_ADDR = 32'h00000001;
parameter SCREENSHOT = 32'h00000002;
parameter GRAY      = 32'h00000003;
parameter THRESH    = 32'h00000004;
parameter READOBJEKTX = 32'h00000006;
parameter READOBJEKTY = 32'h00000007;
parameter STARTFOUND = 32'h00000008;
parameter START = 32'h00000009;




always@ (posedge CLK50)
begin : AVALON_INTERFACE

  begin
    if(MYWRITE == 1'b1)
    begin
      case(MYADDR)
      SCREENSHOT: screenshotreg <= MYWRITEDATA[0];
      START:  getStart <= MYWRITEDATA[0];
      GRAY: Grayreg <= MYWRITEDATA[0];
      THRESH:  Threshreg <= MYWRITEDATA[0];
      default:;
      endcase
    end
    else if((MYREAD == 1'b1) )// && (MYDATAISREADY == 1'b1))
    begin
      case(MYADDR)

      READOBJEKTX:
      begin
        MYREADDATA <= {StartAdressX};

      end
      READOBJEKTY:
      begin
        MYREADDATA <= {32'hFFFFFFFF};
      end
      STARTFOUND:
      begin
        MYREADDATA <={31'h00,SetStart};

      end
      default: MYREADDATA <= 32'hFFFFFFFF;
      endcase
    end

was mich so extrem wundert selbst die daten von READOBJEKTY die ja ein 
fester wert sind werden nicht zugewiesen :(

alle anderen Daten werden von einem anderem Block integriert, laut 
SignalTap sind diese auch korrekt.

aber es werden wie gesagt garkeine Daten gelesen!
geschrieben werden alle Daten einwandfrei!

hat jemand da nen Tipp ???

in der neuen Komponente die ich erstellt habe sind die MYXXX natürlich 
auch auf die entsprechenden Avalon_Slave gesetzt

Autor: SeriousSam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was passiert denn, wenn du den Code ausführst? Bekommst du eine 
Endlosschleife? Hast du mal das Disassembly angeschaut, ob der Compiler 
da nicht etwas wegoptimiert? Ist der ReadWait Wert in der Component 
Description in SOPC Builder korrekt? Funktioniert ein einfaches Register 
mit lesen und schreiben?

Autor: Druide (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja er findet nie start found, auch wenn diese gesetzt wurde.

jetzt hab ichs hinbekommen das er ließt dafür schreibt er nimmer oder 
nur noch teilweise ... kapier das problem nicht ... hatte genau das 
gleiche bereits in einem anderen Projekt gemacht und da lief alles 
einwandfrei ... konnte lesen UND schreiben ... jetzt gehts nur noch 
teilweise... aktuell kann ich zumindest den Wert von RGB_ADDR (der steht 
da nicht drin) wieder auslesen. .. und kann GRAY und THRESH setzt dafür 
aber kein Screenshot und start mehr -.- kapier das alles net 
totalverwirrt bin

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute mal sehr stark, dass Du einfach Avalon-Slave TCL falsch 
gemacht hast. Also die Timings bzw. wann die DAten übernommen werden. 
Kontrollier doch mal bitte im SOPC-Builder, was bei dir drin steht 
(waitstates, ...) Deshalb klappt "WRITE" immer und lesen nicht, oder nur 
ab und zu. Vermutlich hast Du da zu wenige Waitstates eingefügt.

Grüße,
Kest

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.